U
    \Shg>                     @  s2  U d Z ddlmZ ddlZddlmZmZ ddlZddl	Zddl
ZddlmZmZ ddl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mZ ddlmZ erddlmZ ddl m!Z! ej"ej#ej$ej%ej"ej&ej%ej%ej"ej$d
Z'G dd deZ(G dd de(Z)G dd deZ*G dd deZ+e,dZ-G dd deZ.G dd de.Z/e,dZ0e,dZ1G dd deZ2e,d ej3Z4G d!d" d"eZ5i g fd#d#d#d$d%d&d'd(d)d*d+Z6ej7j8j9j:ej7j8j9j;d,e6_<e(ej=d-e)d.d/e* e+ e. e/ e2 e2 e5 d0	Z>d1e?d2< d3d4d5d6d7Z@dS )8z#Handlers for additional ReST roles.    )annotationsN)TYPE_CHECKINGAny)nodesutils)ElementNodeTextElementsystem_message)addnodes)___)ws_re)ReferenceRole
SphinxRole)RoleFunction)Sphinx)BuildEnvironment)
commanddfnZkbdZ
mailheaderZmakevarmanpagemimetypeZ	newsgroupprogramregexpc                      s   e Zd ZU dZejZded< ej	Z
ded< d%ddd	d
ddd fddZddddddZddddZddddZddddZddddddddd Zd!ddddd"d#d$Z  ZS )&XRefRoleaA  
    A generic cross-referencing role.  To create a callable that can be used as
    a role function, create an instance of this class.

    The general features of this role are:

    * Automatic creation of a reference and a content node.
    * Optional separation of title and target with `title <target>`.
    * The implementation is a class rather than a function to make
      customization easier.

    Customization can be done in two ways:

    * Supplying constructor parameters:
      * `fix_parens` to normalize parentheses (strip from target, and add to
        title if configured)
      * `lowercase` to lowercase the target
      * `nodeclass` and `innernodeclass` select the node classes for
        the reference and the content node

    * Subclassing and overwriting `process_link()` and/or `result_nodes()`.
    ztype[Element]	nodeclassztype[TextElement]innernodeclassFNboolztype[Element] | Noneztype[TextElement] | NoneNone)
fix_parens	lowercaser   r   warn_danglingreturnc                   s<   || _ || _|| _|d k	r || _|d k	r.|| _t   d S N)r   r    r!   r   r   super__init__)selfr   r    r   r   r!   	__class__ ?/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/roles.pyr%   D   s    zXRefRole.__init__strtuple[str, str])titletargetr"   c                 C  sJ   | j s,|dr|d d }| jjr,|d7 }|drB|d d }||fS )Nz())has_explicit_titleendswithconfigZadd_function_parentheses)r&   r-   r.   r)   r)   r*   update_title_and_targetR   s    

z XRefRole.update_title_and_target'tuple[list[Node], list[system_message]]r"   c                 C  st   d| j kr(d| j  | _| _d| jg| _n2| j dd\| _| _d| j| j d| j g| _| jrh|  S |  S d S )N: Zxref   -)name	refdomainreftypeclassessplitdisabledcreate_non_xref_nodecreate_xref_noder&   r)   r)   r*   run_   s    
zXRefRole.runc                 C  s\   t | jdd  }| jr0d| _| |d\}}| j| j|| jd}| j	| j
j| j|ddS )Nr8   Fr7   r=   is_ref)r   unescapetextr   r0   r3   r   rawtextr=   result_nodesinlinerdocumentenv)r&   rH   r.   noder)   r)   r*   r@   l   s    zXRefRole.create_non_xref_nodec                 C  s   | j }| j}| jr| }| jr0| ||\}}| jj| j| j	| j
| jd}| j| jf|}| | | | j|| j
||\}}||d< || j| j|| jd7 }| j| jj| j|ddS )N)Zrefdocr;   r<   ZrefexplicitZrefwarnZ	reftargetrD   TrE   )r.   r-   r    lowerr   r3   rM   Zdocnamer;   r<   r0   r!   r   rI   Zset_source_infoprocess_linkr   r=   rJ   rK   rL   )r&   r.   r-   optionsrefnoder)   r)   r*   rA   u   s*    
 zXRefRole.create_xref_noder   r   rM   rR   r0   r-   r.   r"   c                 C  s   |t d|fS )zCalled after parsing title and target text, and creating the
        reference node (given in *refnode*).  This method can alter the
        reference node and must return a new (or the same) ``(title, target)``
        tuple.
         )r   sub)r&   rM   rR   r0   r-   r.   r)   r)   r*   rP      s    zXRefRole.process_linkznodes.document)rL   rM   rN   rF   r"   c                 C  s
   |gg fS )a(  Called before returning the finished nodes.  *node* is the reference
        node if one was created (*is_ref* is then true), else the content node.
        This method can add other nodes and must return a ``(nodes, messages)``
        tuple (the usual return value of a role function).
        r)   )r&   rL   rM   rN   rF   r)   r)   r*   rJ      s    zXRefRole.result_nodes)FFNNF)__name__
