B
    .ÛKc4>  ã               @   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mZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZm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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, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 e 7e8¡Z9G dd„ deƒZ:G dd„ dƒZ;G dd„ dej<ej=ej>ƒZ?ee?e@ejAdœdd „ZBe	e@d!œd"d#„ZCG d$d%„ d%e!ƒZDG d&d'„ d'e!ƒZEdEe"e@e
e@e@ee@ eee@ ee@ f d(œd)d*„ZFdFe.e?e@e
e@ee@ ee@ ee@ ee@e@f d+œ	d,d-„ZGe.e?dd.œd/d0„ZHdGe0e?e@e
e@ee@ dd1œd2d3„ZIe0e?dd.œd4d5„ZJdHe4e?e@e
e@dd6œd7d8„ZKe4e?dd.œd9d:„ZLe6e?dd.œd;d<„ZMe2e?dd.œd=d>„ZNeeOdd?œd@dA„ZPee
e@e	f dBœdCdD„ZQdS )IzNAllow graphviz-formatted graphs to be included inline in generated documents.
é    N)Úpath)ÚPIPEÚCalledProcessError)ÚAnyÚDictÚListÚOptionalÚTuple)Únodes)ÚNode)Ú	DirectiveÚ
directives)ÚSphinx)ÚSphinxError)Ú_Ú__)ÚloggingÚsha1)ÚSphinxDirectiveÚSphinxTranslator)Ú
copy_asset)Úsearch_image_for_language)Úset_source_info)Ú	ensuredir)Ú
OptionSpec)ÚHTMLTranslator)ÚLaTeXTranslator)ÚManualPageTranslator)ÚTexinfoTranslator)ÚTextTranslatorc               @   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               @   sX   e Zd ZdZe d¡Ze d¡Zdeeeddœdd„Z	edd	œd
d„Z
edœdd„ZdS )ÚClickableMapDefinitionz1A manipulator for clickable map file of graphviz.z<map id="(.*?)"z
href=".*?"Ú N)ÚfilenameÚcontentÚdotÚreturnc             C   s,   d | _ || _| ¡ | _g | _| j|d d S )N)r+   )Úidr)   Ú
splitlinesr*   Ú	clickableÚparse)Úselfr)   r*   r+   r%   r%   r&   Ú__init__,   s
    
zClickableMapDefinition.__init__)r+   r,   c             C   s¢   | j  | jd ¡}|s$td| j ƒ‚| d¡| _| jdkrvt| ¡ ƒ 	¡ }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	grapviz%siöÿÿÿ)Ú	maptag_reÚmatchr*   r    r)   Úgroupr-   r   ÚencodeÚ	hexdigestÚreplaceÚhref_reÚsearchr/   Úappend)r1   r+   ZmatchedZhashedÚliner%   r%   r&   r0   4   s    
zClickableMapDefinition.parse)r,   c             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*   )r1   r%   r%   r&   Úgenerate_clickable_mapE   s    $z-ClickableMapDefinition.generate_clickable_map)r(   )r!   r"   r#   Ú__doc__ÚreÚcompiler4   r:   Ústrr2   r0   rA   r%   r%   r%   r&   r'   '   s   

r'   c               @   s   e Zd ZdS )ÚgraphvizN)r!   r"   r#   r%   r%   r%   r&   rF   P   s   rF   )Ú	directiveÚnodeÚcaptionr,   c             C   sj   t  d|¡}d|kr$|j d¡|d< | j || j¡\}}t j|df|žŽ }| |¡ t	| |ƒ ||7 }|S )Nr(   Úalign)
r
   ÚfigureÚ
attributesÚpopÚstateZinline_textÚlinenorI   Úextendr   )rG   rH   rI   Zfigure_nodeZinodesÚmessagesZcaption_noder%   r%   r&   Úfigure_wrapperT   s    

rR   )Úargumentr,   c             C   s   t  | d¡S )N)ÚleftÚcenterÚright)r   Úchoice)rS   r%   r%   r&   Ú
align_speca   s    rX   c               @   s\   e Zd ZU dZdZdZdZdZej	e
ej	ej	ej	ej	ejdœZeed< ee dœd	d
„ZdS )ÚGraphvizz3
    Directive to insert arbitrary dot markup.
    Tr   r3   F)ÚaltrJ   rI   ÚlayoutÚgraphviz_dotÚnameÚclassÚoption_spec)r,   c       	   	   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k
