a
    ¶¯6`l-  ã                   @   s²   d 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yn   dZY n0 dd„ ZG dd„ dƒ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](https://opensource.org/licenses/bsd-license.php)

é   )Ú	Extensioné   )ÚTreeprocessor)ÚparseBoolValueé    )Ú	highlight)Úget_lexer_by_nameÚguess_lexer)Úget_formatter_by_nameTFc                 C   s8   | sg S zt tt|  ¡ ƒƒW S  ty2   g  Y S 0 dS )zÄSupport 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„ Zdd„ Zdd„ ZdS )	Ú
CodeHilitea«  
    Determine language of source code, and pass it on to the Pygments highlighter.

    Usage:
        code = CodeHilite(src=some_code, lang='python')
        html = code.hilite()

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

    * lang: String name of Pygments lexer to use for highlighting. Default: `None`.

    * guess_lang: Auto-detect which lexer to use. Ignored if `lang` is set to a valid
      value. Default: `True`.

    * use_pygments: Pass code to pygments for code highlighting. If `False`, the code is
      instead wrapped for highlighting by a JavaScript library. Default: `True`.

    * linenums: An alias to Pygments `linenos` formatter option. Default: `None`.

    * css_class: An alias to Pygments `cssclass` formatter option. Default: 'codehilite'.

    * lang_prefix: Prefix prepended to the language when `use_pygments` is `False`.
      Default: "language-".

    Other Options:
    Any other options are accepted and passed on to the lexer and formatter. Therefore,
    valid options include any options which are accepted by the `html` formatter or
    whichever lexer the code's language uses. Note that most lexers do not have any
    options. However, a few have very useful options, such as PHP's `startinline` option.
    Any invalid options are ignored without error.

    Formatter options: https://pygments.org/docs/formatters/#HtmlFormatter
    Lexer Options: https://pygments.org/docs/lexers/

    Advanced Usage:
        code = CodeHilite(
            src = some_code,
            lang = 'php',
            startinline = True,      # Lexer option. Snippet does not start with `<?php`.
            linenostart = 42,        # Formatter option. Snippet starts on line 42.
            hl_lines = [45, 49, 50], # Formatter option. Highlight lines 45, 49, and 50.
            linenos = 'inline'       # Formatter option. Avoid alignment problems.
        )
        html = code.hilite()

    c                 K   s   || _ | dd ¡| _| dd¡| _| dd¡| _| dd¡| _d|vrV| dd ¡|d< d	|vrn| d
d¡|d	< d|vr~d|d< d|d< || _d S )NÚlangÚ
guess_langTÚuse_pygmentsÚlang_prefixú	language-ÚlinenosÚlinenumsÚcssclassÚ	css_classÚ
codehiliteZwrapcodeFZfull)ÚsrcÚpopr   r   r   r   Úoptions)Úselfr   r!   r   r   r   Ú__init__`   s    zCodeHilite.__init__c                 C   sd  | j  d¡| _ | jdu r |  ¡  trÈ| jrÈzt| jfi | j¤Ž}W nf ty¨   z0| j	rnt
| j fi | j¤Ž}ntdi | j¤Ž}W n" ty¢   tdi | j¤Ž}Y n0 Y n0 tdi | j¤Ž}t| j ||ƒS | j  dd¡}| dd¡}| d	d
¡}| dd¡}g }| jr| d | j| j¡¡ | jd r2| d¡ d}|rLd d |¡¡}d | jd ||¡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ÚtextÚhtmlú&ú&amp;ú<ú&lt;ú>ú&gt;ú"z&quot;z{}{}r   r   Ú z class="{}"ú z)<pre class="{}"><code{}>{}
</code></pre>
r   )r%   )r%   )r&   )r   Ústripr   Ú_parseHeaderÚpygmentsr   r   r!   r   r   r	   r
   r   ÚreplaceÚappendÚformatr   Újoin)r"   ZlexerZ	formatterZtxtÚclassesZ	class_strr   r   r   Úhilites   s@    


ýzCodeHilite.hilitec                 C   sØ   ddl }| j d¡}| d¡}| d|j¡}| |¡}|r¶z| d¡ ¡ | _	W n t
yf   d| _	Y n0 | d¡r~| d|¡ | jd du r | d¡r d	| jd< t| d
¡ƒ| jd
< n| d|¡ d |¡ d¡| _dS )aH  
        Determines language of a code block from shebang line and whether the
        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 identification 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   Úpathr   ZshebangTZhl_lines)Úrer   r   r    ÚcompileÚVERBOSEÚsearchÚgroupÚlowerr   Ú
IndexErrorÚinsertr!   r   r6   r0   )r"   r:   ÚlinesZflÚcÚmr   r   r   r1   ¤   s&    
ù	


zCodeHilite._parseHeaderN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r8   r1   r   r   r   r   r   /   s   01r   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'   )r3   )r"   r%   r   r   r   Úcode_unescapeâ   s    z!HiliteTreeprocessor.code_unescapec                 C   sŠ   |  d¡}|D ]v}t|ƒdkr|d jdkrt|  |d j¡f| jj| j 	dd¡dœ| j¤Ž}| jj
 | ¡ ¡}| ¡  d|_||_qd	S )
z* Find code blocks and store in htmlStash. Zprer   r   ÚcodeÚpygments_styleÚdefault)Ú
tab_lengthZstyleÚpN)ÚiterÚlenÚtagr   rJ   r%   ÚmdrN   Úconfigr    Z	htmlStashZstorer8   Úclear)r"   ÚrootZblocksÚblockrK   Zplaceholderr   r   r   Úrunë   s    
ÿýüzHiliteTreeprocessor.runN)rE   rF   rG   rH   rJ   rX   r   r   r   r   rI   ß   s   	rI   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚCodeHiliteExtensionz4 Add source code hilighting to markdown codeblocks. c              	   K   sœ   d dgddgddgddgdd	gdd
gddgdœ| _ | ¡ D ]\\}}|| j v rZ|  ||¡ q:t|tƒrˆzt|dd}W n ty†   Y n0 |dg| j |< q:d S )Nz=Use lines numbers. True|table|inline=yes, False=no, None=autoTz,Automatic language detection - Default: Truer   z6Set class name for wrapper <div> - Default: codehiliterM   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: Truer   zQPrefix prepended to the language when use_pygments is false. Default: "language-")r   r   r   rL   Z	noclassesr   r   )Zpreserve_noner.   )rT   ÚitemsZ	setConfigÚ
isinstanceÚstrr   r   )r"   ÚkwargsÚkeyÚvaluer   r   r   r#     s>    ÿÿÿÿÿÿþî

zCodeHiliteExtension.__init__c                 C   s0   t |ƒ}|  ¡ |_|j |dd¡ | | ¡ dS )z/ Add HilitePostprocessor to Markdown instance. r8   é   N)rI   Z
getConfigsrT   ÚtreeprocessorsÚregisterZregisterExtension)r"   rS   Zhiliterr   r   r   ÚextendMarkdown)  s    
z"CodeHiliteExtension.extendMarkdownN)rE   rF   rG   rH   r#   rc   r   r   r   r   rY   ÿ   s   'rY   c                  K   s   t f i | ¤ŽS )N)rY   )r]   r   r   r   ÚmakeExtension2  s    rd   N)rH   r.   r   ra   r   Úutilr   r2   r   Zpygments.lexersr   r	   Zpygments.formattersr
   ÚImportErrorr   r   rI   rY   rd   r   r   r   r   Ú<module>   s    
 1 3