B
    .Kcy>                 @   sf  U d Z ddlZddlmZmZmZmZmZ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Z0G dd deZ1G dd de1Z2e/dZ3e/dZ4G dd deZ5e/dej6Z7G d d! d!eZ8i g fe9e9e9e:ej;j<j=j>eee9 eee ee f d"d#d$Z?ej;j<j@jAej;j<j@jBd%e?_Ce+ejDd&e,d'd(e- e. e1 e2 e5 e5 e8 d)	ZEee9e f eFd*< d+ee9ef d,d-d.ZGdS )/z#Handlers for additional ReST roles.    N)TYPE_CHECKINGAnyDictListOptionalTupleType)nodesutils)ElementNodeTextElementsystem_message)addnodes)___)ws_re)ReferenceRole
SphinxRole)RoleFunction)Sphinx)BuildEnvironment)
ZcommandZdfnZkbdZ
mailheaderZmakevarmanpageZmimetypeZ	newsgroupZprogramZregexpc                   s$  e Zd ZU dZejZee e	d< e
jZee e	d< deeeee  eee  edd fddZeeeeef d	d
dZeee ee f dddZeee ee f dddZeee ee f dddZdeeeeeeef dddZe
jdeeeee ee f 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()`.
    	nodeclassinnernodeclassFN)
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__ +lib/python3.7/site-packages/sphinx/roles.pyr!   B   s    zXRefRole.__init__)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endswithZconfigZadd_function_parentheses)r"   r&   r'   r$   r$   r%   update_title_and_targetP   s    

z XRefRole.update_title_and_target)r   c             C   sr   d| j kr(d| j  | _| _d| jg| _n0| j dd\| _| _d| jd| j| jf g| _| jrf|  S |  S d S )N: Zxref   z%s-%s)name	refdomainreftypeclassessplitZ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 )Nr.   Fr-   )r2   )is_ref)r
   Zunescapetextr   r)   r+   r   rawtextr2   result_nodesinlinerdocumentenv)r"   r8   r'   noder$   r$   r%   r4   j   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refdocr0   r1   ZrefexplicitZrefwarnZ	reftarget)r2   T)r7   )r'   r&   r   lowerr   r+   r=   Zdocnamer0   r1   r)   r   r   r9   Zset_source_infoprocess_linkr   r2   r:   r;   r<   )r"   r'   r&   optionsrefnoder$   r$   r%   r5   s   s$    

zXRefRole.create_xref_noder   )r=   rB   r)   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"   r=   rB   r)   r&   r'   r$   r$   r%   r@      s    zXRefRole.process_link)r<   r=   r>   r7   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"   r<   r=   r>   r7   r$   r$   r%   r:      s    zXRefRole.result_nodes)FFNNF)__name__
__module____qualname____doc__r   Zpending_xrefr   r   r   __annotations__r	   literalr   r   boolr   r!   strr   r+   r   r   r   r6   r4   r5   r@   r<   r:   __classcell__r$   r$   )r#   r%   r   '   s   
   .	r   c                   s4   e Zd Zdeeeeeeef d fddZ  ZS )AnyXRefRoler   )r=   rB   r)   r&   r'   r   c                s&   t  |||||}|j|j |S )N)r    r@   Z
attributesupdateZref_context)r"   r=   rB   r)   r&   r'   result)r#   r$   r%   r@      s    zAnyXRefRole.process_link)	rE   rF   rG   r   rK   rL   r   r@   rM   r$   r$   )r#   r%   rN      s   rN   c               @   s8   e Zd Zeee ee f dddZedddZ	dS )PEP)r   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	| yX| 
 }tjddd|d	gd
}| jr|t| j| j7 }nd| j }|t||7 }W nP tk
 r   | jjjtd| j | jd}| j| j| j|}	|	g|gfS X |||gg fS )Nzindex-%sindexsinglez$Python Enhancement Proposals; PEP %sr-   )entries)idsFpep)internalrefurir2   zPEP zinvalid PEP number %s)line)r=   new_serialnor   r'   r   rR   r	   r;   r<   note_explicit_target	build_uri	referencer)   strongr&   
ValueErrorreportererrorr   linenoproblematicr9   )
r"   	target_idrT   rR   r'   rX   r]   r&   msgprbr$   r$   r%   r6      s&    

zPEP.runc             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#r.      zpep-%04d/#%sr   z	pep-%04d/)r;   r<   settingsZpep_base_urlr'   r3   lenint)r"   base_urlretr$   r$   r%   r\      s
    zPEP.build_uriN)
rE   rF   rG   r   r   r   r   r6   rL   r\   r$   r$   r$   r%   rQ      s   rQ   c               @   s8   e Zd Zeee ee f dddZedddZ	dS )RFC)r   c       
      C   s  d| j d }dd| j |dd fg}tj|d}tjdd|gd}| jj| yX| 	 }tj
ddd|d	gd
}| jr|t| j| j7 }nd| j }|t||7 }W nN tk
r   | jjjtd| j | jd}| j| j| j|}	|	g|gfS X |||gg fS )Nzindex-%srR   rS   zRFC; RFC %sr-   )rT   )rU   Frfc)rW   rX   r2   zRFC zinvalid RFC number %s)rY   )r=   rZ   r'   r   rR   r	   r;   r<   r[   r\   r]   r)   r^   r&   r_   r`   ra   r   rb   rc   r9   )
r"   rd   rT   rR   r'   rX   r]   r&   re   rf   r$   r$   r%   r6      s$    

