o
    NiE                     @  s   d Z ddlmZ ddlZddl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 erVddlmZ ddlmZ ddlmZ ddlmZ eeZ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cast)nodes)ElementNode)addnodes)__)logging)get_node_line)Inliner)ObjectDescription)BuildEnvironment)TextlikeNodenodenodes.field_bodyreturnboolc                 C  sP   t | dkrdS t | dkr | dd D ]}t|tjs dS qt| d tjS )zCTrue if the node only contains one paragraph (and system messages).r   F   N)len
isinstancer   system_message	paragraph)r   subnode r   I/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/util/docfields.py_is_single_paragraph   s   r   c                   @  sz   e Zd ZdZdZdZ					d2d3ddZejddddfd4d!d"Z	ejddddfd5d$d%Z
d6d)d*Z			d7d8d0d1ZdS )9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namestrnamestuple[str, ...]labelhas_argr   rolenamebodyrolenamer   Nonec                 C  s(   || _ || _|| _|| _|| _|| _d S N)r    r"   r$   r%   r&   r'   )selfr    r"   r$   r%   r&   r'   r   r   r   __init__:   s   	
zField.__init__Ndomaintarget	innernodetype[TextlikeNode]contnodeNode | NoneenvBuildEnvironment | NoneinlinerInliner | NonelocationElement | Noner   c	                 C  s,  |d usJ |d u |d u ksJ ||f|s|p|||S | ||}	|	d u s-|d u ra|	d u rD|d urDtd}
tjt|
|||d tjd|d||d}||pU|||7 }| || |S d}|d urt	t
 t|}W d    n1 s{w   Y  |	|||||i g \}}tj|dg|R  S )Nz]Problem in %s domain: field is supposed to use role '%s', but that role is not in the domain.)r6   r   F)	refdomainrefexplicitreftype	reftarget)
get_domainroler
   loggerwarningr	   pending_xrefprocess_field_xref
contextlibsuppress
ValueErrorr   r   inline)r*   r&   r,   r-   r.   r0   r2   r4   r6   r>   msgrefnodelinenonsmessagesr   r   r   	make_xrefJ   s8   
zField.make_xref
list[Node]c	           	   
   C  s   |  ||||||||gS r)   )rL   )	r*   r&   r,   r-   r.   r0   r2   r4   r6   r   r   r   
make_xrefsu   s   zField.make_xrefsfieldargcontenttuple[str, list[Node]]c                 C  s   ||fS r)   r   )r*   rO   rP   r   r   r   
make_entry   s   zField.make_entrytypesdict[str, list[Node]]itemtuplenodes.fieldc                 C  s   |\}}t d| j}	|r%|	t d7 }	|	| j| j||t j|||d t|dkr`t|d t jsMt|d t j	r`t|d dkr`t|d d t jr`| j| j
||d  |d |||d}t dt jddg|R  }
t d|	|
S )Nr    r2   r4   r6   r   r   )r0   r2   r4   r6   )r   
field_namer$   TextextendrN   r&   r   r   rF   r'   astext
field_bodyr   field)r*   rS   r,   rU   r2   r4   r6   rO   rP   	fieldname	fieldbodyr   r   r   
make_field   sD   	
	zField.make_field)r   r   Tr   r   )r    r!   r"   r#   r$   r!   r%   r   r&   r!   r'   r!   r   r(   )r&   r!   r,   r!   r-   r!   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r   r   )r&   r!   r,   r!   r-   r!   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r   rM   )rO   r!   rP   rM   r   rQ   NNN)rS   rT   r,   r!   rU   rV   r2   r3   r4   r5   r6   r7   r   rW   )__name__
