U
    \Sh=                     @  s  d Z ddlm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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-m.Z. ddl/m0Z0 ddl1m2Z2 e
rFddl3m4Z4 e5e6Z7G dd deZ8G dd dZ9G dd dej:ej;ej<Z=ddd d!d"d#d$Z>d%d d&d'd(Z?G d)d* d*eZ@G d+d, d,eZAdXd-d d.d d d/d0d1d2d3ZBdYd4dd d.d d/d/d/d5d6	d7d8ZCd4dd9d:d;d<ZDdZd=dd d.d d/d9d>d?d@ZEd=dd9d:dAdBZFd[dCdd d.d d9dDdEdFZGdCdd9d:dGdHZHdIdd9d:dJdKZIdLdd9d:dMdNZJdOdPd9dQdRdSZKdOdTdUdVdWZLdS )\zNAllow graphviz-formatted graphs to be included inline in generated documents.
    )annotationsN)path)CalledProcessError)TYPE_CHECKINGAny)nodes)Node)	Directive
directives)Sphinx)SphinxError)___)loggingsha1)SphinxDirectiveSphinxTranslator)search_image_for_language)set_source_info)	ensuredir)
OptionSpec)HTML5Translator)LaTeXTranslator)ManualPageTranslator)TexinfoTranslator)TextTranslator)Configc                   @  s   e Zd ZdZdS )GraphvizErrorzGraphviz errorN)__name__
__module____qualname__category r"   r"   F/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/ext/graphviz.pyr   '   s   r   c                   @  sX   e Zd ZdZedZedZdddddddd	Zddd
ddZ	ddddZ
dS )ClickableMapDefinitionz1A manipulator for clickable map file of graphviz.z<map id="(.*?)"z
href=".*?" strNone)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__0   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< | jD ]}| j|r|| j| q|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   8   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_mapI   s    $z-ClickableMapDefinition.generate_clickable_mapN)r%   )r   r   r    __doc__recompiler4   r:   r2   r0   rC   r"   r"   r"   r#   r$   +   s   

r$   c                   @  s   e Zd ZdS )graphvizN)r   r   r    r"   r"   r"   r#   rG   T   s   rG   r	   r&   znodes.figure)	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_wrapperX   s    

rT   r   )argumentr+   c                 C  s   t | dS )N)leftcenterright)r
   choice)rU   r"   r"   r#   
align_spece   s    rZ   c                   @  sX   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ded< d	d
ddZdS )Graphviz3
    Directive to insert arbitrary dot markup.
    Tr   r3   FaltrK   rJ   layoutgraphviz_dotnameclassr   option_spec
list[Node]r?   c           	   	   C  s  | j r| jj}| jr,|jjtd| jdgS t| j d | j	}| j	
|\}}| j	| z$t|dd}| }W 5 Q R X W q tk
r   |jjtd| | jdg Y 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rX| jd |d< d| jkrr| 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   utf-8encodingz8External Graphviz file %r not found or reading it failedr@   z.Ignoring "graphviz" directive without content.codedocnameoptionsr`   r_   r^   rK   rb   classesr(   rJ   )	argumentsrO   documentr)   reporterwarningr   rP   r   envZ
relfn2pathZnote_dependencyopenreadOSErrorrB   stripZstate_machinerG   ri   rj   add_namerT   )	r1   rm   rU   Zrel_filenamer(   fpZdotcoderI   rL   r"   r"   r#   run{   s`    

zGraphviz.runNr   r   r    rD   Zhas_contentZrequired_argumentsZoptional_argumentsZfinal_argument_whitespacer
   Z	unchangedrZ   Zclass_optionrc   __annotations__rw   r"   r"   r"   r#   r[   i   s   

