B
    öÀ„\
=  ã               @   s¸  d Z ddlZddlZddl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 ddlmZ dd	lmZ ddlZdd
lm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"m#Z#m$Z$m%Z% e &e'¡Z(G dd„ deƒZ)G dd„ de*ƒZ+G dd„ dej,ej-ej.ƒZ/dd„ Z0dd„ Z1G dd„ deƒZ2G dd„ deƒZ3d5dd „Z4d6d!d"„Z5d#d$„ Z6d7d%d&„Z7d'd(„ Z8d8d)d*„Z9d+d,„ Z:d-d.„ Z;d/d0„ Z<d1d2„ Z=d3d4„ Z>dS )9a  
    sphinx.ext.graphviz
    ~~~~~~~~~~~~~~~~~~~

    Allow graphviz-formatted graphs to be included in Sphinx-generated
    documents inline.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
é    N)Úsha1)Úpath)ÚPopenÚPIPE)Únodes)Ú
directives)ÚViewList)Ú	text_type)ÚSphinxError)Ú_Ú__)Úlogging)ÚSphinxDirective)Ú
copy_asset)Úsearch_image_for_language)Ú	ensuredirÚENOENTÚEPIPEÚEINVALc               @   s   e Zd ZdZdS )ÚGraphvizErrorzGraphviz errorN)Ú__name__Ú
__module__Ú__qualname__Úcategory© r   r   ú2lib/python3.7/site-packages/sphinx/ext/graphviz.pyr   +   s   r   c               @   s@   e Zd ZdZe d¡Ze d¡Zddd„Zddd	„Z	d
d„ Z
dS )ÚClickableMapDefinitionz1A manipulator for clickable map file of graphviz.z<map id="(.*?)"z
href=".*?"Ú c             C   s,   d | _ || _| ¡ | _g | _| j|d d S )N)Údot)ÚidÚfilenameÚ
splitlinesÚcontentÚ	clickableÚparse)Úselfr    r"   r   r   r   r   Ú__init__4   s
    
zClickableMapDefinition.__init__Nc             C   s¤   | j  | jd ¡}|s$td| j ƒ‚| d¡| _| jdkrxt| d¡ƒ 	¡ }d|dd …  | _| jd  
d| j¡| jd< x&| jD ]}| j |¡r€| j |¡ q€W d S )Nr   z$Invalid clickable map file found: %sé   z%3zutf-8z	grapviz%siöÿÿÿ)Ú	maptag_reÚmatchr"   r   r    Úgroupr   r   ÚencodeÚ	hexdigestÚreplaceÚhref_reÚsearchr#   Úappend)r%   r   ZmatchedZhashedÚliner   r   r   r$   =   s    
zClickableMapDefinition.parsec             C   s2   | j r*d | jd g| j  | jd g ¡S dS dS )zvGenerate clickable map tags if clickable item exists.

        If not exists, this only returns empty string.
        Ú
r   éÿÿÿÿr   N)r#   Újoinr"   )r%   r   r   r   Úgenerate_clickable_mapO   s    $z-ClickableMapDefinition.generate_clickable_map)r   )N)r   r   r   Ú__doc__ÚreÚcompiler(   r.   r&   r$   r5   r   r   r   r   r   /   s   


	
r   c               @   s   e Zd ZdS )ÚgraphvizN)r   r   r   r   r   r   r   r9   [   s   r9   c             C   sŠ   t  d|¡}d|kr$|j d¡|d< t  ¡ }| j t|gdd| j|¡ t j	|d j
df|d jžŽ }|d j|_|d j|_||7 }|S )Nr   Úalign)Úsourcer   )r   ZfigureÚ
attributesÚpopÚElementÚstateZnested_parser   Zcontent_offsetÚcaptionZ	rawsourceZchildrenr;   r1   )Z	directiveÚnoder@   Zfigure_nodeZparsedZcaption_noder   r   r   Úfigure_wrapper_   s    
rB   c             C   s   t  | d¡S )N)ÚleftÚcenterÚright)r   Zchoice)Úargumentr   r   r   Ú
align_specp   s    rG   c               @   s@   e Zd ZdZdZdZdZdZej	e
ej	ej	ej	dœZdd„ Zd	S )
ÚGraphvizz3
    Directive to insert arbitrary dot markup.
    Tr   r'   F)Úaltr:   r@   Úgraphviz_dotÚnamec       	   	   C   s€  | j r´| jj}| jr,|jjtdƒ| jdgS t| j d | j	ƒ}| j	 
