
    FeA                    0   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rddlmZ ddlmZ ddlmZ ddlmZ  ej:                  e      ZddZ  G d d      Z! G d de!      Z" G d de"      Z# G d d      Z$y)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)TextlikeNodec                    t        |       dk(  ryt        |       dkD  r&| dd D ]  }t        |t        j                        r y t        | d   t        j                        ryy)zCTrue if the node only contains one paragraph (and system messages).r   F   NT)len
isinstancer   system_message	paragraph)nodesubnodes     7/usr/lib/python3/dist-packages/sphinx/util/docfields.py_is_single_paragraphr      s]    
4yA~	TQABx 	Ggu';';<	 $q'5??+    c                      e Zd ZdZdZdZ	 	 	 	 	 d		 	 	 	 	 	 	 	 	 	 	 	 	 d
dZej                  ddddf	 	 	 	 	 	 	 	 	 	 	 ddZ	ej                  ddddf	 	 	 	 	 	 	 	 	 	 	 ddZ
ddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)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
    Fc                X    || _         || _        || _        || _        || _        || _        y N)namenameslabelhas_argrolenamebodyrolename)selfr!   r"   r#   r$   r%   r&   s          r   __init__zField.__init__:   s/     	

 (r   Nc	           	     X   |J |d u |d u k(  s	J ||f       |s|xs	  |||      S |j                  |      j                  |      }	|	|}|	/|-t        d      }
t        j	                  t        |
      |||       t        j                  d|d||      }||xs	  |||      z  }|j                  |      j                  |       |S d}|-t        j                  t              5  t        |      }d d d         |	|||||i g       \  }}t        j                  |dg| S # 1 sw Y   1xY w)Nz]Problem in %s domain: field is supposed to use role '%s', but that role is not in the domain.)location F)	refdomainrefexplicitreftype	reftarget)
get_domainroler   loggerwarningr
   pending_xrefprocess_field_xref
contextlibsuppress
ValueErrorr   r   inline)r'   r%   domaintarget	innernodecontnodeenvinlinerr*   r2   msgrefnodelinenonsmessagess                  r   	make_xrefzField.make_xrefJ   sQ   
 4X%56K(8KK68y88 ~~f%**84<7?| 3 Q Rr#w8L++B&e4<PGx<9VV#<<GNN6"55g>N$$Z0 1&x01Hfffgr2NH||FB,,,1 1s   $D  D)c	           
     4    | j                  ||||||||      gS r    )rF   )	r'   r%   r;   r<   r=   r>   r?   r@   r*   s	            r   
make_xrefszField.make_xrefsg   s+    
 xH"GX7 8 	8r   c                
    ||fS r     )r'   fieldargcontents      r   
make_entryzField.make_entryo   s    '""r   c                   |\  }}t        j                  d| j                        }	|rW|	t        j                  d      z  }	|	j	                  | j                  | j                  ||t         j                  |||             t        |      dk(  rt        |d   t         j                        sNt        |d   t         j                        rgt        |d         dk(  rVt        |d   d   t         j                        r6| j                  | j                  ||d   j                         |d   |||      }t        j                  dt        j                  ddg|       }
t        j                  d|	|
      S )Nr+    r?   r@   r*   r   r   )r>   r?   r@   r*   )r   
field_namer#   TextextendrH   r%   r   r   r:   r&   astext
field_bodyr   field)r'   typesr;   itemr?   r@   r*   rK   rL   	fieldname	fieldbodys              r   
make_fieldzField.make_fieldr   s;    !'$$R4	C(IT__T]]F-5uzz14gPX - Z [ w<171:uzz2GAJ5#gaj/Q:NGAJqM5::6ood&7&7&-aj&7&7&9GAJ*-w & SG $$RR)J')JK	{{2y)44r   )rJ   r+   Tr+   r+   )r!   strr"   tuple[str, ...]r#   r\   r$   boolr%   r\   r&   r\   returnNone)r%   r\   r;   r\   r<   r\   r=   type[TextlikeNode]r>   Node | Noner?   BuildEnvironment | Noner@   Inliner | Noner*   Element | Noner_   r	   )r%   r\   r;   r\   r<   r\   r=   ra   r>   rb   r?   rc   r@   rd   r*   re   r_   
list[Node])rK   r\   rL   rf   r_   ztuple[str, list[Node]]NNN)rW   dict[str, list[Node]]r;   r\   rX   tupler?   rc   r@   rd   r*   re   r_   nodes.field)__name__
__module____qualname____doc__
is_groupedis_typedr(   r
   literal_emphasisrF   rH   rM   r[   rJ   r   r   r   r   *   sk    JH
 "$)) ) 	)
 ) ) ) 
)" 3;2K2K*.t,0T-/-'-5L- *- =K- W[-< 4<3L3L+/PT-1d808(86M8 +8 >L8 #	8# (,"&#'5$5 5 	5
 %5  5 !5 