rª   |jjtdƒ| | jdgS X n2d | j¡}d }| ¡ 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r:| jd |d d< d| jkrT| jd |d< d| jkrn| jd |d< d| jkrˆ| jd |d< |r–||d< d| jkr²|  |¡ |gS t| || jd ƒ}|  |¡ |gS d S )NzCGraphviz directive cannot have both content and a filename argument)r=   r   zutf-8)Úencodingz8External Graphviz file %r not found or reading it failedr>   z.Ignoring "graphviz" directive without content.ÚcodeÚdocnameÚoptionsr\   r[   rZ   rJ   r^   Úclassesr)   rI   )Ú	argumentsrN   Údocumentr*   ZreporterÚwarningr   rO   r   ÚenvZ
relfn2pathZnote_dependencyÚopenÚreadÚOSErrorr@   ÚstripZstate_machinerF   rb   rc   Úadd_namerR   )	r1   rf   rS   Zrel_filenamer)   ÚfpZdotcoderH   rK   r%   r%   r&   Úrunw   sV    

zGraphviz.runN)r!   r"   r#   rB   Úhas_contentÚrequired_argumentsÚoptional_argumentsÚfinal_argument_whitespacer   Ú	unchangedrX   Úclass_optionr_   r   Ú__annotations__r   r   ro   r%   r%   r%   r&   rY   e   s   
rY   c               @   s\   e Zd ZU dZdZdZdZdZej	e
ej	ej	ej	ej	ejdœZeed< ee dœd	d
„ZdS )ÚGraphvizSimplez3
    Directive to insert arbitrary dot markup.
    Tr3   r   F)rZ   rJ   rI   r[   r\   r]   r^   r_   )r,   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rp| jd |d d< d	| jkrˆ| jd	 |d	< d
| jkr | jd
 |d
< d| jkr¸| jd |d< d| jkrÒ|  |¡ |gS t	| || jd ƒ}|  |¡ |gS d S )Nz%s %s {
%s
}
r   r>   ra   rb   rc   r\   r[   rZ   rJ   r^   rd   rI   )
rF   r]   re   r@   r*   rh   rb   rc   rm   rR   )r1   rH   rK   r%   r%   r&   ro   »   s(     







zGraphvizSimple.runN)r!   r"   r#   rB   rp   rq   rr   rs   r   rt   rX   ru   r_   r   rv   r   r   ro   r%   r%   r%   r&   rw   ©   s   
rw   )r1   ra   rc   ÚformatÚprefixr)   r,   c          
   C   s
  |  d| jjj¡}|t|ƒ t|ƒ t| jjjƒ  ¡ }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 |
¡ƒ |g}| | jjj¡ | d| d|
 g¡ |  dd¡}|rt t 
| jj|¡¡}nt t 
| jj|¡¡}|d	kr:| d
d|
 g¡ yFtj|| ¡ tt|dd}t |
¡szttdƒ|j|jf ƒ‚|	|
fS  tk
rÈ   t tdƒ|¡ t| jdƒs¸i | j_d| jj|< dS  t k
r } zttdƒ|j|jf ƒ|‚W dd}~X Y nX dS )z3Render graphviz code into a PNG or PDF output file.r\   z%s-%s.%sÚ_graphviz_warned_dot)NNz-Tz-orb   ÚindexÚpngz-Tcmapxz-o%s.mapT)ÚinputÚstdoutÚstderrÚcwdZcheckz;dot did not produce an output file:
[stderr]
%r
[stdout]
%rzYdot command %r cannot be run (needed for graphviz output), check the graphviz_dot settingz.dot exited with error:
[stderr]
%r
[stdout]
%rN)!ÚgetÚbuilderÚconfigr\   rE   Úgraphviz_dot_argsr7   r   r8   Ú	posixpathr@   Zimgpathr   ÚoutdirZimagedirÚisfileÚhasattrrz   r   ÚdirnamerP   ZsrcdirÚ
subprocessro   r   r    r   r   r~   rk   Úloggerrg   r   )r1   ra   rc   rx   ry   r)   r\   ZhashkeyÚfnameZrelfnÚoutfnZdot_argsrb   r€   ÚretÚexcr%   r%   r&   Ú
render_dotÔ   sL    



r   )	r1   rH   ra   rc   ry   ÚimgclsrZ   r)   r,   c          
   C   s  | j jj}y2|dkr$ttdƒ| ƒ‚t| |||||ƒ\}	}
