B
    .Kc              	   @   s  d Z ddlZddlZddlmZ ddlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZmZ ddl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'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8 erZddl9m:Z: ddl;m<Z< ddl=m>Z> e.?e@ZAejBdd dkrddlmCZC neZCeDdZEeDdejFZGe* ZHG dd de"eI ZJG dd deJZKG dd  d e+ZLG d!d" d"e1ZMG d#d$ d$e"eI ZNG d%d& d&e1ZOG d'd( d(e+ZPeIeeeI  d)d*d+ZQd,e	e eIeIeReIejSejTd-d.d/ZUG d0d1 d1e1ZVdCeIeIee d3d4d5ZWG d6d7 d7e1ZXG d8d9 d9e+ZYG d:d; d;e$ZZd<e$e ee[ d=d>d?Z\d<eeIef d@dAdBZ]dS )DzThe standard domain.    N)copy)TYPE_CHECKINGAnyCallableDictIterableIteratorListOptionalTupleTypeUnioncast)nodes)ElementNodesystem_message)	Directive
directives)
StringList)addnodes)desc_signaturepending_xref)ObjectDescription)DomainObjType)___)EmphasizedLiteralXRefRole)docname_joinloggingws_re)SphinxDirective)clean_astextmake_idmake_refnode)
OptionSpecRoleFunction)Sphinx)Builder)BuildEnvironment   )      )Finalz ((?:/|--|-|\+)?[^\s=]+)(=?\s*.*)z`((~?\w*:)?\w+)`c               @   sn   e Zd ZU dZdZeed< dZedee	gef ed< ee	eddd	Z
eee	dd
ddZeedddZdS )GenericObjectzM
    A generic x-ref directive registered with Sphinx.add_object_type().
     indextemplateNr+   
parse_node)sigsignodereturnc             C   s@   | j r|  | j||}n$|  |t||7 }td|}|S )N )r3   envclearr   	desc_namer"   sub)selfr4   r5   name r>   1lib/python3.7/site-packages/sphinx/domains/std.pyhandle_signature4   s    zGenericObject.handle_signature)r=   r4   r5   r6   c       	      C   s   t | j| jj| j|}|d | | jj| | jr| jd}|dkr|| jd | 	 }| j|d d  	 |f }nd}| j|f }| j
d |||dd f tt| jd}|j| j|||d	 d S )
Nids:   singleentriesr1   std)location)r%   r8   statedocumentobjtypeappendnote_explicit_targetr2   findstrip	indexnoder   StandardDomain
get_domainnote_object)	r<   r=   r4   r5   node_idcolon	indextype
indexentryrG   r>   r>   r?   add_target_and_index>   s    z"GenericObject.add_target_and_index)r=   r6   c             C   s   | j d | S )zGenerate old styled node_id for generic objects.

        .. note:: Old Styled node_id was used until Sphinx-3.0.
                  This will be removed in Sphinx-5.0.
        -)rK   )r<   r=   r>   r>   r?   make_old_idP   s    zGenericObject.make_old_id)__name__
__module____qualname____doc__r2   str__annotations__r3   r   r   r@   rX   rZ   r>   r>   r>   r?   r0   -   s   

r0   c               @   s   e Zd ZedZdS )EnvVarzenvironment variable; %sN)r[   r\   r]   r   r2   r>   r>   r>   r?   ra   Y   s   ra   c               @   s8   e Zd ZdZejdeeee	e
 e	e f dddZdS )EnvVarXRefRolezQ
    Cross-referencing role for environment variables (adds an index entry).
    r+   )rJ   r8   nodeis_refr6   c       	      C   s~   |s|gg fS |d }d| d }t }d||dd fdtd| |dd fg|d< tjdd|gd}|| |||gg fS )	N	reftargetzindex-%sindexrE   r1   zenvironment variable; %srF   )rA   )Znew_serialnor   rf   r   r   targetrM   )	r<   rJ   r8   rc   rd   ZvarnameZtgtidrP   Z
targetnoder>   r>   r?   result_nodesb   s    

