o
    NiD                     @  s~  d Z ddlmZ ddlZddlZddlZddlm  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 dd	lmZ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+ erddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> e#?e@ZAG dd deZBG dd dZCG d d! d!ejDejEejFZGded)d*ZHdfd-d.ZIG d/d0 d0e%ZJG d1d2 d2e%ZKdgd7d8ZL	dhdidAdBZM		djdkdGdHZNdldIdJZO	dhdmdLdMZPdndNdOZQ	!dodpdQdRZRdqdSdTZSdrdVdWZTdsdYdZZUdtd_d`ZVdudcddZWdS )vzNAllow graphviz-formatted graphs to be included inline in generated documents.
    )annotationsN)sha1)chain)path)CalledProcessError)TYPE_CHECKINGAnyClassVar)urlsplit
urlunsplit)nodes)
directives)SphinxError)___)logging)SphinxDirective)search_image_for_language)set_source_info)	ensuredir)Node)Sphinx)Config)ExtensionMetadata
OptionSpec)HTML5Translator)LaTeXTranslator)ManualPageTranslator)TexinfoTranslator)TextTranslatorc                   @  s   e Zd ZdZdS )GraphvizErrorzGraphviz errorN)__name__
__module____qualname__category r%   r%   G/home/ubuntu/.local/lib/python3.10/site-packages/sphinx/ext/graphviz.pyr    ,   s    r    c                   @  sD   e Zd ZdZedZedZddddZdddZ	dddZ
dS )ClickableMapDefinitionz1A manipulator for clickable map file of graphviz.z<map id="(.*?)"z
href=".*?" filenamestrcontentdotreturnNonec                 C  s,   d | _ || _| | _g | _| j|d d S )Nr,   )idr)   
splitlinesr+   	clickableparse)selfr)   r+   r,   r%   r%   r&   __init__6   s
   
zClickableMapDefinition.__init__c                 C  s   | j | jd }|std| j |d| _| jdkr=t| dd	 }d|dd   | _| jd 
d| j| jd< | jD ]}| j|rN| j| q@d S )	Nr   z$Invalid clickable map file found: %s   z%3Fusedforsecurityz	grapviz%si)	maptag_rematchr+   r    r)   groupr0   r   encode	hexdigestreplacehref_researchr2   append)r4   r,   matchedhashedliner%   r%   r&   r3   >   s   

zClickableMapDefinition.parsec                 C  s.   | j rd| jd g| j | jd R S dS )zvGenerate clickable map tags if clickable item exists.

        If not exists, this only returns empty string.
        
r   r(   )r2   joinr+   )r4   r%   r%   r&   generate_clickable_mapO   s   $z-ClickableMapDefinition.generate_clickable_mapN)r(   )r)   r*   r+   r*   r,   r*   r-   r.   )r,   r*   r-   r.   )r-   r*   )r!   r"   r#   __doc__recompiler9   r?   r5   r3   rH   r%   r%   r%   r&   r'   0   s    


r'   c                   @  s   e Zd ZdS graphvizN)r!   r"   r#   r%   r%   r%   r&   rM   Z   s    rM   	directiver   nodecaptionr*   r-   nodes.figurec                 C  sf   t d|}d|v r|jd|d< | |\}}t j|dg|R  }|| t| | ||7 }|S )Nr(   align)r   figure
attributespopparse_inlinerP   extendr   )rN   rO   rP   figure_nodeinodesmessagescaption_noder%   r%   r&   figure_wrapper^   s   

r\   argumentr   c                 C  s   t | dS )N)leftcenterright)r   choice)r]   r%   r%   r&   
align_speck   s   rb   c                   @  T   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ZdS )Graphviz3
    Directive to insert arbitrary dot markup.
    Tr   r6   FaltrR   rP   layoutgraphviz_dotnameclassClassVar[OptionSpec]option_specr-   