zRFC.runc             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 )Nrg   r.   rh   r   )	r;   r<   ri   Zrfc_base_urlr'   r3   rj   Zrfc_urlrk   )r"   rl   rm   r$   r$   r%   r\      s
    $zRFC.build_uriN)
rE   rF   rG   r   r   r   r   r6   rL   r\   r$   r$   r$   r%   rn      s   rn   z(?<!&)&(?![&\s])c               @   s4   e Zd ZedZeee ee	 f dddZ
dS )GUILabelz(?<!&)&(?![&\s]))r   c             C   s   t j| j| jgd}| j| j}|t |d7 }xX|D ]P}|	dd}t |d }t jdd|dgd}||7 }|t |dd  7 }q<W |gg fS )	N)r9   r2   r   z&&&r-   accelerator)r2   r.   )
r	   Zinliner9   r/   amp_rer3   r8   Textpopreplace)r"   r>   ZspansspanZletterrr   r$   r$   r%   r6      s    
zGUILabel.runN)rE   rF   rG   recompilers   r   r   r   r   r6   r$   r$   r$   r%   rp      s   
rp   c                   s6   e Zd ZdZeee ee f d fddZ  Z	S )MenuSelectionu   ‣)r   c                s   | j d| j| _ t  S )Nz-->)r8   rv   BULLET_CHARACTERr    r6   )r"   )r#   r$   r%   r6     s    zMenuSelection.run)
rE   rF   rG   r{   r   r   r   r   r6   rM   r$   r$   )r#   r%   rz     s   rz   z	{([^}]+)}z(\\*{|\\*})c               @   sH   e Zd ZedZeee ee	 f dddZ
eee dddZdS )	EmphasizedLiteralz(\\\\|\\{|\\}|{|}))r   c             C   s<   |  | j}tj| jdf|| j | jgd}|gg fS )Nr-   )roler2   )parser8   r	   rJ   r9   r/   r?   )r"   Zchildrenr>   r$   r$   r%   r6     s    zEmphasizedLiteral.run)r8   r   c             C   s  g }dg}xH| j |D ]6}|dkr:|d  d7  < q|dkrt|dkrl|d dkrl|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rB|d  d7  < q|d  |7  < qW d|r|d|}|t| |S )Nr-   z\\\{rh   r(   }   r.   r   z\{z\})	parens_rer3   rj   appendr	   rt   emphasisjoin)r"   r8   rP   stackpartr$   r$   r%   r~     s6    

(



zEmphasizedLiteral.parseN)rE   rF   rG   rx   ry   r   r   r   r   r   r6   rL   r~   r$   r$   r$   r%   r|     s   
r|   z	\((.*)\)$c               @   s8   e Zd ZedejZeee	 ee
 f dddZdS )Abbreviationz	\((.*)\)$)r   c             C   s`   | j  }| j| j}|rB| jd |   }|d|d< n| j}tj	| j
|f|gg fS )Nr.   Zexplanation)rA   copyabbr_researchr8   startstripgroupr	   Zabbreviationr9   )r"   rA   Zmatchedr8   r$   r$   r%   r6   H  s    
zAbbreviation.runN)rE   rF   rG   rx   ry   Sr   r   r   r   r   r6   r$   r$   r$   r%   r   E  s   r   )r/   r9   r8   rb   r;   rA   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languager-   codeZ	highlightr2   )r2   r   )r   docutilsparsersrstrolesZset_classesgetr   extendr	   rJ   )
r/   r9   r8   rb   r;   rA   r   r   r2   r>   r$   r$   r%   	code_rolel  s    

r   )classr   )r   T)r   )	ZdownloadanyrV   ro   ZguilabelZmenuselectionfileZsampZabbrspecific_docrolesr   )appr   c             C   s   ddl m} x@t D ]4\}}|||}|||d|gi}||| qW x t D ]\}}||| qXW |dt	 ddddS )Nr   )r   r2   r   Z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   )HrH   rx   typingr   r   r   r   r   r   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   rJ   Zliteral_emphasisr   r   r   rN   rQ   rn   ry   Z_amp_rerp   rz   Z
_litvar_rer   r|   r   Z_abbr_rer   rL   rk   r   r   ZstatesZInlinerr   Z
directivesZclass_optionZ	unchangedrA   Zdownload_referencer   rI   r   r$   r$   r$   r%   <module>   sf   $
z	#"


2) 

