B
    öÀ„\Ñ?  ã               @   s`  d Z ddl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mZ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i g fdd„Ze d¡Zi g fdd„Ze d¡Z e d¡Z!i g fdd„Z"e dej#¡Z$i g fdd„Z%i g fdd„Z&eej'deddeeeee"e"e%e&d œ
Z(d!d"„ Z)dS )#z¾
    sphinx.roles
    ~~~~~~~~~~~~

    Handlers for additional ReST roles.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
é    N)ÚnodesÚutils)Ú	iteritems)Úaddnodes)ÚSphinxError)Ú_)Úws_re)Úsplit_explicit_titleÚprocess_index_entryÚset_role_source_info)
ZcommandZdfnZkbdZ
mailheaderZmakevarÚmanpageZmimetypeZ	newsgroupZprogramZregexpc               @   sL   e Zd ZdZejZejZ	ddd„Z
dd„ Zi g fdd	„Zd
d„ Zdd„ Zd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()`.
    FNc             C   s2   || _ || _|| _|d k	r || _|d k	r.|| _d S )N)Ú
fix_parensÚ	lowercaseÚwarn_danglingÚ	nodeclassÚinnernodeclass)Úselfr   r   r   r   r   © r   ú+lib/python3.7/site-packages/sphinx/roles.pyÚ__init__K   s    zXRefRole.__init__c             C   sH   |s*|  d¡r|d d… }|jjr*|d7 }|  d¡r@|d d… }||fS )Nz()éþÿÿÿ)ÚendswithÚconfigZadd_function_parentheses)r   ÚenvÚhas_explicit_titleÚtitleÚtargetr   r   r   Ú_fix_parensV   s    

zXRefRole._fix_parensc             C   s   |j jj}|s4|j d¡}|s&|jj}|s<tdƒ‚n| ¡ }d|krXd| }	}
d|
g}n"| 	dd¡\}	}
d|	d|	|
f g}|dd… d	krÚt
 |¡dd … }| jr¶|  |d
|d¡\}}| j|||d}| j|j ||d
dS t|ƒ\}}}t
 |¡}t
 |¡}| jr| ¡ }| jr(|  ||||¡\}}| j||
|	|d}t|||ƒ |  |||||¡\}}||d< || j|||d7 }|j|d< | j|d< | j|j ||ddS )NÚdefault_rolezcannot determine default role!ú:Ú Zxrefé   z%s-%sr   ú!F)Úclasses)Úis_ref)ZreftypeZ	refdomainZrefexplicitZ	reftargetZrefdocZrefwarnT)ÚdocumentÚsettingsr   Ú	temp_dataÚgetr   r   r   ÚlowerÚsplitr   Úunescaper   r   r   Úresult_nodesr	   r   r   r   Úprocess_linkZdocnamer   )r   ÚtypÚrawtextÚtextÚlinenoÚinlinerÚoptionsÚcontentr   ZdomainÚroler$   ZtgtZ	innernoder   r   r   Úrefnoder   r   r   Ú__call__d   sL    








zXRefRole.__call__c             C   s   |t  d|¡fS )zëCalled 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   r7   r   r   r   r   r   r   r.   š   s    zXRefRole.process_linkc             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   Únoder%   r   r   r   r-   £   s    zXRefRole.result_nodes)FFNNF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Zpending_xrefr   r   Úliteralr   r   r   r8   r.   r-   r   r   r   r   r   0   s    

5	r   c               @   s   e Zd Zdd„ ZdS )ÚAnyXRefRolec             C   s&   t  | |||||¡}|j |j¡ |S )N)r   r.   Z
attributesÚupdateZref_context)r   r   r7   r   r   r   Úresultr   r   r   r.   ®   s    zAnyXRefRole.process_linkN)r<   r=   r>   r.   r   r   r   r   rA   ­   s   rA   c             C   s¤  |j jj}| s,|jd st‚|jd  ¡ } n|  ¡ } t|ƒ\}}	}
t |	¡}	t |
¡}
d| 	d¡ }t
 ¡ }tjdd|gd}|j  |¡ | dkrŽdtdƒ|
 |dd	fg|d
< d}|
 d¡}|dkrà|
d	|… |
|d	…  }
}|sòdt |	¡ }	yt|
ƒ}W n@ tk
r>   |jjd|
 |d}| |||¡}|g|gfS X |j jjd|  }t |	|	¡}tjddd|| | gd}||7 }|||gg fS | dkr”dd|
 |dd	fg|d
< d}|
 d¡}|dkrâ|
d	|… |
|d	…  }
}|södt |	¡ }	yt|
ƒ}W n@ tk
rB   |jjd|
 |d}| |||¡}|g|gfS X |j jj|j|  }t |	|	¡}tjddd|| | gd}||7 }|||gg fS td|  ƒ‚d	S )z9Role for PEP/RFC references that generate an index entry.r   zindex-%sÚindexr!   )ÚidsÚpepÚsinglez$Python Enhancement Proposals; PEP %sNÚentriesú#r   zPEP zinvalid PEP number %s)Úlinezpep-%04dF)ZinternalZrefurir$   ÚrfczRFC; RFC %szRFC zinvalid RFC number %szunknown role type: %s)r&   r'   r   r(   ÚAssertionErrorr*   r	   r   r,   Únew_serialnor   rD   r   r   Znote_explicit_targetr   ÚfindÚintÚ
