B
    \@                 @   s  d Z ddlmZ ddl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 eeZed	ejZeZd
d Zd;ddZdd Zejejeje	jfZdd Zdd ZejejejfZ ej!fZ"e	j#fZ$dd Z%dd Z&d<ddZ'dd Z(dd Z)dd  Z*d!d" Z+d#d$ Z,d%d&d'd(d)d*gZ-d+d, Z.d-d. Z/d=d/d0Z0d1d2 Z1d3d4 Z2ej3ej4ej5ej!ejej6e	j7fZ8d5d6 Z9d7d8 Z:d9d: Z;e;ej<_=dS )>z
    sphinx.util.nodes
    ~~~~~~~~~~~~~~~~~

    Docutils node-related utility functions for Sphinx.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )absolute_importN)nodes)	text_type)addnodes)__)loggingz^(.+?)\s*(?<!\x00)<(.*?)>$c             C   s   d | j| jjS )z
    return full module dotted path like: 'docutils.nodes.paragraph'

    :param nodes.Node node: target node
    :return: full module dotted path
    z{}.{})format
__module__	__class____name__)node r   0lib/python3.7/site-packages/sphinx/util/nodes.pyget_full_module_name$   s    r   P   c             C   sR   y|    }W n tk
r,   t| }Y nX |rNt||krN|d| d }|S )a  
    return DOM XML representation of the specified node like:
    '<paragraph translatable="False"><inline classes="versionmodified">New in version...'

    :param nodes.Node node: target node
    :param int length:
       length of return value to be striped. if false-value is specified, repr_domxml
       returns full of DOM XML representation.
    :return: DOM XML representation
    Nz...)ZasdomZtoxml	Exceptionr   len)r   lengthtextr   r   r   repr_domxml/   s    r   c             C   s  t | tjrL| jsLtdt| t|  | j}|j	| _	|j
d | _
|  | _t | tjr| j	d krtdt| t|  | jj	| jj
 | _	| _
t | tjr| j	d krtdt| t|  | jj	| jj
 | _	| _
t | tjr2tdt| t|  x<t| jtjD ]&}tdt|  d| j| _qW t | tjrV| j	d krVt| | _	| jsh|  | _| j	r|| jr|d S t | tjtj
tjtjfrtdt| t|  t| | _	d	| _
d S d S )
Nz7[i18n] PATCH: %r to have source, line and rawsource: %s   z)[i18n] PATCH: %r to have source, line: %sz#[i18n] PATCH: %r to have source: %sz&[i18n] PATCH: %r to have rawsource: %sz	\s*:\s*%s z,[i18n] PATCH: %r to have source and line: %sr   )
isinstancer   
classifier	rawsourceloggerdebugr   r   parentsourcelineastextimagetitleZtermreversedtraverseresubescapeliteral_blockfind_source_nodeZrubric
field_name)r   Zdefinition_list_itemr   r   r   r   apply_source_workaroundD   sJ    



r+   c             C   s4   t | tjr,t | jdd gd tjr,dS dS d S )Nr   r   TF)r   r   pendingdetailsgetr   meta)r   r   r   r   is_pending_meta   s    r0   c             C   s  t | tjrdS t | tjr(d| kr(dS t | tjr| jsTtdt	| t
|  dS t | trd| krtdt	| t
|  dS | ddstdt	| t
|  dS t | tjr| jd dkrtd	t	| t
|  dS dS t | tjr| drdS t | tjr
dS t| rdS dS )
NTtranslatableFz)[i18n] SKIP %r because no node.source: %szO[i18n] SKIP %r because node is in IGNORED_NODES and no node['translatable']: %sz3[i18n] SKIP %r because not node['translatable']: %sr   Zorphanz&[i18n] SKIP %r because orphan node: %s)r   r   r1   r   ZInlineZTextElementr   r   r   r   r   IGNORED_NODESr.   r*   childrenr!   r/   r0   )r   r   r   r   is_translatable   s:    
r4   c             c   s   x|  tD ]}t|tjr:x| D ]}||fV  q&W qt|trX|j}|s| }npt|t	rd|d  }|
dr|d|d  7 }n>t|tr|j}n,t|r|jd d j}n|jdd }|r||fV  qW d	S )
z3Extract translatable messages from a document tree.z.. image:: %sZurialtz
   :alt: %sr   r   
 N)r$   r4   r   r   r1   Zextract_original_messagesLITERAL_TYPE_NODESr   r    IMAGE_TYPE_NODESr.   META_TYPE_NODESZ