list[Node]c           	      C  s  | j ra| jj}| jr|jjtd| jdgS t| j d | j	}| j	
|\}}| j	| zt|dd}| }W d    n1 sCw   Y  W n0 ty`   |jjtd| | jdg Y S w d| j}d }| sz| jjjtd| jdgS t }||d	< d
| j	ji|d< d| jv r| jd |d d< d| jv r| jd |d d< d| jv r| jd |d< d| jv r| jd |d< d| jv r| jd |d< |r||d< d| jvr| | |gS t| || jd }| | |gS )NzCGraphviz directive cannot have both content and a filename argument)rD   r   utf-8encodingz8External Graphviz file %r not found or reading it failedrE   z.Ignoring "graphviz" directive without content.codedocnameoptionsri   rh   rg   rR   rk   classesr)   rP   )	argumentsstatedocumentr+   reporterwarningr   linenor   env
relfn2pathnote_dependencyopenreadOSErrorrG   stripstate_machinerM   rs   rt   add_namer\   )	r4   rx   r]   rel_filenamer)   fpdotcoderO   rS   r%   r%   r&   run   sf   








zGraphviz.runNr-   rn   r!   r"   r#   rI   has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   	unchangedrb   class_optionrm   __annotations__r   r%   r%   r%   r&   rd   o      
 
rd   c                   @  rc   )GraphvizSimplere   Tr6   r   Frf   rl   rm   r-   rn   c                 C  s   t  }d| j| jd d| jf |d< d| jji|d< d| jv r*| jd |d d< d| jv r8| jd |d d< d	| jv rD| jd	 |d	< d
| jv rP| jd
 |d
< d| jv r\| jd |d< d| jvri| | |gS t	| || jd }| | |gS )Nz%s %s {
%s
}
r   rE   rr   rs   rt   ri   rh   rg   rR   rk   ru   rP   )
rM   rj   rv   rG   r+   r|   rs   rt   r   r\   )r4   rO   rS   r%   r%   r&   r      s*   







zGraphvizSimple.runNr   r   r%   r%   r%   r&   r      r   r   r4   5HTML5Translator | LaTeXTranslator | TexinfoTranslatorfilepathr.   c                 C  s   t |}| }ddd}d}d}t|d||d|D ]M}t|j| \}}	}
}}|	r0q| jj	| j
d }|d	u r?q| jjj| j}||
 }|| jj }tj||d
}t||	|||f}||| d}q|rv|| d	S d	S )zGChange relative links in generated svg files to be relative to imgpath.zhttp://www.w3.org/2000/svgzhttp://www.w3.org/1999/xlink)svgxlinkz"{http://www.w3.org/1999/xlink}hrefFz.//svg:image[@xlink:href]z.//svg:a[@xlink:href]sourceN)startT)ETr3   getrootr   findallr
   attribbuilderr|   path2docrx   appoutdirjoinpathresolveparentimgpathr   relpathr   setwrite)r4   r   treerootns	href_namemodifiedelementschemehostnamerel_uriqueryfragmentrs   doc_dirold_pathimg_pathnew_pathmodified_urlr%   r%   r&   fix_svg_relative_paths   s2   



r   rr   rt   dictformatprefixr)   
str | Nonetuple[str | None, str | None]c              
   C  s&  | d| jjj}|sttd| |t| t| t| jjj  }| dt	|dd
  d| }t| jj|}	t| jj| jj|}
t|
rR|	|
fS t| jdra| jj |radS tt|
 |g}|| jjj |d	| d
|
 g | dd}|rtt| jj|}ntt| jj|}|dkr|dd|
 g ztj|| d|dd}W n: ty   ttd| t| jdsi | j_d| jj|< Y dS  ty } zttd|j|jf |d}~ww t|
sttd|j|jf |dkrt | |
 |	|
fS )z3Render graphviz code into a PNG or PDF output file.ri   z,graphviz_dot executable path must be set! %r-Fr7   ._graphviz_warned_dot)NNz-Tz-ors   indexpngz-Tcmapxz-o%s.mapT)inputcapture_outputcwdcheckzYdot command %r cannot be run (needed for graphviz output), check the graphviz_dot settingz.dot exited with error:
[stderr]
%r
[stdout]
%rNz;dot did not produce an output file:
[stderr]
%r
[stdout]
%rr   )!getr   configri   r    r   r*   graphviz_dot_argsr<   r   r=   	posixpathrG   r   r   r   imagedirisfilehasattrr   r   dirnamerW   srcdir
subprocessr   r   loggerrz   r   stderrstdoutr   )r4   rr   rt   r   r   r)   ri   hashkeyfnamerelfnoutfndot_argsrs   r   retexcr%   r%   r&   
render_dot  sp   
 






r   r   imgclsrg   tuple[str, str]c              
   C  s"  | j jj}z|dvrttd| t| |||||\}	}
W n ty7 } zttd|| tj	|d }~ww |dg|
dg }dtd |}|	d u rZ| j| | tj	|d u ri|
d| | }d|v r{| jd	|d |d f  |d
kr| jd | jd|	|f  | jd|  | jd ne|
d usJ t|
d ddO}t|
d | |d}|jr| jd | jd|	||j|f  | jd | j|  n| jd | jd|	||f  | jd W d    n1 sw   Y  d|v r| jd tj	)N)r   r   z=graphviz_output_format must be one of 'png', 'svg', but is %rdot code %r: %srM   ru    rg   rR   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.mapro   rp   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   rz   r   SkipNoder   rG   filterbodyrA   r<   r   r   r'   r   r2   r0   rH   )r4   rO   rr   rt   r   r   rg   r)   r   r   r   r   ru   mapfileimgmapr%   r%   r&   render_dot_htmlB  sd   
!
r   c                 C  $   t | ||d |d |dd d S Nrr   rt   r)   )r)   )r   r   r4   rO   r%   r%   r&   html_visit_graphvizx     $r   r   c              
   C  s   zt | ||d||\}}W n ty& } zttd|| tj|d }~ww | |}	|	s^d}
d}d|v rV|d dkrAd}
d}n|d dkrLd	}
d
}n
|d dkrVd}
d}| j	d|
  | j	d|  |	sp| j	d|  tj)Npdfr   r(   rR   r^   {z\hspace*{\fill}}r`   z{\hspace*{\fill}}r_   z{\hfillz
%sz\sphinxincludegraphics[]{%s}z%s
)
r   r    r   rz   r   r   r   	is_inliner   rA   )r4   rO   rr   rt   r   r)   r   r   r   r   prepostr%   r%   r&   render_dot_latex|  s4   
r   c                 C  r   r   )r   r   r   r%   r%   r&   latex_visit_graphviz  r   r   r   c              
   C  sr   zt | ||d|\}}W n ty% } zttd|| tj|d }~ww |d ur6| jd|d d   tj)Nr   r   z@image{%s,,,[graphviz],png}
)	r   r    r   rz   r   r   r   r   rA   )r4   rO   rr   rt   r   r   r   r   r%   r%   r&   render_dot_texinfo  s   r   c                 C  s   t | ||d |d  d S )Nrr   rt   )r   r   r%   r%   r&   texinfo_visit_graphviz  s   r   r   c                 C  s:   d|j v r| td|d   tj| td tjNrg   z[graph: %s]z[graph])rT   add_textr   r   r   r   r%   r%   r&   text_visit_graphviz  s
   