5r   r   c                  z     e Zd ZdZdZej                  Z	 	 d	 	 	 	 	 d fdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 x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
    Tc                :    t         |   |||d|       || _        y )NT)superr(   can_collapse)r'   r!   r"   r#   r%   rv   	__class__s         r   r(   zGroupedField.__init__   s     ueT8<(r   c                   t        j                  d| j                        }| j                         }|D ]  \  }	}
t        j                         }|j                  | j                  | j                  ||	t        j                  |||             |t        j                  d      z  }||
z  }|t        j                  d|      z  } t        |      dk(  rY| j                  rMt        t         j                  |d         }t        j                  d|d         }t        j                   d||      S t        j                  d|      }t        j                   d||      S )Nr+   rP    -- r   r   )r   rQ   r#   	list_typer   rS   rH   r%   r
   literal_strongrR   	list_itemr   rv   r   rU   rV   )r'   rW   r;   itemsr?   r@   r*   rY   listnoderK   rL   parr|   rZ   s                 r   r[   zGroupedField.make_field   s(    $$R4	>>#!& 	1Hg//#CJJtt}}fh'/'>'>+.( ' T U 5::f%%C7NCC00H	1 u:?t00U__hqk:I((Yq\:I;;r9i88$$R2	{{2y)44r   )rJ   r+   r+   F)r!   r\   r"   r]   r#   r\   r%   r\   rv   r^   r_   r`   rg   rW   rh   r;   r\   r}   ri   r?   rc   r@   rd   r*   re   r_   rj   )rk   rl   rm   rn   ro   r   bullet_listrz   r(   r[   __classcell__rw   s   @r   rs   rs      s     J!!ILN:?))37)DH) (,"&#'5$5 5 	5
 %5  5 !5 
5r   rs   c                  ~     e Zd ZdZdZ	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ x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
    Tc                H    t         |   |||||       || _        || _        y r    )ru   r(   	typenamestyperolename)	r'   r!   r"   r   r#   r%   r   rv   rw   s	           r   r(   zTypedField.__init__   s)     	ueX|D"(r   c           	         d fd}t        j                  d j                        }t        |      dk(  r j                  r|d   \  }	}
 ||	|
      }n: j                         }|D ]%  \  }	}
|t        j                  d ||	|
            z  }' t        j                  d|      }t        j                  d||      S )Nc                t   t        j                         }|j                  	j                  	j                  | t
        j                               | 
v r|t        j                  d      z  }
j                  |       }t        |      dk(  rpt        |d   t         j                        rS|d   j                         }|j                  	j                  	j                  |t
        j                               n||z  }|t        j                  d      z  }|t        j                  d      z  }||z  }|S )N)r?   z (r   r   rP   )ry   )r   r   rS   rH   r%   r
   r{   rR   popr   r   rT   r   rq   )rK   rL   r   	fieldtypetypenamer;   r?   r@   r*   r'   rW   s        r   handle_itemz*TypedField.make_field.<locals>.handle_item   s   //#CJJtt}}fh'/'>'>C ' I J5 uzz$'' "IIh/	y>Q&:ilEJJ+O(|224HJJtt/@/@&(/7/H/Hc7>  /  S T 9$Cuzz#&5::f%%C7NCJr   r+   r   r   )rK   r\   rL   r\   r_   znodes.paragraph)	r   rQ   r#   r   rv   rz   r|   rU   rV   )r'   rW   r;   r}   r?   r@   r*   r   rY   rK   rL   bodynoderZ   s   ``` ```      r   r[   zTypedField.make_field   s    	 	, $$R4	u:?t00 %aHg(7;H~~'H%* P!'EOOBHg0NOOP$$R2	{{2y)44r   )rJ   rJ   r+   r+   r+   F)r!   r\   r"   r]   r   r]   r#   r\   r%   r\   r   r\   rv   r^   r_   r`   rg   r   )rk   rl   rm   rn   rp   r(   r[   r   r   s   @r   r   r      s    $ H
 "$%'")) ) #	)
 ) ) ) ) 
)& (,"&#'(5$(5 (5 	(5
 %(5  (5 !(5 
(5r   r   c                  4    e Zd ZU dZded<   ddZd	dZd
dZy)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]]typemapc                <    || _         |j                         | _        y r    )	directiveget_field_type_mapr   )r'   r   s     r   r(   zDocFieldTransformer.__init__  s    " 335r   c                j    |D ].  }t        |t        j                        s| j                  |       0 y)z,Transform all field list children of a node.N)r   r   
field_list	transform)r'   r   childs      r   transform_allz!DocFieldTransformer.transform_all  s/      	&E%!1!12u%	&r   c           
     D   | j                   }g }i }i }t        t        t        j                     |      D ]<  }t        |      dk(  sJ t        t        j                  |d         }t        t        j                  |d         }	 |j                         j                  dd      \  }	}