__module____qualname____doc__r   Zpending_xrefr   __annotations__r   literalr   r%   r3   rC   r@   rA   rP   rJ   __classcell__r)   r)   r'   r*   r   )   s   
    		r   c                      s,   e Zd Zddddddd fddZ  ZS )	AnyXRefRoler   r   r   r+   r,   rS   c                   s&   t  |||||}|j|j |S r#   )r$   rP   
attributesupdateZref_context)r&   rM   rR   r0   r-   r.   resultr'   r)   r*   rP      s    zAnyXRefRole.process_link)rV   rW   rX   rP   r\   r)   r)   r'   r*   r]      s   r]   c                   @  s(   e Zd ZddddZddddZdS )	PEPr4   r5   c           
      C  s  d| j d }dtd| j |dd fg}tj|d}tjdd|gd}| jj	| zX| 
 }tjddd|d	gd
}| jr|t| j| j7 }nd| j }|t||7 }W nT tk
r   | jjjtd| j | jd}| j| j| j|}	|	g|gf Y S X |||gg fS )Nindex-%sindexsinglez$Python Enhancement Proposals; PEP %sr7   entriesZidsFpepZinternalrefurir=   zPEP zinvalid PEP number %sline)rM   new_serialnor   r.   r   rc   r   rK   rL   note_explicit_target	build_uri	referencer0   strongr-   
ValueErrorreportererrorr   linenoproblematicrI   
r&   Z	target_idrf   rc   r.   rj   rp   r-   msgZprbr)   r)   r*   rC      s.      
zPEP.runr+   c                 C  sZ   | j jjj}| jdd}t|dkrB|dt|d |d f  S |dt|d   S d S )N#r8      zpep-%04d/#%sr   z	pep-%04d/)rK   rL   settingsZpep_base_urlr.   r>   lenintr&   base_urlretr)   r)   r*   ro      s
    zPEP.build_uriNrV   rW   rX   rC   ro   r)   r)   r)   r*   ra      s   ra   c                   @  s(   e Zd ZddddZddddZdS )	RFCr4   r5   c           
      C  s  d| j d }dd| j |dd fg}tj|d}tjdd|gd}| jj| zX| 	 }tj
ddd|d	gd
}| jr|t| j| j7 }nd| j }|t||7 }W nT tk
 r   | jjjtd| j | jd}| j| j| j|}	|	g|gf Y S X |||gg fS )Nrb   rc   rd   zRFC; RFC %sr7   re   rg   Frfcri   zRFC zinvalid RFC number %srk   )rM   rm   r.   r   rc   r   rK   rL   rn   ro   rp   r0   rq   r-   rr   rs   rt   r   ru   rv   rI   rw   r)   r)   r*   rC      s&    
zRFC.runr+   c                 C  sf   | j jjj}| jdd}t|dkrJ|| j jt|d   d |d  S || j jt|d   S d S )Nry   r8   rz   r   )	rK   rL   r{   Zrfc_base_urlr.   r>   r|   Zrfc_urlr}   r~   r)   r)   r*   ro      s
    $zRFC.build_uriNr   r)   r)   r)   r*   r      s   r   (?<!&)&(?![&\s])c                   @  s$   e Zd ZedZddddZdS )GUILabelr   r4   r5   c                 C  s   t j| j| jgd}| j| j}|t |d7 }|D ]P}|	dd}t |d }t jdd|dgd}||7 }|t |dd  7 }q:|gg fS )	N)rI   r=   r   z&&&r7   acceleratorrD   r8   )
