B
    d4>                 @   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%   `/work/yifan.wang/ringdown/master-ringdown-env/lib/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matched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   rB   r%   r%   r%   r&   r'   '   s   

r'   c               @   s   e Zd ZdS )graphvizN)r!   r"   r#   r%   r%   r%   r&   rG   P   s   rG   )	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linenorJ   extendr   )rH   rI   rJ   Zfigure_nodeinodesmessagesZcaption_noder%   r%   r&   figure_wrapperT   s    

rT   )argumentr,   c             C   s   t | dS )N)leftcenterright)r   choice)rU   r%   r%   r&   
align_speca   s    rZ   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)altrK   rJ   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]   r\   rK   r`   classesr)   rJ   )	argumentsrO   documentr*   reporterwarningr   rP   r   envZ
relfn2pathZnote_dependencyopenreadOSErrorrA   stripZstate_machinerG   rd   re   add_namerT   )	r1   rh   rU   Zrel_filenamer)   fpZdotcoderI   rL   r%   r%   r&   runw   sV    

zGraphviz.runN)r!   r"   r#   rC   has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   	unchangedrZ   class_optionra   r   __annotations__r   r   rr   r%   r%   r%   r&   r[   e   s   
r[   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)r\   rK   rJ   r]   r^   r_   r`   ra   )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?   rc   rd   re   r^   r]   r\   rK   r`   rf   rJ   )
rG   r_   rg   rA   r*   rk   rd   re   rp   rT   )r1   rI   rL   r%   r%   r&   rr      s(     







zGraphvizSimple.runN)r!   r"   r#   rC   rs   rt   ru   rv   r   rw   rZ   rx   ra   r   ry   r   r   rr   r%   r%   r%   r&   rz      s   
rz   )r1   rc   re   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 |rd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si | 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-ord   indexpngz-Tcmapxz-o%s.mapT)inputstdoutstderrcwd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^   rF   graphviz_dot_argsr7   r   r8   	posixpathrA   Zimgpathr   outdirZimagedirisfilehasattrr}   r   dirnamerQ   srcdir
subprocessrr   r   r    r   r   r   rn   loggerrj   r   )r1   rc   re   r{   r|   r)   r^   ZhashkeyfnameZrelfnoutfnZdot_argsrd   r   retexcr%   r%   r&   
render_dot   sL    



r   )	r1   rI   rc   re   r|   imgclsr\   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 nt|
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: %srG   rf    r\   rK   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)rb   )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   rj   r
   SkipNoder   rA   filterbodyr<   r7   ro   rl   r'   rm   r/   r-   rB   )r1   rI   rc   re   r|   r   r\   r)   r{   r   r   r   rf   ZmapfileZimgmapr%   r%   r&   render_dot_html	  sN    


r   )r1   rI   r,   c             C   s$   t | ||d |d |dd d S )Nrc   re   r)   )r)   )r   r   )r1   rI   r%   r%   r&   html_visit_graphviz>  s    r   )r1   rI   rc   re   r|   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 | |}	|	sd}
d}d|kr|d dkrd}
d}n*|d dkrd	}
d
}n|d dkrd}
d}| j	d|
  | j	d|  |	s| j	d|  tjd S )NZpdfzdot code %r: %sr(   rK   rV   {z\hspace*{\fill}}rX   z{\hspace*{\fill}}rW   z{\hfillz
%sz\sphinxincludegraphics[]{%s}z%s
)
r   r    r   rj   r   r
   r   	is_inliner   r<   )r1   rI   rc   re   r|   r)   r   r   r   r   prepostr%   r%   r&   render_dot_latexB  s0    
r   c             C   s$   t | ||d |d |dd d S )Nrc   re   r)   )r)   )r   r   )r1   rI   r%   r%   r&   latex_visit_graphvizd  s    r   )r1   rI   rc   re   r|   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   rj   r   r
   r   r   r<   )r1   rI   rc   re   r|   r   r   r   r%   r%   r&   render_dot_texinfoh  s    r   c             C   s   t | ||d |d  d S )Nrc   re   )r   )r1   rI   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 )Nr\   z[graph: %s]z[graph])rM   add_textr   r
   r   )r1   rI   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 )Nr\   z[graph: %s]z[graph])rM   r   r<   r   r
   r   )r1   rI   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	templatesrG   zgraphviz.cssZ_static)r   r{   r   rA   sphinx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   latexZtexinfotextmanrG   graphZdigraphr^   r+   r   r   r   r   zgraphviz.csszbuild-finishedT)versionZparallel_read_safe)add_noderG   r   r   r   r   r   Zadd_directiver[   rz   Zadd_config_valueZadd_css_fileconnectr   r   Z__display_version__)r   r%   r%   r&   setup  s    
r   )rG   N)rG   NNN)rG   N)rG   )RrC   r   rD   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   	getLoggerr!   r   r    r'   ZGeneralZInlineZElementrG   rF   rL   rT   rZ   r[   rz   r   r   r   r   r   r   r   r   r   	Exceptionr   r   r%   r%   r%   r&   <module>   s`   
)D,4 2 