zEnvVarXRefRole.result_nodesN)r[   r\   r]   r^   r   rJ   r   boolr   r	   r   r   rh   r>   r>   r>   r?   rb   ]   s   rb   c               @   sT   e Zd ZU dZdZdZdZdZdZi Z	e
ed< ee dd	d
ZeedddZdS )Targetz@
    Generic target for user-defined cross-reference types.
    r1   FrD   r   Toption_spec)r6   c             C   s  t d| jd  }t| j| jj| j|}t	j
dd|gd}| | | jj| |g}| jr| j|f }d}|d}|dkr|d |  }||d d   }tj|||dd fgd	}|d| | j}	d| jkr| jdd\}
}	tt| jd
}|j|	|||d |S )Nr7   r   r1   )rA   rE   rB   rC   rD   )rF   rG   )rH   )r"   r;   	argumentsrO   r%   r8   rI   rJ   r=   r   rg   set_source_inforM   r2   rN   r   rf   insertsplitr   rQ   rR   rS   )r<   fullnamerT   rc   retrW   rV   rU   inoder=   r   rG   r>   r>   r?   run~   s*    


z
Target.run)r=   r6   c             C   s   | j d | S )zGenerate old styled node_id for targets.

        .. note:: Old Styled node_id was used until Sphinx-3.0.
                  This will be removed in Sphinx-5.0.
        rY   )r=   )r<   r=   r>   r>   r?   rZ      s    zTarget.make_old_idN)r[   r\   r]   r^   r2   has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacerk   r'   r`   r	   r   rs   r_   rZ   r>   r>   r>   r?   rj   r   s   
rj   c               @   sH   e Zd ZdZeeedddZeeeddddZeeed	d
dZdS )	Cmdoptionz;
    Description of a command-line option (.. option).
    )r4   r5   r6   c             C   s  d}d}x| dD ]}| }t|}|sHtjtd||d q| \}}|d dkr|d dkr|d	d }d| }|r| jj	j
r|td
d
7 }|t 7 }n|tdd7 }|t||7 }| jj	j
rd}	|r|d dkr |d dkr d}	|tdd7 }|dd }nN|d dkrD|t 7 }| }n*|d dkrn|tdd7 }|dd	 }x>t|D ]0}
t|
tjr|t|
 7 }n||
7 }qzW |	r|tdd7 }n|t||7 }|s|}|g|d< n|d | |d7 }qW |st|S )z/Transform an option description into RST nodes.r   r1   z, znMalformed option description %r, should look like "opt", "-opt args", "--opt args", "/opt args" or "+opt args")rH   rC   []N,FTrD   r7   =allnames)ro   rO   option_desc_rematchloggerwarningr   groupsr8   configZoption_emphasise_placeholdersr   Zdesc_sig_punctuationZdesc_sig_spaceZdesc_addnamer:   	samp_roleparse
isinstancer   TextastextrL   
ValueError)r<   r4   r5   count	firstnameZpotential_optionmoptnameargsZadd_end_bracketpartr>   r>   r?   r@      s`    



zCmdoption.handle_signatureN)r   r4   r5   r6   c             C   sf  | j jd}x|dg D ]}dg}|r4|| |dsH|d d|}t| j | jj||}|d | | 	||}	|	| jjj
kr|	|d kr|d |	 qW | jj| tt| j d}
x0|dg D ] }|
||| j j|d d	  qW |rtd
| }ntd}xF|dg D ]6}d||g}| jd d||d d	 dd f q(W d S )Nzstd:programr}   	cmdoption)rY   /argrY   rA   rG   r   z%s command line optionzcommand line optionz; rF   Zpairr1   )r8   ref_contextgetrL   
startswithjoinr%   rI   rJ   rZ   rA   rM   r   rQ   rR   add_program_optiondocnamer   rP   )r<   r   r4   r5   Zcurrprogramr   prefixesprefixrT   Zold_node_iddomainZdescroptionentryr>   r>   r?   rX      s2    



zCmdoption.add_target_and_index)r   r   r6   c             C   s   t |d | S )zGenerate old styled node_id for cmdoption.

        .. note:: Old Styled node_id was used until Sphinx-3.0.
                  This will be removed in Sphinx-5.0.
        rY   )r   r%   )r<   r   r   r>   r>   r?   rZ     s    zCmdoption.make_old_id)	r[   r\   r]   r^   r_   r   r@   rX   rZ   r>   r>   r>   r?   rx      s   :!rx   c               @   s@   e Zd ZU dZdZdZdZdZi Ze	e
d< ee ddd	Zd
S )ProgramzI
    Directive to name the program for which options are documented.
    FrD   r   Trk   )r6   c             C   s@   t d| jd  }|dkr0| jjdd  n|| jjd< g S )NrY   r   Nonezstd:program)r"   r;   rl   rO   r8   r   pop)r<   programr>   r>   r?   rs     s
    zProgram.runN)r[   r\   r]   r^   rt   ru   rv   rw   rk   r'   r`   r	   r   rs   r>   r>   r>   r?   r   
  s   