r   inlinerI   r:   amp_rer>   rH   Textpopreplace)r&   rN   spansspanletterr   r)   r)   r*   rC      s    zGUILabel.runN)rV   rW   rX   recompiler   rC   r)   r)   r)   r*   r      s   
r   c                      s&   e Zd ZdZdd fddZ  ZS )MenuSelectionu   ‣r4   r5   c                   s   | j d| j| _ t  S )Nz-->)rH   r   BULLET_CHARACTERr$   rC   rB   r'   r)   r*   rC   	  s    zMenuSelection.run)rV   rW   rX   r   rC   r\   r)   r)   r'   r*   r     s   r   z	{([^}]+)}z(\\*{|\\*})c                   @  s4   e Zd ZedZddddZdddd	d
ZdS )EmphasizedLiteralz(\\\\|\\{|\\}|{|})r4   r5   c                 C  s<   |  | j}tj| jdf|| j | jgd}|gg fS )Nr7   )roler=   )parserH   r   r[   rI   r:   rO   )r&   childrenrN   r)   r)   r*   rC     s     zEmphasizedLiteral.runr+   z
list[Node])rH   r"   c                 C  sz  g }dg}| j |D ]6}|dkr6|d  d7  < q|dkr~t|dkrh|d dkrh|d  d7  < n|d |d q|dkrt|d	kr|d
 dkrt|d dkr|d r|t|d  |t|d |d  dg}n|d d|g}q|dkr"|d  d7  < q|dkr>|d  d7  < q|d  |7  < qd|rvd|}|t| |S )Nr7   z\\\{rz   r/   }   r8   r   z\{z\})	parens_rer>   r|   appendr   r   emphasisjoin)r&   rH   r`   stackpartr)   r)   r*   r     s6    

(



zEmphasizedLiteral.parseN)rV   rW   rX   r   r   r   rC   r   r)   r)   r)   r*   r     s   
r   	\((.*)\)$c                   @  s(   e Zd ZedejZddddZdS )Abbreviationr   r4   r5   c                 C  s`   | j  }| j| j}|rB| jd |   }|d|d< n| j}tj	| j
|f|gg fS )Nr8   Zexplanation)rQ   copyabbr_researchrH   startstripgroupr   ZabbreviationrI   )r&   rQ   ZmatchedrH   r)   r)   r*   rC   J  s    
zAbbreviation.runN)rV   rW   rX   r   r   Sr   rC   r)   r)   r)   r*   r   G  s   r   r+   r}   z#docutils.parsers.rst.states.Inlinerdictz	list[str]r4   )r:   rI   rH   ru   rK   rQ   contentr"   c           
      C  s   |  }tjjj| |dd}dg}|r8|d d|krN||d  |rd||krd|| t	j
||||d}	|	gg fS )Nlanguager7   code	highlightr=   )r=   r   )r   docutilsparsersrstrolesZset_classesgetr   extendr   r[   )
r:   rI   rH   ru   rK   rQ   r   r   r=   rN   r)   r)   r*   	code_rolen  s    

r   )classr   )r   T)r!   )	downloadanyrh   r   ZguilabelZmenuselectionfileZsampZabbrzdict[str, RoleFunction]specific_docrolesr   zdict[str, Any])appr"   c                 C  s   ddl m} t D ]4\}}|||}|||d|gi}||| qt D ]\}}||| qR|dt	 ddddS )Nr   )r   r=   r   builtinT)versionZparallel_read_safeZparallel_write_safe)
Zdocutils.parsers.rstr   generic_docrolesitemsZGenericRoleZ
CustomRoleZregister_local_roler   Zregister_canonical_roler   )r   r   Zrolenamer   Zgenericr   funcr)   r)   r*   setup  s    r   )ArY   
__future__r   r   typingr   r   Zdocutils.parsers.rst.directivesr   Zdocutils.parsers.rst.rolesZdocutils.parsers.rst.statesr   r   Zdocutils.nodesr   r   r	   r
   Zsphinxr   Zsphinx.localer   r   Zsphinx.utilr   Zsphinx.util.docutilsr   r   Zsphinx.util.typingr   Zsphinx.applicationr   Zsphinx.environmentr   Zliteral_strongr   r[   Zliteral_emphasisr   r   r   r]   ra   r   r   Z_amp_rer   r   Z
_litvar_rer   r   r   Z_abbr_rer   r   r   r   Z
directivesZclass_optionZ	unchangedrQ   Zdownload_referencer   rZ   r   r)   r)   r)   r*   <module>   sp   z	#"


2) 