|¡\}}| j	 |¡ y&t |dd¡}| ¡ }W d Q R X W qâ ttfk
r°   |jjtdƒ| | jdgS X n.d | j¡}| ¡ sâ| jjjtdƒ| jdgS tƒ }||d	< d
| j	ji|d< d| jkr| jd |d d< d| jkr8| jd |d< d| jkrR| jd |d< | j d¡}|rpt| ||ƒ}|  |¡ |gS )NzCGraphviz directive cannot have both content and a filename argument)r1   r   Úrzutf-8z8External Graphviz file %r not found or reading it failedr2   z.Ignoring "graphviz" directive without content.ÚcodeÚdocnameÚoptionsrJ   rI   r:   r@   )Ú	argumentsr?   Údocumentr"   ZreporterÚwarningr   Úlinenor   ÚenvZ
relfn2pathZnote_dependencyÚcodecsÚopenÚreadÚIOErrorÚOSErrorr4   ÚstripZstate_machiner9   rN   rO   ÚgetrB   Úadd_name)	r%   rQ   rF   Zrel_filenamer    ÚfpZdotcoderA   r@   r   r   r   Úrun…   sF    
zGraphviz.runN)r   r   r   r6   Úhas_contentÚrequired_argumentsÚoptional_argumentsÚfinal_argument_whitespacer   Ú	unchangedrG   Úoption_specr^   r   r   r   r   rH   u   s   
rH   c               @   s@   e Zd ZdZdZdZdZdZej	e
ej	ej	ej	dœZdd„ Zd	S )
ÚGraphvizSimplez3
    Directive to insert arbitrary dot markup.
    Tr'   r   F)rI   r:   r@   rJ   rK   c             C   s°   t ƒ }d| j| jd d | j¡f |d< d| jji|d< d| jkrT| jd |d d< d| jkrl| jd |d< d	| jkr„| jd	 |d	< | j d
¡}|r t	| ||ƒ}|  
|¡ |gS )Nz%s %s {
%s
}
r   r2   rM   rN   rO   rJ   rI   r:   r@   )r9   rK   rP   r4   r"   rT   rN   rO   r[   rB   r\   )r%   rA   r@   r   r   r   r^   À   s     