r   c               @   s,   e Zd Zdeeeeeeef dddZdS )OptionXRefRoler+   )r8   refnodehas_explicit_titletitlerg   r6   c             C   s   |j d|d< ||fS )Nzstd:program)r   r   )r<   r8   r   r   r   rg   r>   r>   r?   process_link  s    zOptionXRefRole.process_linkN)r[   r\   r]   r   ri   r_   r   r   r>   r>   r>   r?   r     s   r   )liner6   c             C   s   t d| d g }|S )Nz +: +)rero   )r   partsr>   r>   r?   split_term_classifiers%  s    r   r+   )r8   	textnodes	index_keysourcelinenorT   rJ   r6   c             C   s   t jd	| }||_||_| }|r6|d | n&t| |d|}|d | || tt	| 
d}	|	j|||d t }
d||d|fg|
d< |j|j |
_|
_||
 |S )
Nr1   rA   termrG   )rH   rE   mainrF   )r1   r1   )r   r   r   r   r   rL   r%   rM   r   rQ   rR   
_note_termr   rf   )r8   r   r   r   r   rT   rJ   r   ZtermtextrG   rP   r>   r>   r?   make_glossary_term+  s     

r   c               @   sF   e Zd ZU dZdZdZdZdZdej	iZ
eed< ee ddd	Zd
S )Glossaryz[
    Directive to create a glossary with cross-reference targets for :term:
    roles.
    Tr   Fsortedrk   )r6   c             C   s  t  }| jj|_d| jk|d< g }d}d}d}g }xt| j| jjD ]t\}\}}	|s~|rx|rx|d d d||	 d}qH|rP|d 	 sP|
drd}qHnd}|r|s|| jjjtd	||	d
 ||||	fgt f d}nb|r|| jjjtd||	d
 |r0|d d |||	f n|| jjjtd||	d
 nj|rXnb|svd}t|t|  }
|r|d d ||
d  ||	 n|| jjjtd||	d
 d}qHW g }x|D ]\}}g }g }xl|D ]d\}}}	t|}| j|d |	\}}t| j||d ||	d | jjd}||_|| || qW || t }|r|| j||jd d | || |tjd|  qW tjd| }|d d ||7 }||g S )Nr   TFrC   rD   r1   r   z.. z,glossary term must be preceded by empty line)r   r   z3glossary terms must not be separated by empty linesz4glossary seems to be misformatted, check indentation)rT   rJ   classesglossary)r1   )r1   )r   r   rI   rJ   optionszipZcontentitemsrL   isspacer   Zreporterr   r   r   lenlstripr   Zinline_textr   r8   Z	rawsourceextendr   
definitionZnested_parsedefinition_list_itemdefinition_list)r<   rc   rF   Zin_definitionZ
in_commentZ	was_emptymessagesr   r   r   Z
indent_lenr   termsr   Z	termnodesZsystem_messagesr   r   Zsysmsgr   ZdefnodeZdlistr>   r>   r?   rs   W  s    
"
 


zGlossary.runN)r[   r\   r]   r^   rt   ru   rv   rw   r   flagrk   r'   r`   r	   r   rs   r>   r>   r>   r?   r   I  s   
r   r1   )textproductionGroupr6   c             C   s,  t |dkr|d7 }g }d}xt| D ]}| |krX| ||  }|t| |d}d|kr|d dkr|d\}}|dd  }	q|d dkr|dd  }|}	q|}|}	n|}|| }	t	|dd|	d}
|
tj
||dgd	7 }
||
 | }q(W |t | k r(|t| |d   |S )
Nr   rB   rD   ~tokenrG   )reftypeZ	refdomainre   Zxref)r   )r   token_refinditerstartrL   r   r   groupro   r   literalend)r   r   Zretnodesposr   Ztxtr   r   r   rg   r   r>   r>   r?   token_xrefs  s8    

