U
    Dk\&                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ z0ddlm	Z	 dd	l
mZmZ dd
lmZ dZW n ek
r|   dZY nX 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 )a  
CodeHilite Extension for Python-Markdown
========================================

Adds code/syntax highlighting to standard Python-Markdown code blocks.

See <https://Python-Markdown.github.io/extensions/code_hilite>
for documentation.

Original code Copyright 2006-2008 [Waylan Limberg](http://achinghead.com/).

All changes Copyright 2008-2014 The Python Markdown Project

License: [BSD](http://www.opensource.org/licenses/bsd-license.php)

    )absolute_import)unicode_literals   )	Extension   )Treeprocessor)	highlight)get_lexer_by_nameguess_lexer)get_formatter_by_nameTFc                 C   s:   | sg S zt tt|  W S  tk
r4   g  Y S X dS )zSupport our syntax for emphasizing certain lines of code.

    expr should be like '1 2' to emphasize lines 1 and 2 of a code block.
    Returns a list of ints, the line numbers to emphasize.
    N)listmapintsplit
ValueError)expr r   @/usr/lib/python3/dist-packages/markdown/extensions/codehilite.pyparse_hl_lines    s    r   c                
   @   s*   e Zd ZdZddd	Zd
d Zdd ZdS )
CodeHiliteaL  
    Determine language of source code, and pass it into pygments hilighter.

    Basic Usage:
        >>> code = CodeHilite(src = 'some text')
        >>> html = code.hilite()

    * src: Source string or any object with a .readline attribute.

    * linenums: (Boolean) Set line numbering to 'on' (True),
      'off' (False) or 'auto'(None). Set to 'auto' by default.

    * guess_lang: (Boolean) Turn language auto-detection
      'on' or 'off' (on by default).

    * css_class: Set class name of wrapper div ('codehilite' by default).

    * hl_lines: (List of integers) Lines to emphasize, 1-indexed.

    Low Level Usage:
        >>> code = CodeHilite()
        >>> code.src = 'some text' # String or anything with a .readline attr.
        >>> code.linenos = True  # Turns line numbering on or of.
        >>> html = code.hilite()

    NT
codehilitedefaultF   c                 C   sD   || _ || _|| _|| _|| _|| _|| _|| _|	p6g | _|
| _	d S N)
srclanglinenums
guess_lang	css_classstyle	noclasses
tab_lengthhl_linesuse_pygments)selfr   r   r   r   r   r   r    r!   r"   r#   r   r   r   __init__L   s    
zCodeHilite.__init__c                 C   sB  | j d| _ | jdkr |   tr| jrzt| j}W nP tk
r   z| jr\t	| j }ntd}W n tk
r   td}Y nX Y nX t
d| j| j| j| j| jd}t| j ||S | j dd}|dd	}|d
d}|dd}g }| jr|d| j  | jr|d d}|r.dd| }d| j||f S dS )a7  
        Pass code to the [Pygments](http://pygments.pocoo.org/) highliter with
        optional line numbers. The output should then be styled with css to
        your liking. No styles are applied by default - only styling hooks
        (i.e.: <span class="k">).

        returns : A string of html.

        
NtextZhtml)ZlinenosZcssclassr   r    r"   &&amp;<&lt;>&gt;"z&quot;zlanguage-%sr    z class="%s" z(<pre class="%s"><code%s>%s</code></pre>
)r   stripr   _parseHeaderpygmentsr#   r	   r   r   r
   r   r   r   r   r    r"   r   replaceappendjoin)r$   ZlexerZ	formatterZtxtclassesZ	class_strr   r   r   hiliteZ   sH    



