B
    \F                 @   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eZG dd deZG dd deZdddZ dd Z!G dd deZ"G dd de#Z$G dd deZ%dd Z&dS ) z
    sphinx.directives.code
    ~~~~~~~~~~~~~~~~~~~~~~

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)unified_diff)nodes)
directives)ViewList)	text_type)addnodes)RemovedInSphinx40Warning)__)logging)parselinenos)SphinxDirective)set_source_infoc               @   s2   e Zd ZdZdZdZdZdZdej	iZ
dd ZdS )		Highlightzt
    Directive to set the highlighting language for code blocks, as well
    as the threshold for line numbers.
    F   r   linenothresholdc             C   s*   | j dtj}tj| jd  |dgS )Nr   r   )Zlangr   )optionsgetsysmaxsizer   highlightlang	argumentsstrip)selfr    r   5lib/python3.7/site-packages/sphinx/directives/code.pyrun3   s    zHighlight.runN)__name__
__module____qualname____doc__has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer   Zpositive_intoption_specr   r   r   r   r   r   %   s   
r   c               @   s   e Zd ZdZdd ZdS )HighlightLangz$highlightlang directive (deprecated)c             C   s   t jdtdd t| S )NzNhighlightlang directive is deprecated. Please use highlight directive instead.   )
stacklevel)warningswarnr   r   r   )r   r   r   r   r   =   s    
zHighlightLang.runN)r   r   r   r   r   r   r   r   r   r%   :   s   r%   c                sn    s| S t  fdd| D r0tjtd|d g }x4| D ],}| d  }|dr\|s\d}|| q:W |S )Nc             3   s   | ]}|d     V  qd S )N)r   ).0s)dedentr   r   	<genexpr>J   s    zdedent_lines.<locals>.<genexpr>zOver dedent has detected)location
)anyloggerwarningr	   endswithappend)linesr,   r.   	new_lineslineZnew_liner   )r,   r   dedent_linesE   s    
r8   c             C   s   t jdddgd}t  }| jt|gdd| j| t|d t jrbt	d|d 
  }t|t j|d jdf|d j }|j|_|j|_||7 }||7 }|S )N Tzliteral-block-wrapper)literal_blockclasses)sourcer   zInvalid caption: %s)r   Z	containerZElementstateZnested_parser   Zcontent_offset
isinstanceZsystem_messager	   Zastext
ValueErrorcaptionZ	rawsourceZchildrenr<   r7   )Z	directiveZliteral_noder@   Zcontainer_nodeZparsedmsgZcaption_noder   r   r   container_wrapperW   s    

