U
    \ShA                     @  s  d Z ddlmZ ddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ erddlmZ ee Z!dddddZ"G dd dZ#G dd de#Z$G dd de$Z%G dd dZ&dS )zUtility code for "Doc fields".

"Doc fields" are reST field lists in object descriptions that will
be domain-specifically transformed to a more appealing presentation.
    )annotationsN)TYPE_CHECKINGAnyListTuplecast)nodes)ElementNode)Inliner)addnodes)BuildEnvironment)__)logging)get_node_line)TextlikeNode)ObjectDescriptionznodes.field_bodyboolnodereturnc                 C  sX   t | dkrdS t | dkr@| dd D ]}t|tjs( dS q(t| d tjrTdS dS )zCTrue if the node only contains one paragraph (and system messages).r   F   NT)len
isinstancer   Zsystem_message	paragraph)r   Zsubnode r   H/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/util/docfields.py_is_single_paragraph   s    r   c                   @  s   e Zd ZdZdZdZd$ddddddd	d
ddZejddddfdddddddddd	ddZ	ejddddfdddddddddd	ddZ
ddddddZd%ddddddd d!d"d#ZdS )&Fielda  A doc field that is never grouped.  It can have an argument or not, the
    argument can be linked using a specified *rolename*.  Field should be used
    for doc fields that usually don't occur more than once.

    The body can be linked using a specified *bodyrolename* if the content is
    just a single inline or text node.

    Example::

       :returns: description of the return value
       :rtype: description of the return type
    Fr    Tstrtuple[str, ...]r   None)namenameslabelhas_argrolenamebodyrolenamer   c                 C  s(   || _ || _|| _|| _|| _|| _d S N)r#   r$   r%   r&   r'   r(   )selfr#   r$   r%   r&   r'   r(   r   r   r   __init__9   s    	zField.__init__Nztype[TextlikeNode]zNode | NoneBuildEnvironment | NoneInliner | NoneElement | Noner
   )	r'   domaintarget	innernodecontnodeenvinlinerlocationr   c	              	   C  s  |d k	st |d k|d kks(t ||f|s:|p8|||S |||}	|	d ksZ|d kr|	d kr|d k	rtd}
tjt|
|||d tjd|d||d}||p|||7 }||| |S d}|d k	rt	
t t|}W 5 Q R X |	|||||i g \}}tj|df| S )Nz]Problem in %s domain: field is supposed to use role '%s', but that role is not in the domain.)r5   r   F)Z	refdomainZrefexplicitZreftypeZ	reftarget)AssertionErrorZ
get_domainroler   loggerwarningr   Zpending_xrefZprocess_field_xref
contextlibsuppress
ValueErrorr   r   inline)r*   r'   r/   r0   r1   r2   r3   r4   r5   r8   msgZrefnodelinenonsmessagesr   r   r   	make_xrefI   s,    
 zField.make_xrefz
list[Node]c	           	   
   C  s   |  ||||||||gS r)   )rC   )	r*   r'   r/   r0   r1   r2   r3   r4   r5   r   r   r   
make_xrefsf   s
      zField.make_xrefsztuple[str, list[Node]]fieldargcontentr   c                 C  s   ||fS r)   r   )r*   rF   rG   r   r   r   
make_entryn   s    zField.make_entrydict[str, list[Node]]tuplenodes.field)typesr/   itemr3   r4   r5   r   c                 C  s   |\}}t d| j}	|rJ|	t d7 }	|	| j| j||t j|||d t|dkrt|d t jst|d t j	rt|d dkrt|d d t jr| j| j
||d  |d |||d}t dt jd| }
t d|	|
S )Nr    r3   r4   r5   r   r   )r2   r3   r4   r5   )r   r   )r   
field_namer%   TextextendrD   r'   r   r   r>   r(   astext
field_bodyr   field)r*   rL   r/   rM   r3   r4   r5   rF   rG   	fieldname	fieldbodyr   r   r   
make_fieldq   s:    	   

   zField.make_field)r   r   Tr   r   )NNN)__name__
__module____qualname____doc__
is_groupedis_typedr+   r   literal_emphasisrC   rD   rH   rX   r   r   r   r   r   )   s4                 r   c                	      sX   e Zd ZdZdZejZddddddd	d
 fddZdddddddddddZ	  Z
S )GroupedFielda  
    A doc field that is grouped; i.e., all fields of that type will be
    transformed into one field with its body being a bulleted list.  It always
    has an argument.  The argument can be linked using the given *rolename*.
    GroupedField should be used for doc fields that can occur more than once.
    If *can_collapse* is true, this field will revert to a Field if only used
    once.

    Example::

       :raises ErrorClass: description when it is raised
    Tr   r   Fr    r!   r   r"   )r#   r$   r%   r'   can_collapser   c                   s   t  |||d| || _d S )NT)superr+   ra   )r*   r#   r$   r%   r'   ra   	__class__r   r   r+      s    zGroupedField.__init__NrI   rJ   r,   r-   r.   rK   rL   r/   itemsr3   r4   r5   r   c                 C  s   t d| j}|  }|D ]X\}	}
