ó
öÀ„\c           @   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 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 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" m# Z# m$ Z$ m% Z% e& rd d l m' Z' d d l( m) Z) m* Z* m+ Z+ m, Z, d d l- m. Z. n  e j/ e0 ƒ Z1 d e f d „  ƒ  YZ2 d e3 f d „  ƒ  YZ4 d e j5 e j6 e j7 f d „  ƒ  YZ8 d „  Z9 d „  Z: d e f d „  ƒ  YZ; d e f d „  ƒ  YZ< d d  „ Z= d d d d! „ Z? d" „  Z@ d d# „ ZA d$ „  ZB d d% „ ZC d& „  ZD d' „  ZE d( „  ZF d) „  ZG d* „  ZH d S(+   s  
    sphinx.ext.graphviz
    ~~~~~~~~~~~~~~~~~~~

    Allow graphviz-formatted graphs to be included in Sphinx-generated
    documents inline.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
iÿÿÿÿN(   t   sha1(   t   path(   t   Popent   PIPE(   t   nodes(   t
   directives(   t   ViewList(   t	   text_type(   t   SphinxError(   t   _t   __(   t   logging(   t   SphinxDirective(   t
   copy_asset(   t   search_image_for_language(   t	   ensuredirt   ENOENTt   EPIPEt   EINVAL(   t	   Directive(   t   Anyt   Dictt   Listt   Tuple(   t   Sphinxt   GraphvizErrorc           B   s   e  Z d  Z RS(   s   Graphviz error(   t   __name__t
   __module__t   category(    (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyR   +   s   t   ClickableMapDefinitionc           B   sM   e  Z d  Z e j d ƒ Z e j d ƒ Z d d „ Z d d „ Z	 d „  Z
 RS(   s1   A manipulator for clickable map file of graphviz.s   <map id="(.*?)"s
   href=".*?"t    c         C   s>   d  |  _ | |  _ | j ƒ  |  _ g  |  _ |  j d | ƒ d  S(   Nt   dot(   t   Nonet   idt   filenamet
   splitlinest   contentt	   clickablet   parse(   t   selfR"   R$   R   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   __init__4   s
    			c         C   så   |  j  j |  j d ƒ } | s5 t d |  j ƒ ‚ n  | j d ƒ |  _ |  j d k r¨ t | j d ƒ ƒ j	 ƒ  } d | d |  _ |  j d j
 d |  j ƒ |  j d <n  x6 |  j D]+ } |  j j | ƒ r² |  j j | ƒ q² q² Wd  S(   Ni    s$   Invalid clickable map file found: %si   s   %3s   utf-8s	   grapviz%siöÿÿÿ(   t	   maptag_ret   matchR$   R   R"   t   groupR!   R    t   encodet	   hexdigestt   replacet   href_ret   searchR%   t   append(   R'   R   t   matchedt   hashedt   line(    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyR&   =   s    &c         C   s=   |  j  r5 d j |  j d g |  j  |  j d g ƒ Sd Sd S(   sv   Generate clickable map tags if clickable item exists.

        If not exists, this only returns empty string.
        s   
i    iÿÿÿÿR   N(   R%   t   joinR$   (   R'   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   generate_clickable_mapO   s    	,N(   R   R   t   __doc__t   ret   compileR)   R/   R(   R    R&   R6   (    (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyR   /   s   	t   graphvizc           B   s   e  Z RS(    (   R   R   (    (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyR:   [   s   c         C   s¼   t  j d | ƒ } d | k r7 | j j d ƒ | d <n  t  j ƒ  } |  j j t | g d d ƒ|  j | ƒ t  j	 | d j
 d | d j Œ } | d j | _ | d j | _ | | 7} | S(   NR   t   alignt   sourcei    (   R   t   figuret
   attributest   popt   Elementt   statet   nested_parseR   t   content_offsett   captiont	   rawsourcet   childrenR<   R4   (   t	   directivet   nodeRD   t   figure_nodet   parsedt   caption_node(    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   figure_wrapper_   s    
c         C   s   t  j |  d ƒ S(   Nt   leftt   centert   right(   RM   RN   RO   (   R   t   choice(   t   argument(    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt
   align_specp   s    t   Graphvizc           B   sd   e  Z d  Z e Z d Z d Z e Z i e	 j
 d 6e d 6e	 j
 d 6e	 j
 d 6e	 j
 d 6Z d „  Z RS(	   s3   
    Directive to insert arbitrary dot markup.
    i    i   t   altR;   RD   t   graphviz_dott   namec   	      C   s
  |  j  rï |  j j } |  j r@ | j j t d ƒ d |  j ƒg St |  j  d |  j	 ƒ } |  j	 j
 | ƒ \ } } |  j	 j | ƒ y. t j | d d ƒ  } | j ƒ  } Wd  QXWq2t t f k
 rë | j j t d ƒ | d |  j ƒg SXnC d j |  j ƒ } | j ƒ  s2|  j j j t d ƒ d |  j ƒg St ƒ  } | | d	 <i |  j	 j d
 6| d <d |  j k rƒ|  j d | d d <n  d |  j k r¦|  j d | d <n  d |  j k rÉ|  j d | d <n  |  j j d ƒ } | röt |  | | ƒ } n  |  j | ƒ | g S(   NsC   Graphviz directive cannot have both content and a filename argumentR4   i    t   rs   utf-8s8   External Graphviz file %r not found or reading it faileds   
s.   Ignoring "graphviz" directive without content.t   codet   docnamet   optionsRU   RT   R;   RD   (   t	   argumentsRA   t   documentR$   t   reportert   warningR
   t   linenoR   t   envt
   relfn2patht   note_dependencyt   codecst   opent   readt   IOErrort   OSErrorR5   t   stript   state_machineR:   RY   RZ   t   getRL   t   add_name(	   R'   R\   RQ   t   rel_filenameR"   t   fpt   dotcodeRH   RD   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   run…   sF    						
(   R   R   R7   t   Truet   has_contentt   required_argumentst   optional_argumentst   Falset   final_argument_whitespaceR   t	   unchangedRR   t   option_specRo   (    (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyRS   u   s   


t   GraphvizSimplec           B   sd   e  Z d  Z e Z d Z d Z e Z i e	 j
 d 6e d 6e	 j
 d 6e	 j
 d 6e	 j
 d 6Z d „  Z RS(	   s3   
    Directive to insert arbitrary dot markup.
    i   i    RT   R;   RD   RU   RV   c         C   sû   t  ƒ  } d |  j |  j d d j |  j ƒ f | d <i |  j j d 6| d <d |  j k rt |  j d | d d <n  d |  j k r— |  j d | d <n  d	 |  j k rº |  j d	 | d	 <n  |  j j d
 ƒ } | rç t	 |  | | ƒ } n  |  j
 | ƒ | g S(   Ns   %s %s {
%s
}
i    s   
RX   RY   RZ   RU   RT   R;   RD   (   R:   RV   R[   R5   R$   R`   RY   RZ   Rj   RL   Rk   (   R'   RH   RD   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyRo   À   s    	*(   R   R   R7   Rp   Rq   Rr   Rs   Rt   Ru   R   Rv   RR   Rw   Ro   (    (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyRx   °   s   


c      
   C   s.  | j  d |  j j j ƒ } | t | ƒ t | ƒ t |  j j j ƒ j d ƒ } d | t | ƒ j ƒ  | f } t	 j
 |  j j | ƒ } t j
 |  j j |  j j | ƒ }	 t j |	 ƒ rÂ | |	 f St |  j d ƒ rí |  j j j  | ƒ rí d St t j |	 ƒ ƒ t | t ƒ r!| j d ƒ } n  | g }
 |
 j |  j j j ƒ |
 j d | d |	 g ƒ | j  d d ƒ } t j t j
 |  j j | ƒ ƒ } | d	 k r´|
 j d
 d |	 g ƒ n  y( t |
 d t d t d t d | ƒ} Wnp t k
 rN} | j t k r‚  n  t j t  d ƒ | ƒ t |  j d ƒ s:i  |  j _ n  t! |  j j | <d SXy | j" | ƒ \ } } Wn] t t# f k
 rÇ} | j t$ t% f k r›‚  n  | j& j' ƒ  | j( j' ƒ  } } | j) ƒ  n X| j* d k röt+ t  d ƒ | | f ƒ ‚ n  t j |	 ƒ s$t+ t  d ƒ | | f ƒ ‚ n  | |	 f S(   s3   Render graphviz code into a PNG or PDF output file.RU   s   utf-8s   %s-%s.%st   _graphviz_warned_dots   -Ts   -oRY   t   indext   pngs   -Tcmapxs   -o%s.mapt   stdoutt   stdint   stderrt   cwdsY   dot command %r cannot be run (needed for graphviz output), check the graphviz_dot settingi    s.   dot exited with error:
[stderr]
%s
[stdout]
%ss;   dot did not produce an output file:
[stderr]
%s
[stdout]
%sN(   NN(   NN(,   Rj   t   buildert   configRU   t   strt   graphviz_dot_argsR,   R    R-   t	   posixpathR5   t   imgpathR   t   outdirt   imagedirt   isfilet   hasattrRy   R    R   t   dirnamet
   isinstanceR   t   extendt   srcdirR   R   Rg   t   errnoR   t   loggerR^   R
   Rp   t   communicateRf   R   R   R|   Re   R~   t   waitt
   returncodeR   (   R'   RX   RZ   t   formatt   prefixRU   t   hashkeyt   fnamet   relfnt   outfnt   dot_argsRY   R   t   pt   errR|   R~   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt
   render_dotÕ   s\    !
	!(c      
   C   s¥  |  j  j j } yG | d k r7 t t d ƒ | ƒ ‚ n  t |  | | | | ƒ \ } }	 Wn; t k
 r“ }
 t j t d ƒ | t |
 ƒ ƒ t	 j
 ‚ n X| r§ | d 7} n d } | d  k rÕ |  j j |  j | ƒ ƒ nÃ| d  k r| j d |  j | ƒ j ƒ  ƒ } n  d | k r6|  j j d	 | d | d f ƒ n  | d k r“|  j j d
 ƒ |  j j d | | f ƒ |  j j d | ƒ |  j j d ƒ næ t j |	 d d d d ƒÈ } t |	 d | j ƒ  d | ƒ} | j r6|  j j d
 ƒ |  j j d | | | j | f ƒ |  j j d ƒ |  j j | j ƒ  ƒ n= |  j j d
 ƒ |  j j d | | | f ƒ |  j j d ƒ Wd  QXd | k r˜|  j j d ƒ n  t	 j
 ‚ d  S(   NR{   t   svgs=   graphviz_output_format must be one of 'png', 'svg', but is %rs   dot code %r: %ss	    graphvizR:   RT   R;   s!   <div align="%s" class="align-%s">s   <div class="graphviz">s3   <object data="%s" type="image/svg+xml" class="%s">
s   <p class="warning">%s</p>s   </object></div>
s   .mapRW   t   encodings   utf-8R   s1   <img src="%s" alt="%s" usemap="#%s" class="%s" />s   </div>
s$   <img src="%s" alt="%s" class="%s" />(   R{   R   (   R€   R   t   graphviz_output_formatR   R
   Rœ   R   R^   R   R   t   SkipNodeR    t   bodyR1   R,   Rj   Rh   Rc   Rd   R   Re   R%   R!   R6   (   R'   RH   RX   RZ   R”   t   imgclsRT   R“   R–   R˜   t   exct   mapfilet   imgmap(    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   render_dot_html  sP    "$	c         C   s   t  |  | | d | d ƒ d  S(   NRX   RZ   (   R¦   (   R'   RH   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   html_visit_graphvizK  s    c         C   sB  y" t  |  | | d | ƒ \ } } Wn; t k
 r_ } t j t d ƒ | t | ƒ ƒ t j ‚ n X|  j | ƒ } | sd }	 d }
 d | k rí | d d k r¬ d }	 d }
 qí | d d k rË d	 }	 d
 }
 qí | d d k rí d }	 d }
 qí n  |  j	 j
 d |	 ƒ n  |  j	 j
 d | ƒ | s5|  j	 j
 d |
 ƒ n  t j ‚ d  S(   Nt   pdfs   dot code %r: %sR   R;   RM   t   {s   \hspace*{\fill}}RO   s   {\hspace*{\fill}t   }RN   s   {\hfills   
%ss   \sphinxincludegraphics[]{%s}s   %s
(   Rœ   R   R   R^   R
   R   R   R    t	   is_inlineR¡   R1   (   R'   RH   RX   RZ   R”   R–   R˜   R£   R«   t   pret   post(    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   render_dot_latexP  s0    "		c         C   s   t  |  | | d | d ƒ d  S(   NRX   RZ   (   R®   (   R'   RH   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   latex_visit_graphvizq  s    c         C   s”   y" t  |  | | d | ƒ \ } } Wn; t k
 r_ } t j t d ƒ | t | ƒ ƒ t j ‚ n X| d  k	 r‡ |  j	 j
 d | d  ƒ n  t j ‚ d  S(   NR{   s   dot code %r: %ss   @image{%s,,,[graphviz],png}
iüÿÿÿ(   Rœ   R   R   R^   R
   R   R   R    R    R¡   R1   (   R'   RH   RX   RZ   R”   R–   R˜   R£   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   render_dot_texinfov  s    "c         C   s   t  |  | | d | d ƒ d  S(   NRX   RZ   (   R°   (   R'   RH   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   texinfo_visit_graphviz‚  s    c         C   sM   d | j  k r- |  j t d ƒ | d ƒ n |  j t d ƒ ƒ t j ‚ d  S(   NRT   s   [graph: %s]s   [graph](   R>   t   add_textR	   R   R    (   R'   RH   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   text_visit_graphviz‡  s    c         C   sS   d | j  k r0 |  j j t d ƒ | d ƒ n |  j j t d ƒ ƒ t j ‚ d  S(   NRT   s   [graph: %s]s   [graph](   R>   R¡   R1   R	   R   R    (   R'   RH   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   man_visit_graphviz  s    !c         C   sP   | d  k rL t j t j d d d ƒ } t j |  j d ƒ } t | | ƒ n  d  S(   Nt	   templatesR:   s   graphviz.csst   _static(   R    R   R5   t   sphinxt   package_dirR†   R   (   t   appR£   t   srct   dst(    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   on_build_finished™  s    c         C   sä   |  j  t d t d  f d t d  f d t d  f d t d  f d t d  f ƒ|  j d t	 ƒ |  j d t
 ƒ |  j d t
 ƒ |  j d	 d
 d ƒ |  j d g  d ƒ |  j d d d ƒ |  j d ƒ |  j d t ƒ i t j d 6t d 6S(   Nt   htmlt   latext   texinfot   textt   manR:   t   grapht   digraphRU   R   Rƒ   RŸ   R{   s   graphviz.csss   build-finishedt   versiont   parallel_read_safe(   t   add_nodeR:   R§   R    R¯   R±   R³   R´   t   add_directiveRS   Rx   t   add_config_valuet   add_css_filet   connectR¼   R·   t   __display_version__Rp   (   R¹   (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   setup¡  s    (I   R7   Rc   R„   R8   t   hashlibR    t   osR   t
   subprocessR   R   t   docutilsR   t   docutils.parsers.rstR   t   docutils.statemachineR   t   sixR   R·   t   sphinx.errorsR   t   sphinx.localeR	   R
   t   sphinx.utilR   t   sphinx.util.docutilsR   t   sphinx.util.fileutilR   t   sphinx.util.i18nR   t   sphinx.util.osutilR   R   R   R   Rt   R   t   typingR   R   R   R   t   sphinx.applicationR   t	   getLoggerR   R   R   t   objectR   t   Generalt   InlineR@   R:   RL   RR   RS   Rx   Rœ   R    R¦   R§   R®   R¯   R°   R±   R³   R´   R¼   RÌ   (    (    (    s2   lib/python2.7/site-packages/sphinx/ext/graphviz.pyt   <module>   sT   "",%		;%@5	!							