r[   c                   @  sX   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ded< d	d
ddZdS )GraphvizSimpler\   Tr3   r   Fr]   r   rc   rd   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@   rh   ri   rj   r`   r_   r^   rK   rb   rk   rJ   )
rG   ra   rl   rB   r)   rp   ri   rj   ru   rT   )r1   rI   rL   r"   r"   r#   rw      s*    







zGraphvizSimple.runNrx   r"   r"   r"   r#   rz      s   

rz   r   dictz
str | Noneztuple[str | None, str | None])r1   rh   rj   formatprefixr(   r+   c              
   C  s  | d| jjj}|t| t| t| jjj  }| dt|  d| }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 zFtj|| d|dd}t|
s~ttd|j|jf |	|
fW S  tk
r   ttd| t| jdsi | j_d| jj|< Y dS  tk
r } zttd|j|jf |W 5 d}~X Y nX dS )z3Render graphviz code into a PNG or PDF output file.r`   -._graphviz_warned_dot)NNz-Tz-ori   indexpngz-Tcmapxz-o%s.mapT)inputcapture_output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`   r&   graphviz_dot_argsr7   r   r8   	posixpathrB   Zimgpathr   ZoutdirZimagedirisfilehasattrr   r   dirnamerQ   srcdir
subprocessrw   r   r   stderrstdoutrs   loggerro   r   )r1   rh   rj   r|   r}   r(   r`   ZhashkeyfnameZrelfnoutfnZdot_argsri   r   retexcr"   r"   r#   
render_dot   s^    

 



r   r   ztuple[str, str])	r1   rI   rh   rj   r}   imgclsr^   r(   r+   c              
   C  s   | j jj}z2|dkr$ttd| t| |||||\}	}
W n< tk
rx } zttd|| tj	|W 5 d }~X Y nX |dg|
dg  }dtd |}|	d kr| j| | nZ|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|
d k	sTt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 5 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 %rdot code %r: %srG   rk    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.mapre   rf   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   ro   r   SkipNoder   rB   filterbodyr<   r7   rt   AssertionErrorrq   r$   rr   r/   r-   rC   )r1   rI   rh   rj   r}   r   r^   r(   r|   r   r   r   rk   ZmapfileZimgmapr"   r"   r#   render_dot_html  sZ    


r   r'   )r1   rI   r+   c                 C  s$   t | ||d |d |dd d S Nrh   rj   r(   )r(   )r   r   r1   rI   r"   r"   r#   html_visit_graphvizC  s    r   r   )r1   rI   rh   rj   r}   r(   r+   c              
   C  s   zt | ||d||\}}W n< tk
rV } zttd|| tj|W 5 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pdfr   r%   rK   rV   {z\hspace*{\fill}}rX   z{\hspace*{\fill}}rW   z{\hfillz
%sz\sphinxincludegraphics[]{%s}z%s
)
r   r   r   ro   r   r   r   	is_inliner   r<   )r1   rI   rh   rj   r}   r(   r   r   r   r   prepostr"   r"   r#   render_dot_latexG  s0    
r   c                 C  s$   t | ||d |d |dd d S r   )r   r   r   r"   r"   r#   latex_visit_graphvizi  s    r   r   )r1   rI   rh   rj   r}   r+   c              
   C  s   zt | ||d|\}}W n< tk
rT } zttd|| tj|W 5 d }~X Y nX |d k	rv| jd|d d   tjd S )Nr   r   z@image{%s,,,[graphviz],png}
)	r   r   r   ro   r   r   r   r   r<   )r1   rI   rh   rj   r}   r   r   r   r"   r"   r#   render_dot_texinfom  s    r   c                 C  s   t | ||d |d  d S )Nrh   rj   )r   r   r"   r"   r#   texinfo_visit_graphvizy  s    r   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   r   r"   r"   r#   text_visit_graphviz}  s    
r   r   c                 C  s>   d|j kr$| jtd|d   n| jtd tjd S r   )rM   r   r<   r   r   r   r   r"   r"   r#   man_visit_graphviz  s    
r   r   r   )_appr   r+   c                 C  s"   t tjddd}|j| d S )NZ	templatesrG   graphviz.css)r   rB   sphinxpackage_dirZhtml_static_pathr<   )r   r   Zcss_pathr"   r"   r#   on_config_inited  s    r   zdict[str, Any])appr+   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)htmllatexZtexinfotextmanrG   graphZdigraphr`   r*   r   r   r   r   r   zconfig-initedT)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   )MrD   
__future__r   r   rE   r   osr   r   typingr   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.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sphinx.configr   	getLoggerr   r   r   r$   ZGeneralZInlineZElementrG   rT   rZ   r[   rz   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   sn   
)D,   6       6   " 