
    co2                         d 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
mZ dd	lmZ dd
lmZ dZn# e$ r dZY nw xY wd Z G d d          Z G d de          Z G d de          Z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_name)ClassNotFoundTFc                     | sg S 	 t          t          t          |                                                     S # t          $ r g cY S w xY w)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.
    )listmapintsplit
ValueError)exprs    >lib/python3.11/site-packages/markdown/extensions/codehilite.pyparse_hl_linesr       sZ      	CTZZ\\**+++   			s   3: A	A	c                   &    e Zd ZdZd ZddZ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`.

    * pygments_formatter: The name of a Pygments formatter or a formatter class used for
      highlighting the code blocks. Default: `html`.

    * 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. 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/

    Additionally, when Pygments is enabled, the code's language is passed to the
    formatter as an extra option `lang_str`, whose value being `{lang_prefix}{lang}`.
    This option has no effect to the Pygments's builtin formatters.

    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                    || _         |                    dd           | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        |                    dd          | _        d	|vr|                    d
d           |d	<   d|vr|                    dd          |d<   d|vrd|d<   d|d<   || _        d S )Nlang
guess_langTuse_pygmentslang_prefix	language-pygments_formatterhtmllinenoslinenumscssclass	css_class
codehilitewrapcodeFfull)srcpopr   r   r   r   r   options)selfr'   r)   s      r   __init__zCodeHilite.__init__g   s    KK--	!++lD99#KK==";;}kBB")++.BF"K"KG# 	?!(Z!>!>GIW$ 	I")++k<"H"HGJW$ 	'"&GJ    Tc                    | j                             d          | _         | j        |r|                                  t          r+| j        r#	 t          | j        fi | j        }nc# t          $ rV 	 | j	        rt          | j         fi | j        }nt          di | j        }n!# t          $ r t          di | j        }Y nw xY wY nw xY w| j        s|j        d         | _        | j         | j         }t          | j        t                    r:	 t!          | j        fi | j        }n5# t"          $ r t!          di | j        }Y nw xY w | j        dd|i| j        }t%          | j         ||          S | j                             dd          }|                    d	d
          }|                    dd          }|                    dd          }g }| j        r3|                    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textr   r   lang_str&&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
   aliasesr   
isinstancer   strr   r   r   replaceappendformatjoin)r*   shebanglexerr0   	formattertxtclasses	class_strs           r   hilitezCodeHilite.hilite{   s    8>>$''9 	  	  )	) )		F)$)DDt|DD F F FF J +DH E E E E 1 I IDL I I! F F F-EEEEEEEFF 9 -!M!,	*7DI77H$1377 WN 5d6M ^ ^QUQ] ^ ^II$ N N N 5 M M M MIIIN 4D3VVXVVV	TXui888 (""300C++c6**C++c6**C++c8,,CGy Kv}}T-=tyIIJJJ|I& +z***I D)00'1B1BCC	@GGZ(  sH   A& &
C10B"!C"C =C?C  CCD% %EEc                    ddl }| j                            d          }|                    d          }|                    d|j                  }|                    |          }|r	 |                    d                                          | _	        n# t          $ r
 d| _	        Y nw xY w|                    d          r|                    d|           | j        d         |                    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    rE   Thl_lines)rer'   r   r(   compileVERBOSEsearchgrouplowerr   
IndexErrorinsertr)   r   rD   r;   )r*   rO   linesflcms         r   r<   zCodeHilite._parseHeader   se   $ 				 t$$YYq\\JJ  *  HHRLL 	 !GGFOO1133		 ! ! ! 			!wwv $Q###|I& /17793E3E /*.Y''5aggj6I6I'J'JDL$$ LLB99U##))$//s   ',B B('B(N)T)__name__
__module____qualname____doc__r+   rK   r<   r:   r,   r   r   r   0   sR        4 4l  (9 9 9 9v50 50 50 50 50r,   r   c                       e Zd ZdZd Zd ZdS )HiliteTreeprocessorz' Highlight source code in code blocks. c                     |                     dd          }|                     dd          }|                     dd          }|S )zUnescape code.r4   r3   r6   r5   r2   r1   )rA   )r*   r/   s     r   code_unescapez!HiliteTreeprocessor.code_unescape   sB    ||FC((||FC(( ||GS))r,   c           	         |                     d          }|D ]}t          |          dk    r|d         j        dk    r| j                                        }t          |                     |d         j                  f| j        j	        |
                    dd          d|}| j        j                            |                                          }|                                 d|_        ||_        d	S )
z* Find code blocks and store in htmlStash. prer   r   codepygments_styledefault)
tab_lengthstylepN)iterlentagconfigcopyr   rb   r/   mdrh   r(   	htmlStashstorerK   clear)r*   rootblocksblocklocal_configre   placeholders          r   runzHiliteTreeprocessor.run   s    5!! 	) 	)E5zzQ )58<6#9 )#{//11!&&uQx}55#w1&**+;YGG  #	  #g/55dkkmmDD  	(
	) 	)r,   N)r[   r\   r]   r^   rb   ry   r:   r,   r   r`   r`      s8        11  ) ) ) ) )r,   r`   c                       e Zd ZdZd Zd ZdS )CodeHiliteExtensionz6 Add source code highlighting to markdown codeblocks. c           	      B   d dgddgddgddgdd	gdd
gddgddgd| _         |                                D ]i\  }}|| j         v r|                     ||           %t          |t                    r#	 t          |d          }n# t          $ r Y nw xY w|dg| j         |<   jd 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: codehiliterg   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   zBUse a specific formatter for Pygments highlighting.Default: "html")r!   r   r#   rf   	noclassesr   r   r   )preserve_noner8   )rn   items	setConfigr?   r@   r   r   )r*   kwargskeyvalues       r   r+   zCodeHiliteExtension.__init__  s/    XZIK&01  ) BC  *+ "-.
 c $*$5#%- 8 !,,.. 	/ 	/JCdk! 
/sE**** eS))  .uD I I I%   $)2;C  	/ 	/s   0B
BBc                     t          |          }|                                 |_        |j                            |dd           |                    |            dS )z/ Add HilitePostprocessor to Markdown instance. rK      N)r`   
getConfigsrn   treeprocessorsregisterregisterExtension)r*   rp   hiliters      r   extendMarkdownz"CodeHiliteExtension.extendMarkdown@  sU    %b))**
""7Hb999
T"""""r,   N)r[   r\   r]   r^   r+   r   r:   r,   r   r{   r{     s9        @@)/ )/ )/V# # # # #r,   r{   c                      t          di | S )Nr:   )r{   )r   s    r   makeExtensionr   I  s    (((((r,   N)r^   r8   r   r   r   utilr   r=   r   pygments.lexersr	   r
   pygments.formattersr   pygments.utilr   ImportErrorr   r   r`   r{   r   r:   r,   r   <module>r      st   "       * * * * * * ! ! ! ! ! !"""""">>>>>>>>999999++++++HH   HHH   {0 {0 {0 {0 {0 {0 {0 {0B) ) ) ) )- ) ) )B4# 4# 4# 4# 4#) 4# 4# 4#n) ) ) ) )s   3 ==