3

T'íc¶=ã@sÒdZddlZddlZddlZddlmZddlmZmZddlm	Z	m
Z
mZmZddl
mZddlmZddlmZmZddlZdd	lmZdd
lmZddlmZmZddlmZmZdd
lm Z m!Z!ddl"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1ddl2m3Z3ddl4m5Z5ej6e7ƒZ8Gdd„deƒZ9Gdd„dƒZ:Gdd„dej;ej<ej=ƒZ>ee>e?ej@dœdd „ZAe	e?d!œd"d#„ZBGd$d%„d%e ƒZCGd&d'„d'e ƒZDdEe!e?e
e?e?e?ee?e?fd(œd)d*„ZEdFe-e>e?e
e?e?e?e?ee?e?fd+œ	d,d-„ZFe-e>dd.œd/d0„ZGdGe/e>e?e
e?e?dd1œd2d3„ZHe/e>dd.œd4d5„ZIdHe3e>e?e
e?dd6œd7d8„ZJe3e>dd.œd9d:„ZKe5e>dd.œd;d<„ZLe1e>dd.œd=d>„ZMeeNdd?œd@dA„ZOee
e?e	fdBœdCdD„ZPdS)IzNAllow graphviz-formatted graphs to be included inline in generated documents.
éN)Úpath)ÚPIPEÚCalledProcessError)ÚAnyÚDictÚListÚ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@seZdZdZdS)Ú
GraphvizErrorzGraphviz errorN)Ú__name__Ú
__module__Ú__qualname__Úcategory©r$r$ú5/tmp/pip-build-gk9425m9/sphinx/sphinx/ext/graphviz.pyr#src@sZeZdZdZejdƒZejdƒZdeeeddœdd„Z	dedd	œd
d„Z
edœd
d„ZdS)ÚClickableMapDefinitionz1A manipulator for clickable map file of graphviz.z<map id="(.*?)"z
href=".*?"ÚN)ÚfilenameÚcontentÚdotÚreturncCs,d|_||_|jƒ|_g|_|j|ddS)N)r*)Úidr(Ú
splitlinesr)Ú	clickableÚparse)Úselfr(r)r*r$r$r%Ú__init__,s

zClickableMapDefinition.__init__)r*r+cCs¢|jj|jdƒ}|s$td|jƒ‚|jdƒ|_|jdkrvt|jƒƒj	ƒ}d|dd…|_|jdj
d|jƒ|jd<x&|jD]}|jj|ƒr~|j
j|ƒq~WdS)Nrz$Invalid clickable map file found: %séz%3z	grapviz%sé
iöÿÿÿ)Ú	maptag_reÚmatchr)rr(Úgroupr,rÚencodeÚ	hexdigestÚreplaceÚhref_reÚsearchr.Úappend)r0r*ÚmatchedÚhashedÚliner$r$r%r/4s
zClickableMapDefinition.parse)r+cCs2|jr*dj|jdg|j|jdgƒSdSdS)zvGenerate clickable map tags if clickable item exists.

        If not exists, this only returns empty string.
        Ú
rr2r'Néÿÿÿÿ)r.Újoinr))r0r$r$r%Úgenerate_clickable_mapEs$z-ClickableMapDefinition.generate_clickable_map)r')N)r r!r"Ú__doc__ÚreÚcompiler4r:Ústrr1r/rCr$r$r$r%r&'s

r&c@seZdZdS)ÚgraphvizN)r r!r"r$r$r$r%rHPsrH)Ú	directiveÚnodeÚcaptionr+cCsjtjd|ƒ}d|kr$|jjdƒ|d<|jj||jƒ\}}tj|df|žŽ}|j|ƒt	||ƒ||7}|S)Nr'Úalign)
r	ÚfigureÚ
attributesÚpopÚstateZinline_textÚlinenorKÚextendr)rIrJrKZfigure_nodeÚinodesÚmessagesZcaption_noder$r$r%Úfigure_wrapperTs

rU)Úargumentr+cCstj|dƒS)NÚleftÚcenterÚright)rWrXrY)rÚchoice)rVr$r$r%Ú
align_specasr[c@sXeZdZUdZdZdZdZdZej	e
ej	ej	ej	ej	ejdœZe
eedœdd	„Zd
S)ÚGraphvizz3
    Directive to insert arbitrary dot markup.
    Trr2F)ÚaltrLrKÚlayoutÚgraphviz_dotÚnameÚclass)r+c	CsØ|jr®|jj}|jr,|jjtdƒ|jdgSt|jd|j	ƒ}|j	j