t  }|| j| j||	tj	|||d |t 
d7 }||
7 }|t d|7 }qt|dkr| jrtt j|d }t d|d }t d||S t d|}t d||S )Nr   rO    -- r   r   )r   rP   r%   	list_typer   rR   rD   r'   r   literal_strongrQ   	list_itemr   ra   r   rT   rU   )r*   rL   r/   rf   r3   r4   r5   rV   ZlistnoderF   rG   parrj   rW   r   r   r   rX      s&    	  zGroupedField.make_field)r   r   r   F)NNN)rY   rZ   r[   r\   r]   r   Zbullet_listrh   r+   rX   __classcell__r   r   rc   r   r`      s       
   r`   c                
      sV   e Zd ZdZdZddddddddd	d
 fddZdddddddddddZ  ZS )
TypedFieldaa  
    A doc field that is grouped and has type information for the arguments.  It
    always has an argument.  The argument can be linked using the given
    *rolename*, the type using the given *typerolename*.

    Two uses are possible: either parameter and type description are given
    separately, using a field from *names* and one from *typenames*,
    respectively, or both are given using a field from *names*, see the example.

    Example::

       :param foo: description of parameter foo
       :type foo:  SomeClass

       -- or --

       :param SomeClass foo: description of parameter foo
    Tr   r   Fr    r!   r   r"   )r#   r$   	typenamesr%   r'   typerolenamera   r   c                   s$   t  ||||| || _|| _d S r)   )rb   r+   rn   ro   )r*   r#   r$   rn   r%   r'   ro   ra   rc   r   r   r+      s    
zTypedField.__init__NrI   rJ   r,   r-   r.   rK   re   c                   s   dddd fdd}t dj}t|dkrXjrX|d \}	}
||	|
}n, }|D ]\}	}
|t d||	|
7 }qdt d|}t d||S )	Nr    znodes.paragraphrE   c                   s   t  }|jj | tjd | kr|t d7 }| }t	|dkrt
|d t jr|d  }|jj |tjd n||7 }|t d7 }|t d7 }||7 }|S )N)r3   z (r   r   rO   )rg   )r   r   rR   rD   r'   r   ri   rQ   popr   r   rS   ro   r_   )rF   rG   rk   	fieldtypetypenamer/   r3   r4   r5   r*   rL   r   r   handle_item   s*     
  
z*TypedField.make_field.<locals>.handle_itemr   r   r   )	r   rP   r%   r   ra   rh   rj   rT   rU   )r*   rL   r/   rf   r3   r4   r5   ru   rV   rF   rG   ZbodynoderW   r   rt   r   rX      s    	 zTypedField.make_field)r   r   r   r   r   F)NNN)rY   rZ   r[   r\   r^   r+   rX   rl   r   r   rc   r   rm      s         "   rm   c                   @  sJ   e Zd ZU dZded< dddddZd	dd
ddZddd
ddZdS )DocFieldTransformerz
    Transforms field lists in "doc field" syntax into better-looking
    equivalents, using the field type definitions given on a domain.
    zdict[str, tuple[Field, bool]]typemapr   r"   )	directiver   c                 C  s   || _ | | _d S r)   )rx   Zget_field_type_maprw   )r*   rx   r   r   r   r+     s    zDocFieldTransformer.__init__zaddnodes.desc_contentr   c                 C  s$   |D ]}t |tjr| | qdS )z,Transform all field list children of a node.N)r   r   
field_list	transform)r*   r   childr   r   r   transform_all  s    z!DocFieldTransformer.transform_allznodes.field_listc           "   
   C  s  | j }g }i }i }tttj |D ]}t|dks8tttj|d }ttj|d }z|	 
dd\}	}
W n" tk
r   |	 d }	}
Y nX ||	d\}}t|rttj|d }|j}n|j}|dks|jt|
kr|	dd  |	dd  }|
r|d|
 7 }t||d< || |r"|r"|r"t|dkr"t|d tjr"tt|}|d 	 }|j|j| jjpzd||d | jjjjjd}t|rttj|d }|  | | q"|  |tjd| 7 }q"|j!}|rd	d
 |D }|r"||"|i |
< q"|j#r^z|
$dd\}}W n tk
r@   Y nX t|g|"|i |< |}
tj%|j&dd}|j'j|_|j'j(|_(|j'j)|_)||7 }|j*r||krtt+t,tt-f |||  }n t|||< |g |f}|| |.|
|g}|d | q"|.|
|g}||||f q"t/ }|D ]v}t|tjrJ||7 }nX|\}}}||j!i }| jjjjj}| jjj0} | jjpd}!||j1||!||| |d7 }q.|2| dS )z%Transform a single field list *node*.   r   r   Nr   )NNrN   )r2   r3   c                 S  s"   g | ]}t |tjtjfr|qS r   )r   r   ZInlinerQ   ).0nr   r   r   
<listcomp>b  s      z1DocFieldTransformer.transform.<locals>.<listcomp>T)ZtranslatablerO   )r   r   )3rw   r   r   r   rU   r   r7   rP   rT   rS   splitr=   getr   r   childrenr&   r   upperrQ   appendr   rm   rD   ro   rx   r/   stateZdocumentsettingsr3   clearrR   r#   
setdefaultr^   rsplitr>   Z	rawsourceparentsourceliner]   r   r   r
   rH   ry   r4   rX   Zreplace_self)"r*   r   rw   entriesZgroupindicesrL   rU   rP   rT   Zfieldtype_namerF   ZtypedescZis_typefieldr   rG   Znew_fieldnameZtyped_fieldr0   Zxrefsrs   ZargtypeargnameZtranslatable_contentgroupZ	new_entryZnew_listentryrr   rf   r5   Z
fieldtypesr3   r4   r/   r   r   r   rz      s    













  zDocFieldTransformer.transformN)rY   rZ   r[   r\   __annotations__r+   r|   rz   r   r   r   r   rv     s
   
rv   )'r\   
__future__r   r;   typingr   r   r   r   r   Zdocutilsr   Zdocutils.nodesr	   r
   Zdocutils.parsers.rst.statesr   Zsphinxr   Zsphinx.environmentr   Zsphinx.localer   Zsphinx.utilr   Zsphinx.util.nodesr   Zsphinx.util.typingr   Zsphinx.directivesr   	getLoggerrY   r9   r   r   r`   rm   rv   r   r   r   r   <module>   s(   
d2N