r   c               @   sP   e Zd ZU dZdZdZdZdZi Ze	e
d< ee ddd	Zeed
ddZdS )ProductionListz0
    Directive to list grammar productions.
    FrD   r   Trk   )r6   c          	   C   sR  t t| jd}t }| | td}|	d| j
d d}d}d}x|D ]}|snd|krn| }qTd}y|dd	\}}	W n tk
r   P Y nX t|}
| }||
d
< |
d
 r.d| }t| j| jj||}|
d | | jj|
|
 t|dkrd||f }n|}|jd|||d |
t|	| ||
 qTW |gS )NrG   z\\\nr1   r   
FrB   TrD   Z	tokennamezgrammar-token-%srA   z%s:%sr   )rH   )r   rQ   r8   rR   r   productionlistrm   r   compiler;   rl   ro   rO   r   Z
productionr%   rI   rJ   rL   Znote_implicit_targetr   rS   r   r   )r<   r   rc   Znl_escape_relinesr   Zfirst_rule_seenZruler=   tokenssubnoder   rT   ZobjNamer>   r>   r?   rs     s>    




zProductionList.run)r   r6   c             C   s   t d| S )zGenerate old styled node_id for tokens.

        .. note:: Old Styled node_id was used until Sphinx-3.0.
                  This will be removed in Sphinx-5.0.
        zgrammar-token-)r   r%   )r<   r   r>   r>   r?   rZ     s    zProductionList.make_old_idN)r[   r\   r]   r^   rt   ru   rv   rw   rk   r'   r`   r	   r   rs   r_   rZ   r>   r>   r>   r?   r     s   
%r   c               @   s,   e Zd Zdeeeeeeef dddZdS )TokenXRefRoler+   )r8   r   r   r   rg   r6   c             C   sH   | d}| js@|d dkr@d|kr4|d\}}n|dd  }||fS )Nr   r   rB   rD   )r   r   ro   )r<   r8   r   r   r   rg   r   r>   r>   r?   r     s    
zTokenXRefRole.process_linkN)r[   r\   r]   r   ri   r_   r   r   r>   r>   r>   r?   r     s   r   c                   s  e Zd ZU dZdZdZeeddddeedd	ddeed
ddddeeddeeddeedddddZe	e
ef ed< eeeeeedZe	e
ee f ed< edde e eejddedejddedddeddedejddZe	e
eeef f ed< i i dd ed!fd"d ed#fd$d ed%fd&d'd(d)d&d*Zeed+< d,d-d.d/d0d1Zej d2ej!d3ej"d4iZ#e	ee$ e%e
e&e' f f ed5< d6d7d8 fd9d:Z(de
e
e
e
d7d;d<d=Z)e*e	e%e
e
f e%e
e
f f d>d?d@Z+de
e
e
e,d7dAdBdCZ-e*e	e
e%e
e
f f d>dDdEZ.de
e
e,d7dFdGdHZ/e*e	e%e
e
f e%e
e
f f d>dIdJZ0e*e	e
e%e
e
e
f f d>dKdLZ1e*e	e
e%e
e
f f d>dMdNZ2e
d7dOdPdQZ3e4e
 e	d7dRdSdTZ5d6e