ValueErrorZreporterÚerrorZproblematicZpep_base_urlZstrongZ	referenceZrfc_base_urlZrfc_url)r/   r0   r1   r2   r3   r4   r5   r   r   r   r   ÚtargetidÚ	indexnodeÚ
targetnodeZanchorZanchorindexZpepnumÚmsgZprbÚrefZsnZrnZrfcnumr   r   r   Úindexmarkup_role·   sp    









rW   z(?<!&)&(?![&\s])c             C   s  |j jj}| s,|jd st‚|jd  ¡ } n|  ¡ } t |¡}| dkrR| dd¡}t	 
|¡}tj|d}	x–t|ƒD ]Š\}
}| dd¡}|
dkr®t|ƒdkrrt |¡}|	|7 }	qrt ¡ }t |d ¡}||7 }|d	  d
¡ |	|7 }	t |dd … ¡}|	|7 }	qrW |	d	  | ¡ |	gg fS )Nr   Úmenuselectionz-->u   â€£)r0   z&&ú&r   r$   Zacceleratorr"   )r&   r'   r   r(   rL   r*   r   r,   ÚreplaceÚ_amp_rer+   r   ZinlineÚ	enumerateÚlenÚTextÚappend)r/   r0   r1   r2   r3   r4   r5   r   Zspansr;   ÚiÚspanÚtextnodeZ
accel_nodeZletter_noder   r   r   Úmenusel_roleü   s4    



rc   z	{([^}]+)}z(\\*{|\\*})c             C   s  |j jj}| s,|jd st‚|jd  ¡ } n|  ¡ } tj|  ¡ | gd}tt	 
t |¡¡ƒ}	dg}
x„|	D ]z}t	 |¡}|rÖt|ƒd }|d dkrÄ|
d  dt|d d ƒ |d  7  < qæ|d dkr2|
d  dt|d ƒ 7  < t|
ƒdkr|
d	 dkr|
d  d7  < n|
 d¡ |
 d¡ n¢|
d  dt|d ƒ 7  < t|
ƒd
kr¾|
d dkr¾t|
d ƒdkr¾|
d rž|t |
d |
d ¡7 }|t |
d |
d ¡7 }dg}
n|
 d¡ d |
¡g}
qj|
d  |7  < qjW d |
¡rd |
¡}|t ||¡7 }|gg fS )Nr   )r6   r$   r!   r"   é   éÿÿÿÿú\Ú{r   é   r   Ú})r&   r'   r   r(   rL   r*   r   r@   ÚlistÚ	parens_rer+   r   r,   Úmatchr]   rO   r_   r^   ÚemphasisÚjoin)r/   r0   r1   r2   r3   r4   r5   r   ZretnodeÚpartsÚstackÚpartZmatchedZbackslashesr   r   r   Úemph_literal_role"  sB    

,
.


rr   z	\((.*)\)$c       
      C   sv   t  |¡}t |¡}|d kr2tj||f|Žgg fS |d | ¡ …  ¡ }| d¡}	| 	¡ }|	|d< tj||f|Žgg fS )Nr"   Zexplanation)
r   r,   Ú_abbr_reÚsearchr   ZabbreviationÚstartÚstripÚgroupÚcopy)
r/   r0   r1   r2   r3   r4   r5   ÚmÚabbrZexplr   r   r   Ú	abbr_roleW  s    


r{   c             C   sÌ   |j jj}d| d¡ }tjdd|gd}	t|ƒ\}
}}t |¡}t |¡}|
r\t	||ƒ}n:d}| 
d¡r†|dd … }|dd … }d}d|||d fg}t ¡ }||d	< t|||ƒ t ||¡}||	|gg fS )
Nzindex-%srD   r!   )rE   r#   r"   ÚmainrG   rH   )r&   r'   r   rM   r   r   r	   r   r,   r
   Ú
startswithr   rD   r   r^   )r/   r0   r1   r2   r3   r4   r5   r   rR   rT   r   r   r   rH   r|   rS   rb   r   r   r   Ú
index_roled  s&    



r~   )r   T)r   )
ZdownloadÚanyrF   rK   ZguilabelrX   ÚfileZsamprz   rD   c             C   s|   ddl m} x@ttƒD ]4\}}| ||¡}| ||d|gi¡}| ||¡ qW x ttƒD ]\}}| ||¡ qXW ddddœS )Nr   )Úrolesr$   ZbuiltinT)ÚversionZparallel_read_safeZparallel_write_safe)Zdocutils.parsers.rstr   r   Úgeneric_docrolesZGenericRoleZ
CustomRoleZregister_local_roleÚspecific_docroles)Zappr   Zrolenamer   Zgenericr6   Úfuncr   r   r   Úsetup’  s    r†   )*r?   ÚreZdocutilsr   r   Zsixr   Zsphinxr   Zsphinx.errorsr   Zsphinx.localer   Zsphinx.utilr   Zsphinx.util.nodesr	   r
   r   Zliteral_strongrm   r@   Zliteral_emphasisr   rƒ   Úobjectr   rA   rW   Úcompiler[   rc   Z
_litvar_rerk   rr   ÚSrs   r{   r~   Zdownload_referencer„   r†   r   r   r   r   Ú<module>
   sP   
}
B
"

1