rB   c               @   sF   e Zd ZdZdZdZdZdZej	e
e
ejejejejdZdd Zd	S )
	CodeBlockz^
    Directive for a code block with special highlighting or line numbering
    settings.
    Tr   r   F)linenosr,   zlineno-startzemphasize-linesr@   classnamec          
      s  | j j}d| j}| j| j}| jd}|ry`t	| j t
| }t fdd|D r~tjtd | jd f |d  fdd|D }W q tk
r } z|jjt|| jd	gS d }~X Y qX nd }d
| jkr| j| j}|d}t|| jd
 |d}d|}t||}| jd |d< d| jkp@d| jk|d< |d  | jdg 7  < i  }	|d< |d k	r~||	d< d| jkr| jd |	d< t| | | jd}
|
ryt| ||
}W n8 tk
r } z|jjt|| jd	gS d }~X Y nX | | |gS )Nr/   zemphasize-linesc             3   s   | ]}| kV  qd S )Nr   )r*   i)nlinesr   r   r-      s    z CodeBlock.run.<locals>.<genexpr>z*line number spec is out of range(1-%d): %r)r.   c                s   g | ]}| k r|d  qS )r   r   )r*   x)rH   r   r   
<listcomp>   s    z!CodeBlock.run.<locals>.<listcomp>)r7   r,   r   languagerD   zlineno-startr;   rE   highlight_argshl_lineslinenostartr@   )r=   documentjoinZcontentstate_machineget_source_and_linelinenor   r   lenr   r0   r1   r2   r	   r?   reporterstrsplitr8   r   r:   r   r   rB   r   add_name)r   rO   coder.   linespecrM   errr5   literal
extra_argsr@   excr   )rH   r   r   ~   sP    


(



&
zCodeBlock.runN)r   r   r   r   r    r!   r"   r#   r   flagintunchanged_requiredclass_option	unchangedr$   r   r   r   r   r   rC   j   s   
rC   c               @   s   e Zd Zddddddddd	d
dddgZdd Zdd Zd'ddZd(ddZd)ddZd*ddZ	d+ddZ
d,ddZd-dd Zd.d!d"Zd/d#d$Zd0d%d&ZdS )1LiteralIncludeReader)zlineno-matchzlineno-start)zlineno-matchr4   )zlineno-matchprepend)zstart-afterzstart-at)z
end-beforezend-at)diffpyobject)rf   zlineno-start)rf   zlineno-match)rf   r5   )rf   zstart-after)rf   z
end-before)rf   zstart-at)rf   zend-atc             C   s8   || _ || _|d|j| _| jdd| _|   d S )Nencodingzlineno-startr   )filenamer   r   Zsource_encodingrh   lineno_startparse_options)r   ri   r   configr   r   r   __init__   s
    zLiteralIncludeReader.__init__c             C   s@   x:| j D ]0\}}|| jkr|| jkrttd||f qW d S )Nz%Cannot use both "%s" and "%s" options)INVALID_OPTIONS_PAIRr   r?   r	   )r   Zoption1Zoption2r   r   r   rk      s    z"LiteralIncludeReader.parse_optionsNc          	   C   s   yLt j|d| jdd.}| }d| jkr:|| jd }|dS Q R X W nP ttfk
rt   tt	d| Y n* t
k
r   t
t	d| j|f Y nX d S )Nrstrict)errorsz	tab-widthTz.Include file %r not found or reading it failedz`Encoding %r used for reading included file %r seems to be wrong, try giving an :encoding: option)codecsopenrh   readr   
expandtabs
splitlinesIOErrorOSErrorr	   UnicodeError)r   ri   r.   ftextr   r   r   	read_file   s    
zLiteralIncludeReader.read_filec             C   sp   d| j kr|  }nJ| j| j| j| j| j| j| jg}| j	| j
|d}x|D ]}|||d}qJW d|t|fS )Nrf   )r.   r9   )r   	show_diffpyobject_filterstart_filter
end_filterlines_filterprepend_filterappend_filterdedent_filterr|   ri   rP   rT   )r   r.   r5   filtersfuncr   r   r   rt      s    


zLiteralIncludeReader.readc             C   s:   |  | j}| jd}|  |}t|||| j}t|S )Nrf   )r|   ri   r   r   r   list)r   r.   r6   Zold_filenameZ	old_linesrf   r   r   r   r}      s
    
zLiteralIncludeReader.show_diffc       	      C   s   | j d}|rddlm} || jd}| }||krRttd|| jf n8|| d }|| d }||d | }d| j kr|| _	|S )	Nrg   r   )ModuleAnalyzerr9   z,Object named %r not found in include file %rr   r&   zlineno-match)
r   r   Zsphinx.pycoder   Zfor_fileri   Z	find_tagsr?   r	   rj   )	r   r5   r.   rg   r   ZanalyzerZtagsstartendr   r   r   r~      s    
z$LiteralIncludeReader.pyobject_filterc                s   | j d}|rt|t}tfdd|D rRtjtdt|f |d d| j kr|d  t fddt	|D r|  j
|d 7  _
nttd	fd
d|D g krttd|| jf S )Nr5   c             3   s   | ]}|t  kV  qd S )N)rT   )r*   rG   )r5   r   r   r-     s    z4LiteralIncludeReader.lines_filter.<locals>.<genexpr>z*line number spec is out of range(1-%d): %r)r.   zlineno-matchr   c             3   s   | ]\}} | |kV  qd S )Nr   )r*   rG   n)firstr   r   r-     s    z8Cannot use "lineno-match" with a disjoint set of "lines"c                s    g | ]}|t  k r | qS r   )rT   )r*   r   )r5   r   r   rJ   $  s    z5LiteralIncludeReader.lines_filter.<locals>.<listcomp>z2Line spec %r: no lines pulled from include file %r)r   r   r   rT   r0   r1   r2   r	   all	enumeraterj   r?   ri   )r   r5   r.   rZ   Zlinelistr   )r   r5   r   r     s     

z!LiteralIncludeReader.lines_filterc             C   s   d| j kr| j d}d}n d| j kr8| j d}d}nd }|rxpt|D ]d\}}||krJ|rd| j krz|  j|d 7  _||d d  S d| j kr|  j|7  _||d  S qJW |dkrtd| ntd| |S )	Nzstart-atFzstart-afterTzlineno-matchr   z!start-after pattern not found: %szstart-at pattern not found: %s)r   r   r   rj   r?   )r   r5   r.   r   	inclusiverS   r7   r   r   r   r   +  s*    