W n< tk
rx } zt tdƒ||¡ tj	|‚W d d }~X Y nX |dg| 
dg ¡ }d td |ƒ¡}|	d kr¼| j |  |¡¡ nL|d krÚ| 
d|  |¡ ¡ ¡}d|krþ| j d	|d |d f ¡ |d
krF| j d¡ | j d|	|f ¡ | j d| ¡ | j d¡ n¬t|
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)r|   Úsvgz=graphviz_output_format must be one of 'png', 'svg', but is %rzdot code %r: %srF   rd   ú rZ   rJ   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.mapzutf-8)r`   )r+   z1<img src="%s" alt="%s" usemap="#%s" class="%s" />z</div>
z$<img src="%s" alt="%s" class="%s" />)r‚   rƒ   Úgraphviz_output_formatr    r   r   r‹   rg   r
   ÚSkipNoder   r@   ÚfilterÚbodyr<   r7   rl   ri   r'   rj   r/   r-   rA   )r1   rH   ra   rc   ry   r‘   rZ   r)   rx   rŒ   r   r   rd   ZmapfileZimgmapr%   r%   r&   Úrender_dot_html	  sN    


r˜   )r1   rH   r,   c             C   s$   t | ||d |d | d¡d d S )Nra   rc   r)   )r)   )r˜   r   )r1   rH   r%   r%   r&   Úhtml_visit_graphviz>  s    r™   )r1   rH   ra   rc   ry   r)   r,   c          
   C   sô   yt | ||d||ƒ\}}W n< tk
rV } zt tdƒ||¡ 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(   rJ   rT   Ú{z\hspace*{\fill}}rV   z{\hspace*{\fill}Ú}rU   z{\hfillz
%sz\sphinxincludegraphics[]{%s}z%s
)
r   r    r‹   rg   r   r
   r•   Ú	is_inliner—   r<   )r1   rH   ra   rc   ry   r)   rŒ   r   r   rœ   ZpreZpostr%   r%   r&   Úrender_dot_latexB  s0    
r   c             C   s$   t | ||d |d | d¡d d S )Nra   rc   r)   )r)   )r   r   )r1   rH   r%   r%   r&   Úlatex_visit_graphvizd  s    rž   )r1   rH   ra   rc   ry   r,   c          
   C   s€   yt | ||d|ƒ\}}W n< tk
rT } zt tdƒ||¡ tj|‚W d d }~X Y nX |d k	rv| j d|d d…  ¡ tj‚d S )Nr|   zdot code %r: %sz@image{%s,,,[graphviz],png}
éüÿÿÿ)	r   r    r‹   rg   r   r
   r•   r—   r<   )r1   rH   ra   rc   ry   rŒ   r   r   r%   r%   r&   Úrender_dot_texinfoh  s    r    c             C   s   t | ||d |d ƒ d S )Nra   rc   )r    )r1   rH   r%   r%   r&   Útexinfo_visit_graphvizt  s    r¡   c             C   s:   d|j kr"|  tdƒ|d  ¡ n|  tdƒ¡ tj‚d S )NrZ   z[graph: %s]z[graph])rL   Úadd_textr   r
   r•   )r1   rH   r%   r%   r&   Útext_visit_graphvizx  s    
r£   c             C   s>   d|j kr$| j tdƒ|d  ¡ n| j tdƒ¡ tj‚d S )NrZ   z[graph: %s]z[graph])rL   r—   r<   r   r
   r•   )r1   rH   r%   r%   r&   Úman_visit_graphviz€  s    
r¤   )Úappr   r,   c             C   sB   |d kr>| j jdkr>t tjddd¡}t | jd¡}t||ƒ d S )NÚhtmlZ	templatesrF   zgraphviz.cssZ_static)r‚   rx   r   r@   ÚsphinxZpackage_dirr†   r   )r¥   r   ÚsrcÚdstr%   r%   r&   Úon_build_finishedˆ  s    rª   )r¥   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)r¦   ZlatexZtexinfoÚtextZmanrF   ZgraphZdigraphr\   r+   r¦   r„   r”   r|   zgraphviz.csszbuild-finishedT)ÚversionZparallel_read_safe)Zadd_noderF   r™   rž   r¡   r£   r¤   Zadd_directiverY   rw   Zadd_config_valueZadd_css_fileZconnectrª   r§   Z__display_version__)r¥   r%   r%   r&   Úsetup  s    
r­   )rF   N)rF   NNN)rF   N)rF   )RrB   r…   rC   rŠ   Úosr   r   r   Útypingr   r   r   r   r	   Zdocutilsr
   Zdocutils.nodesr   Zdocutils.parsers.rstr   r   r§   Zsphinx.applicationr   Zsphinx.errorsr   Zsphinx.localer   r   Zsphinx.utilr   r   Zsphinx.util.docutilsr   r   Zsphinx.util.fileutilr   Zsphinx.util.i18nr   Zsphinx.util.nodesr   Zsphinx.util.osutilr   Zsphinx.util.typingr   Zsphinx.writers.htmlr   Zsphinx.writers.latexr   Zsphinx.writers.manpager   Zsphinx.writers.texinfor   Zsphinx.writers.textr   Z	getLoggerr!   r‹   r    r'   ZGeneralZInlineZElementrF   rE   rK   rR   rX   rY   rw   r   r˜   r™   r   rž   r    r¡   r£   r¤   Ú	Exceptionrª   r­   r%   r%   r%   r&   Ú<module>   s`   
)D,4 2 