rawcontentr0   r-   replacestrip)doctreer   msgr   r   r   extract_messages   s(    




r?   c             C   s"   xt | D ]}|jr
|jS q
W d S )N)traverse_parentr   )r   Zpnoder   r   r   r)      s    
r)   c             c   s,   x&| r&|d kst | |r| V  | j} qW d S )N)r   r   )r   clsr   r   r   r@      s    r@   c             C   s*   | j | }|dkr"| j |d  S d S d S )Nr   r   )r   index)r   posr   r   r   get_prev_node   s    rD   c             c   sD   dd }x6|  |D ](}d|kr*|d }n|d }||fV  qW dS )z6Traverse translatable index node from a document tree.c             S   s   t | tjo| ddkS )NZinlineF)r   r   rB   r.   )r   r   r   r   is_block_index   s    z3traverse_translatable_index.<locals>.is_block_indexZraw_entriesentriesN)r$   )r=   rE   r   rF   r   r   r   traverse_translatable_index   s    
rG   c             C   sJ   | j j}| j j}g | j _d| j _z| j|d|ddS || j _|| j _X dS )zVersion of state.nested_parse() that allows titles and does not require
    titles to have the same decoration as the calling document.

    This is useful when the parsed content comes from a completely different
    context, such as docstrings.
    r   r   )Zmatch_titlesN)memoZtitle_stylesZsection_levelZnested_parse)stateZcontentr   Zsurrounding_title_stylesZsurrounding_section_levelr   r   r   nested_parse_with_titles	  s    	rJ   c             C   sP   |   } x| tjD ]}d|d< qW x | tjD ]}|j| q4W |  S )z&Like node.astext(), but ignore images.r   r5   )deepcopyr$   r   r!   rawr   remover    )r   ZimgrL   r   r   r   clean_astext  s    rN   c             C   s.   t | }|r$d|d|dfS d| | fS )z3Split role content into title and target, if given.Tr      F)explicit_title_rematchgroup)r   rQ   r   r   r   split_explicit_title(  s    
rS   singlepairdoubleZtripleZseeZseealsoc             C   sP  ddl m} g }|  } | }d}| dr>d}| dd   } x
|D ]P}| |d rF| t|d d   }|| d | }|d	|||d f P qFW xtD ]L}| |d r| t|d d   }|d
krd	}|||||d f P qW xZ|dD ]L}| }d}|dr,d}|dd   }|s4q|d|||d f qW |S )Nr   )pairindextypesr   !mainr   :z; rU   rV   ,rT   )	Zsphinx.domains.pythonrW   r<   
startswithlstripr   append
indextypessplit)entrytargetidrW   ZindexentriesZoentryrY   typevaluer   r   r   process_index_entry6  s>    

re   c          
   C   s  |  }x |tjD ]}g }tt|d }x|D ]}	|	|kr4yH||	 tj||	d dd t	| ||	| j
|	||}
||	 W n( tk
r   tjtd|	|d Y q4X tj|	d}|
j|_x$|tjD ]}d|kr|	|d< qW || q4W |j|| qW |S )	zwInline all toctrees in the *tree*.

    Record all docnames in *docnameset*, and output docnames with *colorfunc*.
    includefilesr7   r   )Znonlz+toctree contains ref to nonexisting file %r)location)docnamerh   )rK   r$   r   Ztoctreemapr   r^   r   infoinline_all_toctreesenvZget_doctreeaddr   warningr   Zstart_of_filer3   r   Zsectionr   r;   )builderZ
docnamesetrh   ZtreeZ	colorfuncZ	traversedZtoctreenodeZnewnodesrf   ZincludefileZsubtreeZsofZsectionnoder   r   r   rk   ]  s0    



rk   c             C   sn   t jdddd}||kr&|r&||d< n.|rD| ||d | |d< n| |||d< |r`||d< || |S )z$Shortcut to create a reference node.r   T)ZinternalZrefid#ZrefuriZreftitle)r   Z	referenceZget_relative_urir^   )ro   ZfromdocnameZ	todocnamerb   Zchildr"   r   r   r   r   make_refnode~  s    

rq   c             C   s   | j | j\|_|_d S )N)Zstate_machineget_source_and_linelinenor   r   )Z	directiver   r   r   r   set_source_info  s    rt   c             C   s   | j |\|_|_d S )N)Zreporterrr   r   r   )Zinlinerrs   r   r   r   r   set_role_source_info  s    ru   c             C   sB   t | jtrdS | jdddkr&dS t| dddkr:dS dS dS )z(Check the node is smart-quotable or not.FZsupport_smartquotesNT)r   r   NON_SMARTQUOTABLE_PARENT_NODESr.   getattr)r   r   r   r   is_smartquotable  s    rx   c             C   s   x|  tjD ]}y||d }W nJ tk
rn } z,tjtd||d ||j	pZt
  W dd}~X Y qX |r||j	pt
  q|t
  qW dS )z2Filter ``only`` nodes which does not match *tags*.exprz8exception while evaluating only directive expression: %s)rg   N)r$   r   ZonlyZeval_conditionr   r   rn   r   Zreplace_selfr3   r   comment)ZdocumentZtagsr   Zreterrr   r   r   process_only_nodes  s    &r|   c             C   s2   | j | jf| j}t| tjr.| j|_| j|_|S )N)r
   r   Z
attributesr   r   Elementr   r   )selfZnewnoder   r   r   	_new_copy  s
    r   )r   )N)N)>__doc__Z
__future__r   r%   Zdocutilsr   Zsixr   Zsphinxr   Zsphinx.localer   Zsphinx.utilr   Z	getLoggerr   r   compileDOTALLrP   Zcaption_ref_rer   r   r+   Z	Invisibler(   Zdoctest_blockZversionmodifiedr2   r0   r4   rL   r8   r!   r9   r/   r:   r?   r)   r@   rD   rG   rJ   rN   rS   r_   re   rk   rq   rt   ru   ZFixedTextElementliteralZmathZproblematicZnot_smartquotablerv   rx   r|   r   r}   copyr   r   r   r   <module>
   sb   

8	,
	
'!
	