|j                  |	d      \  }}t        |      r*t        t        j                  |d         }|j                  }n|j                  }||j                  t!        |
      k7  r|	dd j#                         |	dd z   }|
r|d|
z   z  }t        j$                  |      |d<   |j'                  |       |r7|r4|r1t        |      dk(  r"t)        |d   t        j$                        rt        t*        |      }|d   j                         }|j-                  |j.                  | j0                  j2                  xs d||d   | j0                  j4                  j6                  j8                  j:                        }t        |      r?t        t        j                  |d         }|j=                          |j?                  |       n*|j=                          |t        j                  ddg| z  }k|j@                  }|rS|D cg c]/  }t)        |t        jB                  t        j$                  f      s.|1 }}|r||jE                  |i       |
<   |jF                  rA	 |
jI                  dd      \  }}t        j$                  |      g|jE                  |i       |<   |}
t        jJ                  |jL                  d	
      }|jN                  j6                  |_        |jN                  jP                  |_(        |jN                  jR                  |_)        ||z  }|jT                  rz||v r)t        tV        tX        t        tZ        f   |||            }n$t        |      ||<   |g |f}|j'                  |       |j]                  |
|g      }|d   j'                  |       |j]                  |
|g      }|j'                  |||f       ? t        j^                         }|D ]  }t)        |t        j                        r||z  }#|\  }}}|j                  |j@                  i       }| j0                  j4                  j6                  j8                  j:                  } | j0                  j4                  j`                  }!| j0                  j2                  xs d}"||jc                  ||"|| |!|      z  } |je                  |       y# t        $ r |j                         d}
}	Y w xY wc c}w # t        $ r Y Qw xY w)z%Transform a single field list *node*.   r   r   Nr+   )NNrO   )r>   r?   T)translatablerP   )3r   r   listr   rV   r   rQ   rU   rT   splitr9   getr   r   childrenr$   r^   upperrR   appendr   r   rH   r   r   r;   statedocumentsettingsr?   clearrS   r!   Inline
setdefaultrp   rsplitr:   	rawsourceparentsourcelinero   ri   r   r	   rM   r   r@   r[   replace_self)#r'   r   r   entriesgroupindicesrW   rV   rQ   rU   fieldtype_namerK   typedescis_typefieldr   rL   new_fieldnametyped_fieldr<   xrefsr   nargtypeargnametranslatable_contentgroup	new_entrynew_listentryr   r}   r*   
fieldtypesr?   r@   r;   s#                                      r   r   zDocFieldTransformer.transform!  s*   ,,BD')!# $u{{+T2 ]	=Eu:?"?e..a9Je..a9JC+5+<+<+>+D+DT1+M( &-[[%N"Hl $J/ *Q-@	#,,$-- 8#3#3tH~#E !/q 3 9 9 ;nQR>P P!S8^3M %

= 9
1u% 'G)jUZZ.P"&z8"<K$QZ..0F'22#00--3!( NN0099BBFF 3 E ,J7$(*Q-$H	!)!((/"((*"eoob"&Eu&EE
}}H  '.[Aejj?Y1Z1[[?FE$$Xr28<   ''/tQ'?$GW
 G,- $$Xr27;&H#(<<
0D0D=A$C ,6,=,=,F,F )*4*;*;*B*B '(2(9(9(>(> % G+  ""|+ udD'8!97<PXCY;Z[E-0\L*%r51ENN5)$//;O:PQ	a	*$//;O:PQ	)U;<{]	=@ ##% 	^E%-E!-2*	5("YYy~~r:
nn**33<<@@....66..4"I00VU58'T\ 1 ^ ^	^ 	(#O  C+5+<+<+>Cd \ " s0   #U+1/V!VV+V
	V
	VVN)r   r   r_   r`   )r   zaddnodes.desc_contentr_   r`   )r   znodes.field_listr_   r`   )rk   rl   rm   rn   __annotations__r(   r   r   rJ   r   r   r   r     s     +*6
&w$r   r   )r   znodes.field_bodyr_   r^   )%rn   
__future__r   r7   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   	getLoggerrk   r3   r   r   rs   r   r   rJ   r   r   <module>r      s   
 #  + +  (    +333/			8	$
a5 a5H/55 /5dK5 K5\J$ J$r   