__module____qualname____doc__
is_groupedis_typedr+   r	   literal_emphasisrL   rN   rR   rb   r   r   r   r   r   )   s6    0
r   c                      sH   e Zd ZdZdZejZ				d!d" fddZ			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&   can_collapser   r   r(   c                   s   t  |||d| || _d S )NT)superr+   rl   )r*   r    r"   r$   r&   rl   	__class__r   r   r+      s   
zGroupedField.__init__NrS   rT   r,   itemsrV   r2   r3   r4   r5   r6   r7   rW   c                 C  s   t d| j}|  }|D ],\}	}
t  }|| j| j||	tj	|||d |t 
d7 }||
7 }|t d|7 }qt|dkrZ| jrZtt j|d }t d|d }t d||S t d|}t d||S )Nr   rY    -- r   r   )r   rZ   r$   	list_typer   r\   rN   r&   r	   literal_strongr[   	list_itemr   rl   r   r^   r_   )r*   rS   r,   rp   r2   r4   r6   r`   listnoderO   rP   parrt   ra   r   r   r   rb      s0   	zGroupedField.make_field)r   r   r   F)r    r!   r"   r#   r$   r!   r&   r!   rl   r   r   r(   rc   rS   rT   r,   r!   rp   rV   r2   r3   r4   r5   r6   r7   r   rW   )rd   re   rf   rg   rh   r   bullet_listrr   r+   rb   __classcell__r   r   rn   r   rk      s    rk   c                      sF   e Zd ZdZdZ						d#d$ fddZ			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#   	typenamesr$   r&   typerolenamerl   r   r   r(   c                   s$   t  ||||| || _|| _d S r)   )rm   r+   r{   r|   )r*   r    r"   r{   r$   r&   r|   rl   rn   r   r   r+     s   

zTypedField.__init__NrS   rT   r,   rp   rV   r2   r3   r4   r5   r6   r7   rW   c                   s   d fdd}t d	j}t|d
kr(jr(|d \}	}
||	|
}n }|D ]\}	}
|t d	||	|
7 }q.t d	|}t d	||S )NrO   r!   rP   rM   r   nodes.paragraphc                   s   t  }|jj | tjd | v rT|t d7 }| }t	|dkrIt
|d t jrI|d  }|jj |tjd n||7 }|t d7 }tdd |D }|rj|t d	7 }||7 }|S )
N)r2   z (r   r   rY   )c                 s  s    | ]	}|   V  qd S r)   )r]   strip).0cr   r   r   	<genexpr>B  s    z=TypedField.make_field.<locals>.handle_item.<locals>.<genexpr>rq   )r   r   r\   rN   r&   r	   rs   r[   popr   r   r]   r|   rj   any)rO   rP   rv   	fieldtypetypenamehas_contentr,   r2   r4   r6   r*   rS   r   r   handle_item%  s:   
z*TypedField.make_field.<locals>.handle_itemr   r   r   )rO   r!   rP   rM   r   r}   )	r   rZ   r$   r   rl   rr   rt   r^   r_   )r*   rS   r,   rp   r2   r4   r6   r   r`   rO   rP   bodynodera   r   r   r   rb     s   	#zTypedField.make_field)r   r   r   r   r   F)r    r!   r"   r#   r{   r#   r$   r!   r&   r!   r|   r!   rl   r   r   r(   rc   rw   )rd   re   rf   rg   ri   r+   rb   ry   r   r   rn   r   rz      s    rz   c                   @  s8   e Zd ZU dZded< ddd	ZdddZ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]]typemap	directiver   r   r(   c                 C  s   || _ | | _d S r)   )r   get_field_type_mapr   )r*   r   r   r   r   r+   \  s   zDocFieldTransformer.__init__r   addnodes.desc_contentc                 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_alla  s
   
z!DocFieldTransformer.transform_allnodes.field_listc           "   
   C  s  | j }g }i }i }tttj |D ]|}t|dksJ ttj|d }ttj|d }z| 	dd\}	}
W n t
yH   | d}	}
Y nw ||	d\}}t|rattj|d }|j}n|j}|du so|jt|
kr|	dd  |	dd  }|
r|d|
 7 }t||d< || |r|r|rt|dkrt|d tjrtt|}|d  }|j|j| jjpd||d | jjjjjd}t|rttj|d }|  || n|  |tjddg|R  7 }q|j }|rd	d
 |D }|r||!|i |
< q|j"r-z
|
#dd\}}W n
 t
y   Y nw t|g|!|i |< |}
tj$|j%dd}|j&j|_|j&j'|_'|j&j(|_(||7 }|j)r||v r`tt*t+tt,f |||  }nt|||< |g |f}|| |-|
|g}|d | q|-|
|g}||||f qt. }|D ]<}t|tjr||7 }q|\}}}||j i }| jjjjj}| jjj/} | jjpd}!||j0||!||| |d7 }q|1| dS )z%Transform a single field list *node*.   r   r   Nr   )NNrX   )r0   r2   c                 S  s"   g | ]}t |tjtjB r|qS r   )r   r   Inliner[   )r   nr   r   r   
<listcomp>  s
    z1DocFieldTransformer.transform.<locals>.<listcomp>T)translatablerY   )2r   r   listr   r_   r   rZ   r^   r]   splitrE   getr   r   childrenr%   r   upperr[   appendr   rz   rN   r|   r   r,   statedocumentsettingsr2   clearr\   r    
setdefaultri   rsplitrF   	rawsourceparentsourcelinerh   rV   r   r   rR   r   r4   rb   replace_self)"r*   r   r   entriesgroupindicesrS   r_   rZ   r^   fieldtype_namerO   typedescis_typefieldr   rP   new_fieldnametyped_fieldr-   xrefsr   argtypeargnametranslatable_contentgroup	new_entrynew_listentryr   rp   r6   
fieldtypesr2   r4   r,   r   r   r   r   h  s   










	zDocFieldTransformer.transformN)r   r   r   r(   )r   r   r   r(   )r   r   r   r(   )rd   re   rf   rg   __annotations__r+   r   r   r   r   r   r   r   T  s   
 

r   )r   r   r   r   )%rg   
__future__r   rC   typingr   r   r   docutilsr   docutils.nodesr   r   sphinxr	   sphinx.localer
   sphinx.utilr   sphinx.util.nodesr   docutils.parsers.rst.statesr   sphinx.directivesr   sphinx.environmentr   sphinx.util.typingr   	getLoggerrd   r?   r   r   rk   rz   r   r   r   r   r   <module>   s,    

 A\