r   r   c                 C  s>   d|j v r| jtd|d   tj| jtd tjr   )rT   r   rA   r   r   r   r   r%   r%   r&   man_visit_graphviz  s
   
r   _appr   r   r   c                 C  s"   t tjddd}|j| d S )N	templatesrM   graphviz.css)r   rG   sphinxpackage_dirhtml_static_pathrA   )r   r   css_pathr%   r%   r&   on_config_inited  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)htmllatextexinfotextmanrM   graphdigraphri   r,   r  r   r   r   r   zconfig-initedT)versionparallel_read_safe)add_noderM   r   r   r   r   r   add_directiverd   r   add_config_valueadd_css_fileconnectr  r   __display_version__)r   r%   r%   r&   setup  s    
r  )rN   r   rO   rM   rP   r*   r-   rQ   )r]   r   r-   r*   )r4   r   r   r*   r-   r.   rL   )r4   r   rr   r*   rt   r   r   r*   r   r*   r)   r   r-   r   )rM   NNN)r4   r   rO   rM   rr   r*   rt   r   r   r*   r   r   rg   r   r)   r   r-   r   )r4   r   rO   rM   r-   r.   )r4   r   rO   rM   rr   r*   rt   r   r   r*   r)   r   r-   r.   )r4   r   rO   rM   r-   r.   )rM   )r4   r   rO   rM   rr   r*   rt   r   r   r*   r-   r.   )r4   r   rO   rM   r-   r.   )r4   r   rO   rM   r-   r.   )r4   r   rO   rM   r-   r.   )r   r   r   r   r-   r.   )r   r   r-   r   )XrI   
__future__r   r   rJ   r   xml.etree.ElementTreeetreeElementTreer   hashlibr   	itertoolsr   osr   r   typingr   r   r	   urllib.parser
   r   docutilsr   docutils.parsers.rstr   r   sphinx.errorsr   sphinx.localer   r   sphinx.utilr   sphinx.util.docutilsr   sphinx.util.i18nr   sphinx.util.nodesr   sphinx.util.osutilr   docutils.nodesr   sphinx.applicationr   sphinx.configr   sphinx.util.typingr   r   sphinx.writers.html5r   sphinx.writers.latexr   sphinx.writers.manpager   sphinx.writers.texinfor   sphinx.writers.textr   	getLoggerr!   r   r    r'   GeneralInlineElementrM   r\   rb   rd   r   r   r   r   r   r   r   r   r   r   r   r  r  r%   r%   r%   r&   <module>   sr    
*

E
,&?
6
"



