ó
öÀ„\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	 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 m Z d d l m Z e r5d d l m Z m Z m Z m  Z  d d l! m" Z" d d l# m$ Z$ n  e j% e& ƒ Z' d e f d „  ƒ  YZ( d e( f d „  ƒ  YZ) d d „ Z+ d „  Z, d e f d „  ƒ  YZ- d e. f d „  ƒ  YZ/ d e f d „  ƒ  YZ0 d „  Z1 d S(   s©   
    sphinx.directives.code
    ~~~~~~~~~~~~~~~~~~~~~~

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
iÿÿÿÿN(   t   unified_diff(   t   nodes(   t
   directives(   t   ViewList(   t	   text_type(   t   addnodes(   t   RemovedInSphinx40Warning(   t   __(   t   logging(   t   parselinenos(   t   SphinxDirective(   t   set_source_info(   t   Anyt   Dictt   Listt   Tuple(   t   Sphinx(   t   Configt	   Highlightc           B   s?   e  Z d  Z e Z d Z d Z e Z i e j	 d 6Z
 d „  Z RS(   st   
    Directive to set the highlighting language for code blocks, as well
    as the threshold for line numbers.
    i   i    t   linenothresholdc         C   s>   |  j  j d t j ƒ } t j d |  j d j ƒ  d | ƒ g S(   NR   t   langi    (   t   optionst   gett   syst   maxsizeR   t   highlightlangt	   argumentst   strip(   t   selfR   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyt   run3   s    (   t   __name__t
   __module__t   __doc__t   Falset   has_contentt   required_argumentst   optional_argumentst   final_argument_whitespaceR   t   positive_intt   option_specR   (    (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR   %   s   t   HighlightLangc           B   s   e  Z d  Z d „  Z RS(   s$   highlightlang directive (deprecated)c         C   s#   t  j d t d d ƒt j |  ƒ S(   NsN   highlightlang directive is deprecated. Please use highlight directive instead.t
   stackleveli   (   t   warningst   warnR   R   R   (   R   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR   =   s    	(   R   R   R    R   (    (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR(   :   s   c            s“   ˆ  s
 |  St  ‡  f d †  |  Dƒ ƒ rB t j t d ƒ d | ƒn  g  } xD |  D]< } | ˆ  } | j d ƒ r~ | r~ d } n  | j | ƒ qO W| S(   Nc         3   s   |  ] } | ˆ   j  ƒ  Vq d  S(   N(   R   (   t   .0t   s(   t   dedent(    s5   lib/python2.7/site-packages/sphinx/directives/code.pys	   <genexpr>J   s    s   Over dedent has detectedt   locations   
(   t   anyt   loggert   warningR   t   endswitht   append(   t   linesR.   R/   t	   new_linest   linet   new_line(    (   R.   s5   lib/python2.7/site-packages/sphinx/directives/code.pyt   dedent_linesE   s    
	c         C   sä   t  j d d t d d g ƒ} t  j ƒ  } |  j j t | g d d ƒ|  j | ƒ t | d t  j	 ƒ r‘ t
 d | d j ƒ  ƒ } t | ƒ ‚ n  t  j | d j d | d j Œ } | j | _ | j | _ | | 7} | | 7} | S(   Nt    t   literal_blockt   classess   literal-block-wrappert   sourcei    s   Invalid caption: %s(   R   t	   containert   Truet   Elementt   statet   nested_parseR   t   content_offsett
   isinstancet   system_messageR   t   astextt
   ValueErrort   captiont	   rawsourcet   childrenR=   R7   (   t	   directivet   literal_nodeRH   t   container_nodet   parsedt   msgt   caption_node(    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyt   container_wrapperW   s    

t	   CodeBlockc           B   su   e  Z d  Z e Z d Z d Z e Z i e	 j
 d 6e d 6e d 6e	 j d 6e	 j d 6e	 j d 6e	 j d	 6Z d
 „  Z RS(   s^   
    Directive for a code block with special highlighting or line numbering
    settings.
    i   i    t   linenosR.   s   lineno-starts   emphasize-linesRH   t   classt   namec            s³  |  j  j } d j |  j ƒ } |  j j |  j ƒ } |  j j d ƒ } | ry” t	 |  j ƒ ‰  t
 | ˆ  ƒ } t ‡  f d †  | Dƒ ƒ rµ t j t d ƒ ˆ  |  j d f d | ƒn  g  | D] } | ˆ  k  r¼ | d ^ q¼ } Wqt k
 r} | j j t | ƒ d |  j ƒg SXn d  } d |  j k r~|  j j |  j ƒ } | j d	 ƒ } t | |  j d d | ƒ} d	 j | ƒ } n  t j | | ƒ }	 |  j d
 |	 d <d |  j k p¼d |  j k |	 d <|	 d c |  j j d g  ƒ 7<i  }
 |	 d <| d  k	 r	| |
 d <n  d |  j k r,|  j d |
 d <n  t |  |	 ƒ |  j j d ƒ } | rŸy t |  |	 | ƒ }	 WqŸt k
 r›} | j j t | ƒ d |  j ƒg SXn  |  j |	 ƒ |	 g S(   Nu   
s   emphasize-linesc         3   s   |  ] } | ˆ  k Vq d  S(   N(    (   R,   t   i(   t   nlines(    s5   lib/python2.7/site-packages/sphinx/directives/code.pys	   <genexpr>‰   s    s*   line number spec is out of range(1-%d): %rR/   i   R7   R.   s   
i    t   languageRS   s   lineno-startR<   RT   t   highlight_argst   hl_linest   linenostartRH   (   RA   t   documentt   joint   contentt   state_machinet   get_source_and_linet   linenoR   R   t   lenR	   R0   R1   R2   R   RG   t   reportert   strt   Nonet   splitR9   R   R;   R   R   RQ   R   t   add_name(   R   R\   t   codeR/   t   linespecRZ   t   xt   errR5   t   literalt
   extra_argsRH   t   exc(    (   RW   s5   lib/python2.7/site-packages/sphinx/directives/code.pyR   ~   sP    
-&&(   R   R   R    R?   R"   R#   R$   R!   R%   R   t   flagt   intt   unchanged_requiredt   class_optiont	   unchangedR'   R   (    (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyRR   j   s   



t   LiteralIncludeReaderc           B   s¿   e  Z d d d d d d d d d d  d! d" d# g Z d „  Z d „  Z d$ d „ Z d$ d „ Z d$ d „ Z d$ d „ Z	 d$ d „ Z
 d$ d „ Z d$ d „ Z d$ d „ Z d$ d „ Z d$ d „ Z RS(%   s   lineno-matchs   lineno-startR4   t   prepends   start-afters   start-ats
   end-befores   end-att   difft   pyobjectR5   c         C   sP   | |  _  | |  _ | j d | j ƒ |  _ |  j j d d ƒ |  _ |  j ƒ  d  S(   Nt   encodings   lineno-starti   (   t   filenameR   R   t   source_encodingRx   t   lineno_startt   parse_options(   R   Ry   R   t   config(    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyt   __init__Å   s
    		c         C   s[   xT |  j  D]I \ } } | |  j k r
 | |  j k r
 t t d ƒ | | f ƒ ‚ q
 q
 Wd  S(   Ns%   Cannot use both "%s" and "%s" options(   t   INVALID_OPTIONS_PAIRR   RG   R   (   R   t   option1t   option2(    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR|   Î   s    c         C   sÏ   yl t  j | d |  j d d ƒH } | j ƒ  } d |  j k rX | j |  j d ƒ } n  | j t ƒ SWd  QXWn\ t t	 f k
 r› t t
 d ƒ | ƒ ‚ n0 t k
 rÊ t t
 d ƒ |  j | f ƒ ‚ n Xd  S(   Nt   rt   errorst   stricts	   tab-widths.   Include file %r not found or reading it faileds`   Encoding %r used for reading included file %r seems to be wrong, try giving an :encoding: option(   t   codecst   openRx   t   readR   t
   expandtabst
   splitlinesR?   t   IOErrort   OSErrorR   t   UnicodeError(   R   Ry   R/   t   ft   text(    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyt	   read_fileÕ   s    !c         C   s¢   d |  j  k r |  j ƒ  } nk |  j |  j |  j |  j |  j |  j |  j g } |  j	 |  j
 d | ƒ} x  | D] } | | d | ƒ} qm Wd j | ƒ t | ƒ f S(   NRv   R/   R:   (   R   t	   show_difft   pyobject_filtert   start_filtert
   end_filtert   lines_filtert   prepend_filtert   append_filtert   dedent_filterR   Ry   R]   Rb   (   R   R/   R5   t   filterst   func(    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR‡   å   s    c         C   sU   |  j  |  j ƒ } |  j j d ƒ } |  j  | ƒ } t | | | |  j ƒ } t | ƒ S(   NRv   (   R   Ry   R   R   R    t   list(   R   R/   R6   t   old_filenamet	   old_linesRv   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR   ÷   s
    c   	      C   sÆ   |  j  j d ƒ } | rÂ d d l m } | j |  j d ƒ } | j ƒ  } | | k rw t t d ƒ | |  j f ƒ ‚ qÂ | | d } | | d } | | d | !} d |  j  k rÂ | |  _	 qÂ n  | S(	   NRw   iÿÿÿÿ(   t   ModuleAnalyzerR:   s,   Object named %r not found in include file %ri   i   s   lineno-match(
   R   R   t   sphinx.pycodeR   t   for_fileRy   t	   find_tagsRG   R   R{   (	   R   R5   R/   Rw   R   t   analyzert   tagst   startt   end(    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR‘   ÿ   s    c            s?  |  j  j d ƒ } | r;t | t ˆ ƒ ƒ } t ‡ f d †  | Dƒ ƒ ru t j t d ƒ t ˆ ƒ | f d | ƒn  d |  j  k rÛ | d ‰  t ‡  f d †  t	 | ƒ Dƒ ƒ rÆ |  j
 | d 7_
 qÛ t t d ƒ ƒ ‚ n  g  | D]" } | t ˆ ƒ k  râ ˆ | ^ qâ ‰ ˆ g  k r;t t d	 ƒ | |  j f ƒ ‚ q;n  ˆ S(
   NR5   c         3   s!   |  ] } | t  ˆ  ƒ k Vq d  S(   N(   Rb   (   R,   RV   (   R5   (    s5   lib/python2.7/site-packages/sphinx/directives/code.pys	   <genexpr>  s    s*   line number spec is out of range(1-%d): %rR/   s   lineno-matchi    c         3   s%   |  ] \ } } ˆ  | | k Vq d  S(   N(    (   R,   RV   t   n(   t   first(    s5   lib/python2.7/site-packages/sphinx/directives/code.pys	   <genexpr>  s    s8   Cannot use "lineno-match" with a disjoint set of "lines"s2   Line spec %r: no lines pulled from include file %r(   R   R   R	   Rb   R0   R1   R2   R   t   allt	   enumerateR{   RG   Ry   (   R   R5   R/   Ri   t   linelistR¥   (    (   R¦   R5   s5   lib/python2.7/site-packages/sphinx/directives/code.pyR”     s     
"/c         C   s"  d |  j  k r* |  j  j d ƒ } t } n0 d |  j  k rT |  j  j d ƒ } t } n d  } | rx‰ t | ƒ D]{ \ } } | | k rm | r¼ d |  j  k r° |  j | d 7_ n  | | d Sd |  j  k rÝ |  j | 7_ n  | | Sqm qm W| t k rt d | ƒ ‚ qt d | ƒ ‚ n  | S(   Ns   start-ats   start-afters   lineno-matchi   s!   start-after pattern not found: %ss   start-at pattern not found: %s(   R   R   R!   R?   Re   R¨   R{   RG   (   R   R5   R/   R£   t	   inclusiveRa   R7   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR’   +  s*    		c         C   sì   d |  j  k r* |  j  j d ƒ } t } n0 d |  j  k rT |  j  j d ƒ } t } n d  } | rè xS t | ƒ D]E \ } } | | k rm | r— | | d  S| d k r§ g  S| |  Sqm qm W| t k rÕ t d | ƒ ‚ qè t d | ƒ ‚ n  | S(   Ns   end-ats
   end-beforei   i    s   end-at pattern not found: %ss    end-before pattern not found: %s(   R   R   R?   R!   Re   R¨   RG   (   R   R5   R/   R¤   Rª   Ra   R7   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR“   K  s&    		c         C   s3   |  j  j d ƒ } | r/ | j d | d ƒ n  | S(   NRu   i    s   
(   R   R   t   insert(   R   R5   R/   Ru   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR•   g  s    c         C   s0   |  j  j d ƒ } | r, | j | d ƒ n  | S(   NR4   s   
(   R   R   R4   (   R   R5   R/   R4   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR–   o  s    c         C   s6   d |  j  k r. t | |  j  j d ƒ d | ƒS| Sd  S(   NR.   R/   (   R   R9   R   (   R   R5   R/   (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR—   w  s    (   s   lineno-matchs   lineno-start(   s   lineno-matchR4   (   s   lineno-matchRu   (   s   start-afters   start-at(   s
   end-befores   end-at(   Rv   Rw   (   Rv   s   lineno-start(   Rv   s   lineno-match(   Rv   R5   (   Rv   s   start-after(   Rv   s
   end-before(   Rv   s   start-at(   Rv   s   end-atN(   R   R   R   R~   R|   Re   R   R‡   R   R‘   R”   R’   R“   R•   R–   R—   (    (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyRt   ´   s2   				 t   LiteralIncludec           B   sô   e  Z d  Z e Z d Z d Z e Z i e	 d 6e
 j d 6e	 d 6e
 j d 6e	 d 6e
 j d 6e
 j d	 6e
 j d
 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6e
 j d 6Z d „  Z RS(   s·   
    Like ``.. include:: :literal:``, but only warns if the include file is
    not found, and does not raise errors.  Also has several options for
    selecting what to include.
    i   i    R.   RS   s   lineno-starts   lineno-matchs	   tab-widthRX   Rx   Rw   R5   s   start-afters
   end-befores   start-ats   end-atRu   R4   s   emphasize-linesRH   RT   RU   Rv   c            så  |  j  j } | j j s4 | j j d d |  j ƒg Sd |  j k rr |  j j	 |  j d ƒ \ } } | |  j d <n  y:|  j
 j |  j ƒ } |  j j	 |  j d ƒ \ } } |  j j | ƒ t | |  j |  j ƒ } | j d | ƒ \ } ‰  t j | | d | ƒ}	 t |  |	 ƒ |  j j d ƒ r-d |	 d <n# d |  j k rP|  j d |	 d <n  d	 |  j k pzd
 |  j k pzd |  j k |	 d	 <|	 d c |  j j d g  ƒ 7<i  }
 |	 d <d |  j k rLt |  j d ˆ  ƒ } t ‡  f d †  | Dƒ ƒ rt j t d ƒ ˆ  |  j d f d | ƒn  g  | D] } | ˆ  k  r#| d ^ q#|
 d <n  | j |
 d <d |  j k r—|  j d p|  j d } t |  |	 | ƒ }	 n  |  j |	 ƒ |	 g SWn2 t k
 rà} | j j t | ƒ d |  j ƒg SXd  S(   Ns   File insertion disabledR7   Rv   i    R/   R=   t   udiffRX   RS   s   lineno-starts   lineno-matchR<   RT   RY   s   emphasize-linesc         3   s   |  ] } | ˆ  k Vq d  S(   N(    (   R,   RV   (   R5   (    s5   lib/python2.7/site-packages/sphinx/directives/code.pys	   <genexpr>Á  s    s*   line number spec is out of range(1-%d): %ri   RZ   R[   RH   (   RA   R\   t   settingst   file_insertion_enabledRc   R2   Ra   R   t   envt
   relfn2pathR_   R`   R   t   note_dependencyRt   R}   R‡   R   R;   R   R   R	   R0   R1   R   R{   RQ   Rg   t	   ExceptionR   (   R   R\   t   _t   pathR/   t   rel_filenameRy   t   readerRŽ   t   retnodeRm   RZ   Rj   RH   Rn   (    (   R5   s5   lib/python2.7/site-packages/sphinx/directives/code.pyR   ¡  sN    
0(   R   R   R    R!   R"   R#   R$   R?   R%   Rp   R   Ro   Rq   Rx   Rs   Rr   R'   R   (    (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyR¬     s6   















c         C   si   t  j d t ƒ t  j d t ƒ t  j d t ƒ t  j d t ƒ t  j d t ƒ i d d 6t d 6t d	 6S(
   Nt	   highlightR   s
   code-blockt
   sourcecodet   literalincludet   builtint   versiont   parallel_read_safet   parallel_write_safe(   R   t   register_directiveR   R(   RR   R¬   R?   (   t   app(    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyt   setupÕ  s    (2   R    R…   R   R*   t   difflibR    t   docutilsR   t   docutils.parsers.rstR   t   docutils.statemachineR   t   sixR   t   sphinxR   t   sphinx.deprecationR   t   sphinx.localeR   t   sphinx.utilR   R	   t   sphinx.util.docutilsR
   t   sphinx.util.nodesR   R!   t   typingR   R   R   R   t   sphinx.applicationR   t   sphinx.configR   t	   getLoggerR   R1   R   R(   Re   R9   RQ   RR   t   objectRt   R¬   RÂ   (    (    (    s5   lib/python2.7/site-packages/sphinx/directives/code.pyt   <module>   s8   "	JËV