ej6d7dUdVdWZ7e
e
e
e
d7dXdYdZZ8e
d[e
e
e
e
e,e9d\d]d^Z:d6e
d[e
e
e;e9e&e9 d_d`daZ<d6e
d[e
e
e;e9e&e9 d_dbdcZ=d6e
d[e
e
e;e9e&e9 d_dddeZ>d6e
d[e
e
e;e9e&e9 d_dfdgZ?d6e
d[e
e
e;e9e&e9 d_dhdiZ@d6e
d[e
e
e;e9e&e9 d_djdkZAd6e
d[e
e
e;e9e9d_dldmZBd6e
d[e
e
e;e9e&e9 d_dndoZCd6e
d[e
e;e9e4e%e
e9f  dpdqdrZDeEe%e
e
e
e
e
eFf  d>dsdtZGdeeHe
dvdwdxZIe$eHdydzd{ZJe$e&e
 dyd|d}ZKe$e&e
 dyd~dZLd6d[e
e
e9e%eFdf dddZMe9e&e
 dyddZN  ZOS )rQ   zs
    Domain for all objects that don't fit into another domain or are added
    via the application interface.
    rG   ZDefaultzglossary termr   rC   )
searchpriozgrammar tokenr   zreference labelrefkeywordzenvironment variableenvvarzprogram optionr   rJ   doc)r   r   labelr   r   r   object_types)r   r   r   r   r   r   r   T)warn_dangling)innernodeclassr   )	lowercaser   r   )r   r   )r   r   )r   r   r   r   r   numrefr   r   rolesgenindexr1   ZIndexzpy-modindexzModule IndexsearchzSearch Page)r   Zmodindexr   )r   r1   )zpy-modindexr1   )r   r1   )progoptionsobjectslabels
anonlabelsinitial_dataz term not in glossary: %(target)rzundefined label: %(target)rzunknown keyword: %(target)rzunknown document: %(target)rzunknown option: %(target)r)r   r   r   r   r   )figureN)tableN)z
code-blockNenumerable_nodesr+   N)r8   r6   c                sB   t  | t| j| _x$|jjj D ]\}}|| j|< q(W d S )N)super__init__r   r   appregistryr   )r<   r8   rc   Zsettings)	__class__r>   r?   r   n  s    zStandardDomain.__init__)r=   r   rT   r   r6   c             C   sf   || j kr@| j | ||fkr@ttd|| j| j | d  ||f| j |< |rb|||f| j|< dS )aU  Add a hyperlink target for cross reference.

        .. warning::

           This is only for internal use.  Please don't use this from your extension.
           ``document.note_explicit_target()`` or ``note_implicit_target()`` are recommended to
           add a hyperlink target to the document.

           This only adds a hyperlink target to the StandardDomain.  And this does not add a
           node_id to node.  Therefore, it is very fragile to calling this without
           understanding hyperlink target framework in both docutils and Sphinx.

        .. versionadded:: 3.0
        z(duplicate label %s, other instance in %sr   N)r   r   r   r   r8   doc2pathr   )r<   r=   r   rT   r   r>   r>   r?   note_hyperlink_targetv  s    
z$StandardDomain.note_hyperlink_target)r6   c             C   s   | j di S )Nr   )data
setdefault)r<   r>   r>   r?   r     s    zStandardDomain.objects)rK   r=   labelidrH   r6   c             C   sR   ||f| j kr8| j ||f d }tjtd||||d | jj|f| j ||f< dS )zRNote a generic object for cross reference.

        .. versionadded:: 3.0
        r   z4duplicate %s description of %s, other instance in %s)rH   N)r   r   r   r   r8   r   )r<   rK   r=   r   rH   r   r>   r>   r?   rS     s
    
zStandardDomain.note_objectc             C   s   | j di S )z2.. note:: Will be removed soon. internal use only.r   )r   r   )r<   r>   r>   r?   _terms  s    zStandardDomain._terms)r   r   rH   r6   c             C   s*   |  d||| | jj|f| j| < dS )zeNote a term for cross reference.

        .. note:: Will be removed soon. internal use only.
        r   N)rS   r8   r   r   lower)r<   r   r   rH   r>   r>   r?   r     s    zStandardDomain._note_termc             C   s   | j di S )Nr   )r   r   )r<   r>   r>   r?   r     s    zStandardDomain.progoptionsc             C   s   | j di S )Nr   )r   r   )r<   r>   r>   r?   r     s    zStandardDomain.labelsc             C   s   | j di S )Nr   )r   r   )r<   r>   r>   r?   r     s    zStandardDomain.anonlabels)r   r6   c             C   s   d }x.t | j D ]\}\}}||kr| j|= qW x.t | j D ]\}\}}||krD| j|= qDW x.t | j D ]\}\}}||krt| j|= qtW x0t | j D ]\}\}}}||kr| j|= qW x.t | j D ]\}\}}||kr| j|= qW d S )N)listr   r   r   r   r   r   )r<   r   keyfnZ_lr>   r>   r?   	clear_doc  s     zStandardDomain.clear_doc)docnames	otherdatar6   c             C   s   x.|d   D ]\}}|d |kr|| j|< qW x.|d   D ]\}}|d |kr>|| j|< q>W x.|d   D ]\}}|d |krn|| j|< qnW x.|d   D ]\}}|d |kr|| j|< qW x.|d   D ]\}}|d |kr|| j|< qW d S )Nr   r   r   r   r   r   )r   r   r   r   r   r   )r<   r   r   r   r   r>   r>   r?   merge_domaindata  s    zStandardDomain.merge_domaindata)r8   r   rJ   r6   c             C   s  x|j  D ]\}}|sq|j| }|d kr2q|j| }t|tjrld|krl|j|d }|d d }|jdksd|ks|j	drq|| j
krtjtd||| j
| d |d ||f| j|< |jd	krttj|d }t|}	n|jd
krt|}	n| |r$| |}	|	sqnt|tjtjfrR|jrRttj|jd }t|tjtjfrxttj|jd }t|tjtjfrt|}	n.t|tj d }
|
r|
dr|
d}	nq|||	f| j
|< qW d S )Nrefidnamesr   ZfootnoterefuriZdesc_z(duplicate label %s, other instance in %s)rH   sectionZrubriccaption)!Z	nametypesr   ZnameidsrA   r   r   rg   r   Ztagnamer   r   r   r   r   r   r   r   r   r$   is_enumerable_nodeget_numfig_titler   Z
field_listZchildrenr   Zfieldr   r   Z
field_namenextfindallr   toctree)r<   r8   r   rJ   r=   Zexplicitr   rc   r   sectnamer  r>   r>   r?   process_doc  sR    









zStandardDomain.process_doc)r   r=   r   r   r6   c             C   s$   ||f| j kr ||f| j ||f< d S )N)r   )r<   r   r=   r   r   r>   r>   r?   r     s    z!StandardDomain.add_program_optionr*   )fromdocnamebuilderr   r   r  rolenamer   r6   c             K   s   | dtj}|dddi|}	t||}
|
dd k	rZ|
d d |
d d|  ||krl||	d< n@td}||d	< ||d
< ||||	d< |r|	d  d| 7  < |	|
 |	S )N	nodeclassr1   ZinternalTr   rG   zstd-r  Z
refdocnameZrefsectnamer  #)r1   r1   )r   r   Z	referenceinliner   rL   r   Zget_relative_uri)r<   r  r  r   r   r  r  r   r  Znewnode	innernodecontnoder>   r>   r?   build_reference_node  s"    

z#StandardDomain.build_reference_node)r8   r  r  typrg   rc   r  r6   c       	      C   sz   |dkr| j }nV|dkr | j}nF|dkr0| j}n6|dkr@| j}n&|dkrP| j}n|dkr`| j}n| j}||||||||S )Nr   r   r   r   r   r   )_resolve_ref_xref_resolve_numref_xref_resolve_keyword_xref_resolve_doc_xref_resolve_option_xref_resolve_term_xref_resolve_obj_xref)	r<   r8   r  r  r  rg   rc   r  Zresolverr>   r>   r?   resolve_xref,  s    zStandardDomain.resolve_xrefc             C   sT   |d r$| j |d\}}	| }
n| j|d\}}	}
|s@d S | ||||	|
dS )Nrefexplicit)r1   r1   )r1   r1   r1   r   )r   r   r   r   r  )r<   r8   r  r  r  rg   rc   r  r   r   r  r>   r>   r?   r  @  s    
z StandardDomain._resolve_ref_xrefc          
   C   s  || j kr | j |d\}}	}
