
    ̆h4                       S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
JrJr  \
(       a	  SS	KJs  Jr   SS
KJr  SSKJrJr  SSKJr  SSKJr  SrSS jr " S S5      r " S S\5      r " S S\5      rS rg	! \ a    Sr N3f = f)z
Adds code/syntax highlighting to standard Python-Markdown code blocks.

See the [documentation](https://Python-Markdown.github.io/extensions/code_hilite)
for details.
    )annotations   )	Extension   )Treeprocessor)parseBoolValue)TYPE_CHECKINGCallableAnyN)	highlight)get_lexer_by_nameguess_lexer)get_formatter_by_name)ClassNotFoundTFc                    U (       d  / $  [        [        [        U R                  5       5      5      $ ! [         a    / s $ f = f)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 integers, the line numbers to emphasize.
)listmapintsplit
ValueError)exprs    V/opt/services/DDDS/venv/lib/python3.13/site-packages/markdown/extensions/codehilite.pyparse_hl_linesr   *   s=     	CTZZ\*++ 	s   &2 A Ac                  :    \ rS rSrSrSS jrS	S
S jjrSS jrSrg)
CodeHilite:   a  
Determine language of source code, and pass it on to the Pygments highlighter.

Usage:

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

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

Keyword arguments:
    lang (str): String name of Pygments lexer to use for highlighting. Default: `None`.
    guess_lang (bool): Auto-detect which lexer to use.
        Ignored if `lang` is set to a valid value. Default: `True`.
    use_pygments (bool): Pass code to Pygments for code highlighting. If `False`, the code is
        instead wrapped for highlighting by a JavaScript library. Default: `True`.
    pygments_formatter (str): The name of a Pygments formatter or a formatter class used for
        highlighting the code blocks. Default: `html`.
    linenums (bool): An alias to Pygments `linenos` formatter option. Default: `None`.
    css_class (str): An alias to Pygments `cssclass` formatter option. Default: 'codehilite'.
    lang_prefix (str): 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' builtin formatters.

Advanced Usage:

```python
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                   Xl         UR                  SS 5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        UR                  SS5      U l        S	U;  a  UR                  S
S 5      US	'   SU;  a  UR                  SS5      US'   SU;  a  SUS'   SUS'   X l        g )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__CodeHilite.__init__s   s     'FD 9	 'L$ ?")++nd"C 'M; G29++>RTZ2[G#!(Z!>GIW$")++k<"HGJW$"&GJ    c                   U R                   R                  S5      U l         U R                  c  U(       a  U R                  5         [        (       a  U R
                  (       a   [        U R                  40 U R                  D6nU R                  (       d  UR                  S   U l        U R                   U R                   3n[        U R                  [        5      (       a"   [!        U R                  40 U R                  D6nOU R                  " SSU0U R                  D6n[%        U R                   X$5      $ U R                   R'                  SS5      nUR'                  SS5      nUR'                  SS	5      nUR'                  S
S5      n/ nU R                  (       a5  UR)                  SR+                  U R                  U R                  5      5        U R                  S   (       a  UR)                  S5        SnU(       a   SR+                  SR-                  U5      5      nSR+                  U R                  S   UU5      $ ! [         au     U R                  (       a#  [        U R                   40 U R                  D6n GN[        S0 U R                  D6n GN! [         a    [        S0 U R                  D6n  GN6f = ff = f! ["         a    [!        S0 U R                  D6n GNf = f)a  
Pass code to the [Pygments](https://pygments.org/) highlighter 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lexerr5   	formattertxtclasses	class_strs           r   hiliteCodeHilite.hilite   sQ    88>>$'998))	F)$))Dt||D 99!MM!,	**+DII;7H$11377N 5d6M6M ^QUQ]Q] ^I !33VXVV	TXXu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sB   " H> ! K  >
J=	1J=JJ94J=8J99J= K#"K#c                   SSK nU R                  R                  S5      nUR                  S5      nUR	                  SUR
                  5      nUR                  U5      nU(       a   UR                  S5      R                  5       U l	        UR                  S5      (       a  UR                  SU5        U R                  S   c%  UR                  S5      (       a  S	U R                  S'   [        UR                  S
5      5      U R                  S
'   OUR                  SU5        SR                  U5      R                  S5      U l        g! [         a
    SU l	         Nf = f)a  
Determines language of a code block from shebang line and whether the
said line should be removed or left in place. If the shebang 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   Nr4   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%   rK   Thl_lines)rer,   r   r-   compileVERBOSEsearchgrouplowerr   
IndexErrorinsertr.   r   rJ   rA   )r/   rV   linesflcms         r   rB   CodeHilite._parseHeader   s   $ 	 t$YYq\JJ  ** HHRL!GGFO113	 wwvQ#||I&.17793E3E*.Y''5aggj6I'JDLL$ LLB99U#))$/  ! 	!s   &$E EE)r   r   r!   r.   r#   r,   r    N)r,   rF   )T)rK   boolreturnrF   )rd   None)	__name__
__module____qualname____firstlineno____doc__r0   rQ   rB   __static_attributes__r@   r2   r   r   r   :   s    6p(9v50r2   r   c                  8    \ rS rSr% SrS\S'   S	S jrS
S jrSrg)HiliteTreeprocessor   z&Highlight source code in code blocks. zdict[str, Any]configc                r    UR                  SS5      nUR                  SS5      nUR                  SS5      nU$ )zUnescape code.r9   r8   r;   r:   r7   r6   )rG   )r/   r?   s     r   code_unescape!HiliteTreeprocessor.code_unescape  s9    ||FC(||FC( ||GS)r2   c           	        UR                  S5      nU H  n[        U5      S:X  d  M  US   R                  S:X  d  M)  U R                  R	                  5       nUS   R
                  nUc  MW  [        U R                  U5      4U R                  R                  UR                  SS5      S.UD6nU R                  R                  R                  UR                  5       5      nUR                  5         S	Ul        Xsl        M     g)
z+Find code blocks and store in `htmlStash`. prer   r   codeNpygments_styledefault)
tab_lengthstylep)iterlentagro   copyr?   r   rq   mdrx   r-   	htmlStashstorerQ   clear)r/   rootblocksblocklocal_configr?   ru   placeholders           r   runHiliteTreeprocessor.run  s    5!E5zQ58<<6#9#{{//1Qx}}<!&&t,#ww11&**+;YG #	 #gg//55dkkmD  	(
% r2   r@   N)r?   rF   rd   rF   )r   zetree.Elementrd   re   )	rf   rg   rh   ri   rj   __annotations__rq   r   rk   r@   r2   r   rm   rm      s    1)r2   rm   c                  $    \ rS rSrSrS rS rSrg)CodeHiliteExtensioni#  z6Add source code highlighting to markdown code blocks. c           	     >   S S/SS/SS/SS/SS	/SS
/SS/SS/S.U l          UR                  5        HX  u  p#X R                   ;   a  U R                  X#5        M'  [        U[        5      (       a   [        USS9nUS/U R                   U'   MZ     g ! [         a     N"f = f)NzOUse lines numbers. True|table|inline=yes, False=no, None=auto. Default: `None`.Tz/Automatic language detection - Default: `True`.r)   z9Set class name for wrapper <div> - Default: `codehilite`.rw   z@Pygments HTML Formatter Style (Colorscheme). Default: `default`.Fz;Use inline styles instead of CSS classes - Default `False`.z\Highlight code blocks with pygments. Disable if using a JavaScript library. Default: `True`.r"   zTPrefix prepended to the language when `use_pygments` is false. Default: `language-`.r$   zDUse a specific formatter for Pygments highlighting. Default: `html`.)r&   r   r(   rv   	noclassesr    r!   r#   )preserve_noner=   )ro   items	setConfigrE   rF   r   r   )r/   kwargskeyvalues       r   r0   CodeHiliteExtension.__init__&  s     g G Y ] T t s ^#-
4 	/ ,,.JCkk!s* eS)) .uD I %*2;C  ) & s   /
B
BBc                    [        U5      nU R                  5       Ul        UR                  R	                  USS5        UR                  U 5        g)z0Add `HilitePostprocessor` to Markdown instance. rQ      N)rm   
getConfigsro   treeprocessorsregisterregisterExtension)r/   r   hiliters      r   extendMarkdown"CodeHiliteExtension.extendMarkdownQ  s@    %b)*
""7Hb9
T"r2   )ro   N)rf   rg   rh   ri   rj   r0   r   rk   r@   r2   r   r   r   #  s    A)/V#r2   r   c                     [        S0 U D6$ )Nr@   )r   )r   s    r   makeExtensionr   Z  s    (((r2   )r   rF   rd   z	list[int])rj   
__future__r   r=   r   r   r   utilr   typingr	   r
   r   xml.etree.ElementTreeetreeElementTreerC   r   pygments.lexersr   r   pygments.formattersr   pygments.utilr   ImportErrorr   r   rm   r   r   r@   r2   r   <module>r      s    #  * ! / /))">9+H
 }0 }0F#)- #)L4#) 4#n)i	  Hs   A; ;BB