|ƒ\}}|j	j|ƒy$t|dd}|j
ƒ}WdQRXWqàtk
rª|jjtdƒ||jdgSXn2dj|jƒ}d}|jƒsà|jjjtdƒ|jdgStƒ}||d	<d
|j	ji|d<d|jkr|jd|dd<d
|jkr:|jd
|dd<d|jkrT|jd|d<d|jkrn|jd|d<d|jkrˆ|jd|d<|r–||d<d|jkr²|j|ƒ|gSt|||jdƒ}|j|ƒ|gSdS)NzCGraphviz directive cannot have both content and a filename argument)r?rzutf-8)Úencodingz8External Graphviz file %r not found or reading it failedr@z.Ignoring "graphviz" directive without content.ÚcodeÚdocnameÚoptionsr_r^r]rLraÚclassesr(rK)Ú	argumentsrPÚdocumentr)ZreporterÚwarningrrQrÚenvZ
relfn2pathZnote_dependencyÚopenÚreadÚOSErrorrBÚstripZ
state_machinerHrdreÚadd_namerU)	r0rhrVZrel_filenamer(ÚfpZdotcoderJrMr$r$r%ÚrunwsV

zGraphviz.runN)r r!r"rDÚhas_contentÚrequired_argumentsÚoptional_argumentsÚfinal_argument_whitespacerÚ	unchangedr[Úclass_optionÚoption_specrrr
rqr$r$r$r%r\es
r\c@sXeZdZUdZdZdZdZdZej	e
ej	ej	ej	ej	ejdœZe
eedœdd	„Zd
S)ÚGraphvizSimplez3
    Directive to insert arbitrary dot markup.
    Tr2rF)r]rLrKr^r_r`ra)r+cCsøtƒ}d|j|jddj|jƒf|d<d|jji|d<d|jkrT|jd|dd<d|jkrp|jd|dd<d	|jkrˆ|jd	|d	<d
|jkr |jd
|d
<d|jkr¸|jd|d<d
|jkrÒ|j|ƒ|gSt	|||jd
ƒ}|j|ƒ|gSdS)Nz
%s %s {
%s
}
rr@rcrdrer_r^r]rLrarfrK)
rHr`rgrBr)rjrdrerorU)r0rJrMr$r$r%rq»s( 







zGraphvizSimple.runN)r r!r"rDrrrsrtrurrvr[rwrxrrr
rqr$r$r$r%ry©s
ry)r0rcreÚformatÚprefixr(r+cCs
|jd|jjjƒ}|t|ƒt|ƒt|jjjƒjƒ}d|t|ƒjƒ|f}t	j
|jj|ƒ}	tj
|jj
|jj|ƒ}
tj|
ƒr†|	|
fSt|jdƒr¤|jjj|ƒr¤dSttj|
ƒƒ|g}|j|jjjƒ|jd|d|
gƒ|jddƒ}|rtjtj
|jj|ƒƒ}
ntjtj
|jj|ƒƒ}
|d	kr:|jd
d|
gƒyFtj||jƒtt|
dd
}tj|
ƒszttdƒ|j|jfƒ‚|	|
fStk
rÈtjtdƒ|ƒt|jdƒs¸i|j_d|jj|<dSt k
r}z ttdƒ|j|jfƒ|‚WYdd}~XnXdS)z3Render graphviz code into a PNG or PDF output file.r_z%s-%s.%sÚ_graphviz_warned_dotNz-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]
%r)NN)NN)!ÚgetÚbuilderÚconfigr_rGÚgraphviz_dot_argsr7rr8Ú	posixpathrBZimgpathrÚoutdirZimagedirÚisfileÚhasattrr|rÚdirnamerRÚsrcdirÚ
subprocessrqrrrrr€rmÚloggerrir)r0rcrerzr{r(r_ZhashkeyÚfnameZrelfnÚoutfnZdot_argsrdr‚ÚretÚexcr$r$r%Ú
render_dotÔsL



r”)	r0rJrcrer{Úimgclsr]r(r+cCs|jjj}y2|dkr$ttdƒ|ƒ‚t||||||ƒ\}	}
Wn<tk
rx}z tjtdƒ||ƒtj	|‚WYdd}~XnX|dg|j
dgƒ}djtd|ƒƒ}|	dkr¼|j
j|j|ƒƒnN|dkrÚ|j
d|j|ƒjƒƒ}d	|kr|j
jd
|d	|d	fƒ|dkrH|j
jdƒ|j
jd|	|fƒ|j
jd
|ƒ|j
jdƒn¬t|
ddd–}
t|
d|
jƒ|d}|jr¼|j
jdƒ|j
jd|	||j|fƒ|j
jdƒ|j
j|jƒƒn.|j
jdƒ|j
jd|	||fƒ|j
jdƒWdQRXd	|kr
|j
jdƒtj	‚dS)Nr~Úsvgz=graphviz_output_format must be one of 'png', 'svg', but is %rzdot code %r: %srHrfú r]rLz!<div align="%s" class="align-%s">z<div class="graphviz">z3<object data="%s" type="image/svg+xml" class="%s">
z<p class="warning">%s</p>z</object></div>
z.mapzutf-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–)r…r†Úgraphviz_output_formatrrr”rrir	ÚSkipNoder„rBÚfilterÚbodyr<r7rnrkr&rlr.r,rC)r0rJrcrer{r•r]r(rzrr‘r“rfZmapfileZimgmapr$r$r%Úrender_dot_htmlsN



rœ)r0rJr+cCs$t|||d|d|jdƒddS)Nrcrer()r()rœr„)r0rJr$r$r%Úhtml_visit_graphviz<sr)r0rJrcrer{r(r+cCsôyt|||d||ƒ\}}Wn<tk
rV}z tjtdƒ||ƒtj|‚WYdd}~XnX|j|ƒ}	|	sÆd}
d}d|kr¶|ddkrŒd}
d}n*|ddkr¢d	}
d
}n|ddkr¶d}
d}|jj	d
|
ƒ|jj	d|ƒ|	sê|jj	d|ƒtj‚dS)NZpdfzdot code %r: %sr'rLrWÚ{z\hspace*{\fill}}rYz{\hspace*{\fill}Ú}rXz{\hfillz
%sz\sphinxincludegraphics[]{%s}z%s
)
r”rrrirr	r™Ú	is_inliner›r<)r0rJrcrer{r(rr‘r“r ÚpreÚpostr$r$r%Úrender_dot_latex@s0
r£cCs$t|||d|d|jdƒddS)Nrcrer()r()r£r„)r0rJr$r$r%Úlatex_visit_graphvizbsr¤)r0rJrcrer{r+cCs€yt|||d|ƒ\}}Wn<tk
rT}z tjtdƒ||ƒtj|‚WYdd}~XnX|dk	rv|jjd|dd…ƒtj‚dS)Nr~zdot code %r: %sz@image{%s,,,[graphviz],png}
ééüÿÿÿ)	r”rrrirr	r™r›r<)r0rJrcrer{rr‘r“r$r$r%Úrender_dot_texinfofsr§cCst|||d|dƒdS)Nrcre)r§)r0rJr$r$r%Útexinfo_visit_graphvizrsr¨cCs:d|jkr"|jtdƒ|dƒn|jtdƒƒtj‚dS)Nr]z[graph: %s]z[graph])rNÚadd_textrr	r™)r0rJr$r$r%Útext_visit_graphvizvs
rªcCs>d|jkr$|jjtdƒ|dƒn|jjtdƒƒtj‚dS)Nr]z[graph: %s]z[graph])rNr›r<rr	r™)r0rJr$r$r%Úman_visit_graphviz~s
r«)Úappr“r+cCsB|dkr>|jjdkr>tjtjdddƒ}tj|jdƒ}t||ƒdS)NÚhtmlZ	templatesrHzgraphviz.cssZ_static)r…rzrrBÚsphinxÚpackage_dirr‰r)r¬r“ÚsrcÚdstr$r$r%Úon_build_finished†sr²)r¬r+cCsš|jttdftdftdftdftdfd|jdtƒ|jdt	ƒ|jdt	ƒ|j
dddƒ|j
dgdƒ|j
d	d
dƒ|jdƒ|jdt
ƒtjd
dœS)N)r­ZlatexZtexinfoÚtextZmanrHÚgraphZdigraphr_r*r­r‡r˜r~zgraphviz.csszbuild-finishedT)ÚversionZparallel_read_safe)Úadd_noderHrr¤r¨rªr«Z
add_directiver\ryZadd_config_valueZadd_css_fileÚconnectr²r®Z__display_version__)r¬r$r$r%Úsetups
r¸)rHN)rHNNN)rHN)rH)QrDrˆrErŽÚosrrrÚtypingrrrrZdocutilsr	Zdocutils.nodesr
Zdocutils.parsers.rstrrr®Zsphinx.applicationr
Z
sphinx.errorsrZ
sphinx.localerrZsphinx.utilrrZsphinx.util.docutilsrrZsphinx.util.fileutilrZsphinx.util.i18nrZsphinx.util.nodesrZsphinx.util.osutilrZsphinx.util.typingrZsphinx.writers.htmlrZsphinx.writers.latexrZsphinx.writers.manpagerZsphinx.writers.texinforZsphinx.writers.textrÚ	getLoggerr rrr&ZGeneralZInlineÚElementrHrGrMrUr[r\ryr”rœrr£r¤r§r¨rªr«Ú	Exceptionr²r¸r$r$r$r%Ú<module>s\
)
D,$4(2