n| j|d\}}	d }
|s>d S ||j|	}| |}|d krfd S |dkr|jjdkrtj	t
d|d |S y"| |||||}|d kr|S W n( tk
r   tj	t
d|	|d |S X y|d r| }n|jj|d	}|
d kr,d
|kr,tj	t
d||d |S dtt|}d
|ksPd|krt|
rf|j|
|d}n|j|d}n|| }W nb tk
r } ztj	t
d|||d |S d }~X Y n* tk
r   tj	t
d||d |S X | j||||	|dtj|dS )N)r1   r1   r1   )r1   r1   r  Fz(numfig is disabled. :numref: is ignored.)rH   zBFailed to create a cross reference. Any number is not assigned: %sr   r1   z{name}zthe link has no caption: %s.number)r=   r"  )r"  zinvalid numfig_format: %s (%r)zinvalid numfig_format: %sr   )r  r   )r   r   r   Zget_doctreerA   get_enumerable_node_typer   Znumfigr   r   r   get_fignumberr   r   Znumfig_formatr   mapr_   formatKeyError	TypeErrorr  r   Znumber_reference)r<   r8   r  r  r  rg   rc   r  r   r   Zfignametarget_nodefigtypeZ	fignumberr   ZfignumZnewtitleexcr>   r>   r?   r  R  sX    




