
    -Beo2                         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d Z G d d      Z G d de      Z G d de      Zd Zy# e$ r dZY 0w xY w)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        | j                                     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.12/site-packages/markdown/extensions/codehilite.pyparse_hl_linesr       s=     	CTZZ\*++ 	s   &- ;;c                   $    e Zd ZdZd ZddZd Zy)
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                    || _         |j                  dd       | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        |j                  dd      | _        d	|vr|j                  d
d       |d	<   d|vr|j                  dd      |d<   d|vrd|d<   d|d<   || _        y )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#KK=";;}kB")++.BF"KG#!(Z!>GIW$")++k<"HGJW$"&GJ    c                 f   | j                   j                  d      | _         | j                  |r| j                          t        r| j
                  r	 t        | j                  fi | j                  }| j                  s|j                  d   | _        | j                   | j                   }t        | j                  t              r"	 t!        | j                  fi | j                  }n | j                  dd|i| j                  }t%        | j                   ||      S | j                   j'                  dd      }|j'                  dd      }|j'                  dd	      }|j'                  d
d      }g }| j                  r5|j)                  dj+                  | j                  | j                               | j                  d   r|j)                  d       d}|r dj+                  dj-                  |            }dj+                  | j                  d   ||      S # t        $ rl 	 | 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 w xY w# t"        $ r t!        di | j                  }Y w xY w)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.

        
r   lang_str&&amp;<&lt;>&gt;"z&quot;z{}{}r    r!    z class="{}" z)<pre class="{}"><code{}>{}
</code></pre>
r"   )text)r    )r'   stripr   _parseHeaderpygmentsr   r	   r)   r   r   r
   aliasesr   
isinstancer   strr   r   r   replaceappendformatjoin)r*   shebanglexerr/   	formattertxtclasses	class_strs           r   hilitezCodeHilite.hilite{   sP    88>>$'99))	F)$))Dt||D 99!MM!,	**+DII;7H$1137N 5d6M6M ^QUQ]Q] ^I 4D33VXVV	TXXui88 ((""30C++c6*C++c6*C++c8,CGyyv}}T-=-=tyyIJ||I&z*I)00'1BC	@GGZ( E  FF +DHH E E 1 IDLL I! F-EEEFF % N 5 M MINsI    H  J 	J AI#"J#JJJJ
JJ0/J0c                    ddl }| j                  j                  d      }|j                  d      }|j	                  d|j
                        }|j                  |      }|r	 |j                  d      j                         | _	        |j                  d      r|j                  d|       | j                  d    |j                  d      rd	| j                  d<   t        |j                  d
            | j                  d
<   n|j                  d|       dj                  |      j                  d      | _        y# t        $ r
 d| _	        Y w xY w)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   s   $ 	 t$YYq\JJ  ** HHRL!GGFO113	 wwvQ#||I&.17793E*.Y''5aggj6I'JDLL$ LLB99U#))$/  ! 	!s   !$D7 7E
	E
N)T)__name__
__module____qualname____doc__r+   rK   r<   r:   r,   r   r   r   0   s    4l(9v50r,   r   c                       e Zd ZdZd Zd Zy)HiliteTreeprocessorz' Highlight source code in code blocks. c                 r    |j                  dd      }|j                  dd      }|j                  dd      }|S )zUnescape code.r3   r2   r5   r4   r1   r0   )rA   )r*   r9   s     r   code_unescapez!HiliteTreeprocessor.code_unescape   s9    ||FC(||FC( ||GS)r,   c           	         |j                  d      }|D ]  }t        |      dk(  s|d   j                  dk(  s%| j                  j	                         }t        | j                  |d   j                        f| j                  j                  |j                  dd      d|}| j                  j                  j                  |j                               }|j                          d|_        ||_         y	)
z* Find code blocks and store in htmlStash. prer   r   codepygments_styledefault)
tab_lengthstylepN)iterlentagconfigcopyr   rb   r9   mdrh   r(   	htmlStashstorerK   clear)r*   rootblocksblocklocal_configre   placeholders          r   runzHiliteTreeprocessor.run   s    5! 	)E5zQ58<<6#9#{{//1!&&uQx}}5#ww11&**+;YG #	 #gg//55dkkmD  	(
	)r,   N)r[   r\   r]   r^   rb   ry   r:   r,   r   r`   r`      s    1)r,   r`   c                       e Zd ZdZd Zd Zy)CodeHiliteExtensionz6 Add source code highlighting to markdown codeblocks. c           	      2   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| _         |j                         D ]U  \  }}|| j                   v r| j                  ||       't        |t              r	 t        |d      }|dg| j                   |<   W y # t        $ r Y w xY w)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_noner7   )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dkk!sE* eS) .uD I %*2;C 	/ & s   )B

	BBc                     t        |      }| j                         |_        |j                  j	                  |dd       |j                  |        y)z/ Add HilitePostprocessor to Markdown instance. rK      N)r`   
getConfigsrn   treeprocessorsregisterregisterExtension)r*   rp   hiliters      r   extendMarkdownz"CodeHiliteExtension.extendMarkdown@  s@    %b)*
""7Hb9
T"r,   N)r[   r\   r]   r^   r+   r   r:   r,   r   r{   r{     s    @)/V#r,   r{   c                      t        di | S )Nr:   )r{   )r   s    r   makeExtensionr   I  s    (((r,   N)r^   r7   r   r   r   utilr   r=   r   pygments.lexersr	   r
   pygments.formattersr   pygments.utilr   ImportErrorr   r   r`   r{   r   r:   r,   r   <module>r      ss   "  * !">9+H
 {0 {0B)- )B4#) 4#n)[	  Hs   A A#"A#