zGraphvizSimple.runN)r   r   r   r6   r_   r`   ra   rb   r   rc   rG   rd   r^   r   r   r   r   re   °   s   
re   c          
   C   sb  |  d| jjj¡}|t|ƒ t|ƒ t| jjjƒ  d¡}d|t|ƒ ¡ |f }t	 
| jj|¡}t 
| jj| jj|¡}	t |	¡rˆ||	fS t| jdƒr¦| jj  |¡r¦dS tt |	¡ƒ t|tƒrÈ| d¡}|g}
|
 | jjj¡ |
 d| d|	 g¡ |  dd	¡}t t 
| jj|¡¡}|d
kr2|
 dd|	 g¡ yt|
ttt|d}W nd tk
r¬ } zD|jtkrj‚ t tdƒ|¡ t| jdƒsi | j_d| jj|< dS d}~X Y nX y|  |¡\}}W nX tt!fk
r } z4|jt"t#fkrê‚ |j$ %¡ |j& %¡  }}| '¡  W dd}~X Y nX |j(dkr:t)tdƒ||f ƒ‚t |	¡sZt)tdƒ||f ƒ‚||	fS )z3Render graphviz code into a PNG or PDF output file.rJ   zutf-8z%s-%s.%sÚ_graphviz_warned_dot)NNz-Tz-orN   ÚindexÚpngz-Tcmapxz-o%s.map)ÚstdoutÚstdinÚstderrÚcwdzYdot command %r cannot be run (needed for graphviz output), check the graphviz_dot settingTNr   z.dot exited with error:
[stderr]
%s
[stdout]
%sz;dot did not produce an output file:
[stderr]
%s
[stdout]
%s)*r[   ÚbuilderÚconfigrJ   ÚstrÚgraphviz_dot_argsr+   r   r,   Ú	posixpathr4   Zimgpathr   ÚoutdirZimagedirÚisfileÚhasattrrf   r   ÚdirnameÚ
isinstancer	   ÚextendZsrcdirr   r   rY   Úerrnor   ÚloggerrR   r   ZcommunicaterX   r   r   ri   rW   rk   ÚwaitÚ
returncoder   )r%   rM   rO   ÚformatÚprefixrJ   ZhashkeyÚfnameZrelfnÚoutfnZdot_argsrN   rl   ÚpÚerrri   rk   r   r   r   Ú
render_dotÕ   s\    




r‚   c          
   C   s  | j jj}y0|dkr$ttdƒ| ƒ‚t| ||||ƒ\}}	W n> tk
rx }
 z t tdƒ|t|
ƒ¡ t	j
‚W d d }
~
X Y nX |rˆ|d7 }nd}|d krª| j |  |¡¡ nP|d krÈ| d|  |¡ ¡ ¡}d|krì| j d|d |d f ¡ |d	kr4| j d
¡ | j d||f ¡ | j d| ¡ | j d¡ n°tj|	d ddd–}t|	d | ¡ |d}|jr¬| j d
¡ | j d|||j|f ¡ | j d¡ | j | ¡ ¡ n.| j d
¡ | j d|||f ¡ | j d¡ W d Q R X d|krú| j d¡ t	j
‚d S )N)rh   Úsvgz=graphviz_output_format must be one of 'png', 'svg', but is %rzdot code %r: %sz	 graphvizr9   rI   r:   z!<div align="%s" class="align-%s">rƒ   z<div class="graphviz">z3<object data="%s" type="image/svg+xml" class="%s">
z<p class="warning">%s</p>z</object></div>
z.maprL   zutf-8)Úencoding)r   z1<img src="%s" alt="%s" usemap="#%s" class="%s" />z</div>
z$<img src="%s" alt="%s" class="%s" />)rm   rn   Úgraphviz_output_formatr   r   r‚   ry   rR   r	   r   ÚSkipNodeÚbodyr0   r+   r[   rZ   rU   rV   r   rW   r#   r   r5   )r%   rA   rM   rO   r}   ZimgclsrI   r|   r~   r   ÚexcZmapfileZimgmapr   r   r   Úrender_dot_html  sP    



r‰   c             C   s   t | ||d |d ƒ d S )NrM   rO   )r‰   )r%   rA   r   r   r   Úhtml_visit_graphvizK  s    rŠ   c          
   C   sô   yt | ||d|ƒ\}}W n> tk
rV } z t tdƒ|t|ƒ¡ tj‚W d d }~X Y nX |  |¡}|sÆd}	d}
d|kr¶|d dkrŒd}	d}
n*|d dkr¢d	}	d
}
n|d dkr¶d}	d}
| j	 
d|	 ¡ | j	 
d| ¡ |sê| j	 
d|
 ¡ tj‚d S )NZpdfzdot code %r: %sr   r:   rC   Ú{z\hspace*{\fill}}rE   z{\hspace*{\fill}Ú}rD   z{\hfillz
%sz\sphinxincludegraphics[]{%s}z%s
)r‚   r   ry   rR   r   r	   r   r†   Ú	is_inliner‡   r0   )r%   rA   rM   rO   r}   r~   r   rˆ   r   ZpreZpostr   r   r   Úrender_dot_latexP  s0    
rŽ   c             C   s   t | ||d |d ƒ d S )NrM   rO   )rŽ   )r%   rA   r   r   r   Úlatex_visit_graphvizq  s    r   c          
   C   s‚   yt | ||d|ƒ\}}W n> tk
rV } z t tdƒ|t|ƒ¡ tj‚W d d }~X Y nX |d k	rx| j 	d|d d…  ¡ tj‚d S )Nrh   zdot code %r: %sz@image{%s,,,[graphviz],png}
éüÿÿÿ)
r‚   r   ry   rR   r   r	   r   r†   r‡   r0   )r%   rA   rM   rO   r}   r~   r   rˆ   r   r   r   Úrender_dot_texinfov  s    r‘   c             C   s   t | ||d |d ƒ d S )NrM   rO   )r‘   )r%   rA   r   r   r   Útexinfo_visit_graphviz‚  s    r’   c             C   s:   d|j kr"|  tdƒ|d  ¡ n|  tdƒ¡ tj‚d S )NrI   z[graph: %s]z[graph])r<   Zadd_textr   r   r†   )r%   rA   r   r   r   Útext_visit_graphviz‡  s    
r“   c             C   s>   d|j kr$| j tdƒ|d  ¡ n| j tdƒ¡ tj‚d S )NrI   z[graph: %s]z[graph])r<   r‡   r0   r   r   r†   )r%   rA   r   r   r   Úman_visit_graphviz  s    
r”   c             C   s6   |d kr2t  tjddd¡}t  | jd¡}t||ƒ d S )NZ	templatesr9   zgraphviz.cssZ_static)r   r4   ÚsphinxZpackage_dirrr   r   )Úapprˆ   ÚsrcÚdstr   r   r   Úon_build_finished™  s    r™   c             C   sš   | j ttd ftd ftd ftd ftd fd |  dt¡ |  dt	¡ |  dt	¡ |  
ddd¡ |  
dg d¡ |  
d	d
d¡ |  d¡ |  dt¡ tjddœS )N)ÚhtmlZlatexZtexinfoÚtextZmanr9   ZgraphZdigraphrJ   r   rš   rp   r…   rh   zgraphviz.csszbuild-finishedT)ÚversionZparallel_read_safe)Zadd_noder9   rŠ   r   r’   r“   r”   Zadd_directiverH   re   Zadd_config_valueZadd_css_fileZconnectr™   r•   Z__display_version__)r–   r   r   r   Úsetup¡  s    
r   )r9   )r9   NN)r9   )r9   )?r6   rU   rq   r7   Zhashlibr   Úosr   Ú
subprocessr   r   Zdocutilsr   Zdocutils.parsers.rstr   Zdocutils.statemachiner   Zsixr	   r•   Zsphinx.errorsr
   Zsphinx.localer   r   Zsphinx.utilr   Zsphinx.util.docutilsr   Zsphinx.util.fileutilr   Zsphinx.util.i18nr   Zsphinx.util.osutilr   r   r   r   Z	getLoggerr   ry   r   Úobjectr   ZGeneralZInliner>   r9   rB   rG   rH   re   r‚   r‰   rŠ   rŽ   r   r‘   r’   r“   r”   r™   r   r   r   r   r   Ú<module>   sL   
,;%
@ 
5
!
		