z!LiteralIncludeReader.start_filterc             C   s   d| j kr| j d}d}n d| j kr8| j d}d}nd }|rxHt|D ]<\}}||krJ|rn|d |d  S |dkrzg S |d | S qJW |dkrtd| ntd| |S )	Nzend-atTz
end-beforeFr   r   zend-at pattern not found: %sz end-before pattern not found: %s)r   r   r   r?   )r   r5   r.   r   r   rS   r7   r   r   r   r   K  s&    

zLiteralIncludeReader.end_filterc             C   s$   | j d}|r |d|d  |S )Nre   r   r/   )r   r   insert)r   r5   r.   re   r   r   r   r   g  s    z#LiteralIncludeReader.prepend_filterc             C   s"   | j d}|r||d  |S )Nr4   r/   )r   r   r4   )r   r5   r.   r4   r   r   r   r   o  s    z"LiteralIncludeReader.append_filterc             C   s(   d| j kr t|| j d|dS |S d S )Nr,   )r.   )r   r8   r   )r   r5   r.   r   r   r   r   w  s    
z"LiteralIncludeReader.dedent_filter)N)N)N)N)N)N)N)N)N)N)r   r   r   rn   rm   rk   r|   rt   r}   r~   r   r   r   r   r   r   r   r   r   r   rd      s2   	





 


rd   c               @   sx   e Zd ZdZdZdZdZdZee	j
ee	j
ee	je	je	je	je	je	je	je	je	je	je	je	je	je	je	jdZdd Zd	S )
LiteralIncludez
    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.
    Fr   r   T)r,   rD   zlineno-startzlineno-matchz	tab-widthrK   rh   rg   r5   zstart-afterz
end-beforezstart-atzend-atre   r4   zemphasize-linesr@   rE   rF   rf   c          
      s$  | j j}|jjs$|jjd| jdgS d| jkrN| j	| jd \}}|| jd< y| j
| j}| j	| jd \}}| j| t|| j| j}|j|d\} tj|||d}	t| |	 | jdrd|	d< nd| jkr| jd |	d< d	| jkp
d
| jkp
d| jk|	d	< |	d  | jdg 7  < i  }
|	d< d| jkrt| jd  }t fdd|D rtjtd | jd f |d  fdd|D |
d< |j|
d< d| jkr| jd p| jd }t| |	|}	| |	 |	gS  tk
r } z|jjt|| jdgS d }~X Y nX d S )NzFile insertion disabled)r7   rf   r   )r.   )r<   ZudiffrK   rD   zlineno-startzlineno-matchr;   rE   rL   zemphasize-linesc             3   s   | ]}| kV  qd S )Nr   )r*   rG   )r5   r   r   r-     s    z%LiteralInclude.run.<locals>.<genexpr>z*line number spec is out of range(1-%d): %rc                s   g | ]}| k r|d  qS )r   r   )r*   rI   )r5   r   r   rJ     s    z&LiteralInclude.run.<locals>.<listcomp>rM   rN   r@   )r=   rO   ZsettingsZfile_insertion_enabledrU   r2   rS   r   envZ
relfn2pathrQ   rR   r   Znote_dependencyrd   rl   rt   r   r:   r   r   r   r0   r1   r	   rj   rB   rX   	Exceptionr   )r   rO   _pathr.   Zrel_filenameri   readerr{   Zretnoder]   rM   r@   r^   r   )r5   r   r     sN    







zLiteralInclude.runN)r   r   r   r   r    r!   r"   r#   r`   r   r_   ra   rh   rc   rb   r$   r   r   r   r   r   r     s4   
r   c             C   sH   t dt t dt t dt t dt t dt ddddS )	NZ	highlightr   z
code-blockZ
sourcecodeZliteralincludeZbuiltinT)versionZparallel_read_safeZparallel_write_safe)r   Zregister_directiver   r%   rC   r   )Zappr   r   r   setup  s    r   )N)'r   rr   r   r(   Zdifflibr   Zdocutilsr   Zdocutils.parsers.rstr   Zdocutils.statemachiner   Zsixr   Zsphinxr   Zsphinx.deprecationr   Zsphinx.localer	   Zsphinx.utilr
   r   Zsphinx.util.docutilsr   Zsphinx.util.nodesr   Z	getLoggerr   r1   r   r%   r8   rB   rC   objectrd   r   r   r   r   r   r   <module>   s2   

J LV