zCodeHilite.hilitec                 C   s   ddl }| jd}|d}|d|j}||}|rz|d | _	W n t
k
rh   d| _	Y nX |dr|d| | jdkr|drd| _t|d	| _n|d| d|d| _dS )
aD  
        Determines language of a code block from shebang line and whether said
        line should be removed or left in place. If the sheband line contains a
        path (even a single /) then it is assumed to be a real shebang line and
        left alone. However, if no path is given (e.i.: #!python or :::python)
        then it is assumed to be a mock shebang for language identifitation of
        a code fragment and removed from the code block prior to processing for
        code highlighting. When a mock shebang (e.i: #!python) is found, line
        numbering is turned on. When colons are found in place of a shebang
        (e.i.: :::python), line numbering is left in the current state - off
        by default.

        Also parses optional list of highlight lines, like:

            :::python hl_lines="1 3"
        r   Nr&   a  
            (?:(?:^::+)|(?P<shebang>^[#]!)) # Shebang or 2 or more colons
            (?P<path>(?:/\w+)*[/ ])?        # Zero or 1 path
            (?P<lang>[\w#.+-]*)             # The language
            \s*                             # Arbitrary whitespace
            # Optional highlight lines, single- or double-quote-delimited
            (hl_lines=(?P<quot>"|')(?P<hl_lines>.*?)(?P=quot))?
            r   pathZshebangTr"   )rer   r   popcompileVERBOSEsearchgrouplowerr   
IndexErrorinsertr   r   r"   r6   r1   )r$   r:   linesZflcmr   r   r   r2      s&    
	

zCodeHilite._parseHeader)
NNTr   Nr   Fr   NT)__name__
__module____qualname____doc__r%   r8   r2   r   r   r   r   r   0   s                
3r   c                   @   s    e Zd ZdZdd Zdd ZdS )HiliteTreeprocessorz% Hilight source code in code blocks. c                 C   s(   | dd}| dd}| dd}|S )zUnescape code.r)   r(   r+   r*   r-   r,   )r4   )r$   r'   r   r   r   code_unescape   s    z!HiliteTreeprocessor.code_unescapec                 C   s   | d}|D ]}t|dkr|d jdkrt| |d j| jd | jd | jd | jd | jd	 | jj| jd
 d}| jj	
| }|  d|_||_qdS )z* Find code blocks and store in htmlStash. Zprer   r   coder   r   r   pygments_styler    r#   )r   r   r   r   r    r!   r#   pN)iterlentagr   rK   r'   configmdr!   Z	htmlStashZstorer8   clear)r$   rootZblocksblockrL   Zplaceholderr   r   r   run   s"    

zHiliteTreeprocessor.runN)rF   rG   rH   rI   rK   rW   r   r   r   r   rJ      s   rJ   c                       s(   e Zd ZdZ fddZdd Z  ZS )CodeHiliteExtensionz4 Add source code hilighting to markdown codeblocks. c                    sB   d dgddgddgddgdd	gdd
gd| _ tt| jf | d S )Nz0Use lines numbers. True=yes, False=no, None=autoTz,Automatic language detection - Default: Truer   z6Set class name for wrapper <div> - Default: codehiliter   z>Pygments HTML Formatter Style (Colorscheme) - Default: defaultFz8Use inline styles instead of CSS classes - Default falsez[Use Pygments to Highlight code blocks. Disable if using a JavaScript library. Default: True)r   r   r   rM   r    r#   )rR   superrX   r%   )r$   kwargs	__class__r   r   r%      s(    zCodeHiliteExtension.__init__c                 C   s0   t |}|  |_|j|dd ||  dS )z/ Add HilitePostprocessor to Markdown instance. r8      N)rJ   Z
getConfigsrR   treeprocessorsregisterZregisterExtension)r$   rS   Zhiliterr   r   r   extendMarkdown  s    
z"CodeHiliteExtension.extendMarkdown)rF   rG   rH   rI   r%   r`   __classcell__r   r   r[   r   rX      s   rX   c                  K   s
   t f | S r   )rX   )rZ   r   r   r   makeExtension  s    rb   N)rI   Z
__future__r   r   r/   r   r^   r   r3   r   Zpygments.lexersr	   r
   Zpygments.formattersr   ImportErrorr   objectr   rJ   rX   rb   r   r   r   r   <module>   s"   
 "$