o
    ç&•a†-  ã                   @   s²   d Z ddlmZ ddlmZ ddlmZ zddlmZ ddl	m
Z
mZ dd	lmZ d
ZW n ey7   dZY nw 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   s4   | sg S z
t tt|  ¡ ƒƒW S  ty   g  Y S w )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.
    )Ú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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r+| dd ¡|d< d	|vr7| 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Ú
codehiliteÚwrapcodeFÚfull)ÚsrcÚpopr   r   r   r   Úoptions)Úselfr!   r#   r   r   r   Ú__init__`   s   
zCodeHilite.__init__Tc                 C   s^  | j  d¡| _ | jdu r|r|  ¡  trf| jrfzt| jfi | j¤Ž}W n3 tyV   z| j	r9t
| j fi | j¤Ž}ntdi | j¤Ž}W n tyS   tdi | j¤Ž}Y nw Y nw tdi | j¤Ž}t| j ||ƒS | j  dd¡}| dd¡}| d	d
¡}| dd¡}g }| jr�| d | j| j¡¡ | jd r™| d¡ d}|r¥d d |¡¡}d | j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!   Ústripr   Ú_parseHeaderÚpygmentsr   r   r#   r   r   r	   r
   r   ÚreplaceÚappendÚformatr   Újoin)r$   ÚshebangÚlexerÚ	formatterÚtxtÚclassesÚ	class_strr   r   r   Úhilites   sH   
€ÿ€ú

ýzCodeHilite.hilitec                 C   sØ   ddl }| j d¡}| d¡}| d|j¡}| |¡}|r[z
| d¡ ¡ | _	W n t
y3   d| _	Y nw | d¡r?| d|¡ | jd du rP| d¡rPd	| 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   r9   TÚhl_lines)Úrer!   r   r"   ÚcompileÚVERBOSEÚsearchÚgroupÚlowerr   Ú
IndexErrorÚinsertr#   r   r8   r2   )r$   rB   ÚlinesÚflÚcÚmr   r   r   r3   ¤   s(   
ù
	
ÿ

zCodeHilite._parseHeaderN)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r?   r3   r   r   r   r   r   /   s
    0
1r   c                   @   ó    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)   )r5   )r$   r'   r   r   r   Úcode_unescapeâ   s   z!HiliteTreeprocessor.code_unescapec                 C   sŠ   |  d¡}|D ];}t|ƒdkrB|d jdkrBt|  |d j¡f| jj| j 	dd¡dœ| j¤Ž}| jj
 | ¡ ¡}| ¡  d|_||_qd	S )
z* Find code blocks and store in htmlStash. Úprer   r   ÚcodeÚpygments_styleÚdefault)Ú
tab_lengthÚstyleÚpN)ÚiterÚlenÚtagr   rT   r'   ÚmdrY   Úconfigr"   Ú	htmlStashÚstorer?   Úclear)r$   ÚrootÚblocksÚblockrV   Úplaceholderr   r   r   Úrunë   s"   
ÿýü€òzHiliteTreeprocessor.runN)rN   rO   rP   rQ   rT   rh   r   r   r   r   rS   ß   s    	rS   c                   @   rR   )Ú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 r-|  ||¡ qt|tƒrDzt|dd�}W n	 tyC   Y nw |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: codehiliterX   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   rW   Ú	noclassesr   r   )Úpreserve_noner0   )r`   ÚitemsÚ	setConfigÚ
isinstanceÚstrr   r   )r$   ÚkwargsÚkeyÚvaluer   r   r   r%     sB   ÿÿÿÿÿÿþî

ÿõzCodeHiliteExtension.__init__c                 C   s0   t |ƒ}|  ¡ |_|j |dd¡ | | ¡ dS )z/ Add HilitePostprocessor to Markdown instance. r?   é   N)rS   Ú
getConfigsr`   ÚtreeprocessorsÚregisterÚregisterExtension)r$   r_   Úhiliterr   r   r   ÚextendMarkdown)  s   
z"CodeHiliteExtension.extendMarkdownN)rN   rO   rP   rQ   r%   ry   r   r   r   r   ri   ÿ   s    'ri   c                  K   s   t di | ¤ŽS )Nr   )ri   )rp   r   r   r   ÚmakeExtension2  s   rz   N)rQ   r0   r   ru   r   Úutilr   r4   r   Úpygments.lexersr   r	   Úpygments.formattersr
   ÚImportErrorr   r   rS   ri   rz   r   r   r   r   Ú<module>   s$    ÿ 1 3