z#StandardDomain._resolve_numref_xrefc             C   s,   | j |d\}}	}
|sd S t||||	|S )N)r1   r1   r1   )r   r   r&   )r<   r8   r  r  r  rg   rc   r  r   r   r   r>   r>   r?   r    s
    z$StandardDomain._resolve_keyword_xrefc             C   sn   | d|}t||d }	|	|jkr(d S |d r:| }
nt|j|	 }
tj|
|
dgd}t|||	d |S d S )Nrefdocre   r   r   )r   )	r   r    all_docsr   r$   titlesr   r  r&   )r<   r8   r  r  r  rg   rc   r  r,  r   r  r  r>   r>   r?   r    s    

z StandardDomain._resolve_doc_xrefc             C   s   | d}| }| j ||fd\}	}
|	snx@dD ]8}||kr2||\}}}| j ||fd\}	}
|	r2P q2W |	sg }xRt|rt|d\}}|| d|}| j ||fd\}	}
|	rxP qxW d S t	|||	|
|S )Nzstd:program)r1   r1   >   [=r|   r7   rD   rY   )
r   rO   r   	partitionr"   r   ro   rL   r   r&   )r<   r8   r  r  r  rg   rc   r  prognamer   r   ZneedleZstemr   ZcommandsZ
subcommandr>   r>   r?   r    s,    



z#StandardDomain._resolve_option_xrefc          	   C   sV   |  |||||||}|r|S | | jkrN| j|  \}	}
t|||	|
|S d S d S )N)r  r   r   r&   )r<   r8   r  r  r  rg   rc   r  resultr   r   r>   r>   r?   r    s    
z!StandardDomain._resolve_term_xrefc             C   s^   |  |pg }x6|D ]&}	|	|f| jkr| j|	|f \}
}P qW d\}
}|
sNd S t|||
||S )N)r1   r1   )Zobjtypes_for_roler   r&   )r<   r8   r  r  r  rg   rc   r  ZobjtypesrK   r   r   r>   r>   r?   r    s    
z StandardDomain._resolve_obj_xref)r8   r  r  rg   rc   r  r6   c          
   C   s   g }|  }xDdD ]<}	| ||||	|	dkr.|n|||}
|
r|d|	 |
f qW xb| jD ]X}||f}|dkrv||f}|| jkrZ| j| \}}|d| | t|||||f qZW |S )N)r   r   r   zstd:r   )r   r  rL   r   r   Zrole_for_objtyper&   )r<   r8   r  r  rg   rc   r  resultsZltargetZroleZresrK   r   r   r   r>   r>   r?   resolve_any_xref  s$    

zStandardDomain.resolve_any_xrefc             c   sN  x.| j jD ]"}|t| j j| d|ddfV  q
W xb| j D ]T\\}}}|rvd||g}||d|d |d dfV  q<||d|d |d dfV  q<W x@| j D ]2\\}}}||||d |d | j| j	d fV  qW x.| j
 D ] \}\}}	}
||
d	||	dfV  qW t| j
}x8| j D ]*\}\}}	||kr||d	||	dfV  qW d S )
Nr   r1   rC   r!  r   r   rD   r   r   )r8   r-  r$   r.  r   r   r   r   r   Zattrsr   setr   )r<   r   progr   inforp   typer=   r   r   ZsectionnameZnon_anon_labelsr>   r>   r?   get_objects  s     "

zStandardDomain.get_objectsF)r8  primaryr6   c             C   s   |j S )N)Zlname)r<   r8  r:  r>   r>   r?   get_type_name  s    zStandardDomain.get_type_name)rc   r6   c             C   s   |j | jkS )N)r   r   )r<   rc   r>   r>   r?   r    s    z!StandardDomain.is_enumerable_nodec             C   s`   |  |r\tt|}| j|jd\}}|r4||S x&|D ]}t|tjtj	fr:t
|S q:W dS )z?Get the title of enumerable nodes to refer them using its title)NNN)r  r   r   r   r   r   r   r   r  r   r$   )r<   rc   elemr   Ztitle_getterr   r>   r>   r?   r    s    


zStandardDomain.get_numfig_titlec             C   sb   t ttddd}t|tjr"dS t|tjrFd|krF||tjrFdS | j	|j
d\}}|S dS )	zGet type of enumerable nodes.)rc   clsr6   c                s   t  fdd| D S )Nc             3   s   | ]}t | V  qd S )N)r   ).0Zchild)r=  r>   r?   	<genexpr>/  s    zMStandardDomain.get_enumerable_node_type.<locals>.has_child.<locals>.<genexpr>)any)rc   r=  r>   )r=  r?   	has_child.  s    z:StandardDomain.get_enumerable_node_type.<locals>.has_childr  literal_blockz
code-block)NNN)r   r   ri   r   r   r  	containerrB  r   r   r   )r<   rc   rA  r*  r   r>   r>   r?   r#  ,  s    z'StandardDomain.get_enumerable_node_type.)r8   r  r*  r   r)  r6   c       	   
   C   s   |dkrf|j dkrdS ||jkr&tqd|d d  }||j| krT|j| dS |j| |S nLy|d d }|j| | | S  ttfk
r } z
t|W d d }~X Y nX d S )Nr  Zlatexr>   r  rA   r   r1   )r=   Ztoc_secnumbersr   r   Ztoc_fignumbersr'  
IndexError)	r<   r8   r  r*  r   r)  Z
anchornameZ	figure_idr+  r>   r>   r?   r$  <  s    

zStandardDomain.get_fignumberc             C   sf   | ddkr^| d}t| d}|r8|d| | }|rXdd||gS d S nd S d S )Nr   r   zstd:programre   r   r!  rY   )r   r"   ro   rn   r   r   )r<   rc   r1  Zcommandr   r>   r>   r?   get_full_qualified_nameS  s    
z&StandardDomain.get_full_qualified_name)r1   )N)N)F)Pr[   r\   r]   r^   r=   r   r   r   r   r   r_   r`   r   rx   ra   r   r   r   r   r   r   rb   r   r   r   r  r   r   r(   r   r/   Zdangling_warningsr   r   rC  r   r   r   r
   r   r   r   propertyr   r   rS   r   r   r   r   r   r   r	   r  rJ   r  r   r   r  r   r  r  r  r  r  r  r  r  r4  r   intr9  ri   r;  r  r  r#  r$  rE  __classcell__r>   r>   )r   r?   rQ   !  s   
&**	(
 	(" 2="rQ   r)   )r   r   rc   r6   c             C   sd   |r|j dks|d dkrd S |d }||jkr:td}ntd}tj|| |d|d d dS d S )	NrG   r   r   re   zundefined label: %rzDFailed to create a cross reference. A title or caption not found: %r)rH   r8  ZsubtypeT)r=   r   r   r   r   )r   r   rc   rg   msgr>   r>   r?   warn_missing_referenceb  s    

rJ  )r   r6   c             C   s$   |  t | dt dddddS )Nzwarn-missing-referenceZbuiltinr,   T)versionZenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainrQ   ZconnectrJ  )r   r>   r>   r?   setupq  s    
rL  )r1   )^r^   r   sysr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   Zdocutilsr   Zdocutils.nodesr   r   r   Zdocutils.parsers.rstr   r   Zdocutils.statemachiner   Zsphinxr   Zsphinx.addnodesr   r   Zsphinx.directivesr   Zsphinx.domainsr   r   Zsphinx.localer   r   Zsphinx.rolesr   r   Zsphinx.utilr    r!   r"   Zsphinx.util.docutilsr#   Zsphinx.util.nodesr$   r%   r&   Zsphinx.util.typingr'   r(   Zsphinx.applicationr)   Zsphinx.buildersr*   Zsphinx.environmentr+   Z	getLoggerr[   r   version_infor/   r   r~   Ur   r   r_   r0   ra   rb   rj   rx   r   r   r   rG  rJ   r   r   r   r   r   r   rQ   ri   rJ  rL  r>   r>   r>   r?   <module>   sh   8

,/i

r!9    E