
    c)                         d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZmZ dd	lmZ dd
lmZ ddlZ G d de          Z G d de          Zd ZdS )a  
Fenced Code Extension for Python Markdown
=========================================

This extension adds Fenced Code Blocks to Python-Markdown.

See <https://Python-Markdown.github.io/extensions/fenced_code_blocks>
for documentation.

Original code Copyright 2007-2008 [Waylan Limberg](http://achinghead.com/).


All changes Copyright 2008-2014 The Python Markdown Project

License: [BSD](https://opensource.org/licenses/bsd-license.php)
    )dedent   )	Extension   )Preprocessor)
CodeHiliteCodeHiliteExtensionparse_hl_lines)	get_attrsAttrListExtension)parseBoolValue_escape_attrib_htmlNc                   $     e Zd Z fdZd Z xZS )FencedCodeExtensionc                 P    dddgi| _          t                      j        di | d S )Nlang_prefix	language-z6Prefix prepended to the language. Default: "language-" )configsuper__init__)selfkwargs	__class__s     ?lib/python3.11/site-packages/markdown/extensions/fenced_code.pyr   zFencedCodeExtension.__init__   s<    K)ab
 	""6"""""    c                     |                     |            |j                            t          ||                                           dd           dS )z7 Add FencedBlockPreprocessor to the Markdown instance. fenced_code_block   N)registerExtensionpreprocessorsregisterFencedBlockPreprocessor
getConfigs)r   mds     r   extendMarkdownz"FencedCodeExtension.extendMarkdown$   sN    
T"""
!!"9"doo>O>O"P"PRegijjjjjr   )__name__
__module____qualname__r   r'   __classcell__r   s   @r   r   r      sN        # # # # #k k k k k k kr   r   c                        e Zd Z ej         ed          ej        ej        z  ej        z            Z	 fdZ
d Zd Zd Z xZS )r$   a}  
            (?P<fence>^(?:~{3,}|`{3,}))[ ]*                          # opening fence
            ((\{(?P<attrs>[^\}\n]*)\})|                              # (optional {attrs} or
            (\.?(?P<lang>[\w#.+-]*)[ ]*)?                            # optional (.)lang
            (hl_lines=(?P<quot>"|')(?P<hl_lines>.*?)(?P=quot)[ ]*)?) # optional hl_lines)
            \n                                                       # newline (end of opening fence)
            (?P<code>.*?)(?<=\n)                                     # the code block
            (?P=fence)[ ]*$                                          # closing fence
        c                     t                                          |           || _        d| _        i | _        d| _        g d| _        d S )NF)linenums
guess_lang	noclassesuse_pygments)r   r   r   checked_for_depscodehilite_confuse_attr_listbool_options)r   r&   r   r   s      r   r   z FencedBlockPreprocessor.__init__9   sT     %!"
 
 
r   c           	         | j         s`| j        j        D ]L}t          |t                    r|                                | _        t          |t                    rd| _        Md| _         d	                    |          }	 | j
                            |          }|rddg i f\  }}}}|                    d          r^|                     t          |                    d                              \  }}}t          |          r|                    d          }nd|                    d          r|                    d          }|                    d	          r%t#          |                    d	                    |d	<   | j        r| j        d
         r|                    d
d          r| j                                        }	|	                    |           |r2d                    d	                    |          |	d                   |	d<   t-          |                    d          f||	                    dd          d|	}
|
                    d          }ndx}x}x}}|r0| j                            dd          }d| t3          |           d}|r&dt3          d	                    |                     d}|rdt3          |           d}| j        rI|rG|                    d
d          s1d	                    d |                                D                       }|                     |                    d                    }d| | d| | d| d	}| j        j                            |          }|d|                                          d| d||                                d          }nn9|                     d          S )z6 Match and store Fenced Code Blocks in the HtmlStash. T
r   N attrsr   langhl_linesr2   z{} {} 	css_classcodepygments_styledefault)r;   styleF)shebangr   r   z class=""z id="c              3   T   K   | ]#\  }}|d k    d| dt          |           dV  $dS )r2   r=   z="rD   Nr   ).0kvs      r   	<genexpr>z.FencedBlockPreprocessor.run.<locals>.<genexpr>   sb       + +CG1a]^bp]p+>>>%8%;%;>>>+ + + + + +r   z<prez><code>z</code></pre>)!r3   r&   registeredExtensions
isinstancer	   r%   r4   r   r5   joinFENCED_BLOCK_REsearchgrouphandle_attrsr   lenpopr
   getcopyupdateformatr   hiliter   r   items_escape	htmlStashstorestartendsplit)r   linesexttextmr;   idclassesr   local_config	highliterr?   id_attr	lang_attr
class_attrkv_pairsprefixplaceholders                     r   runzFencedBlockPreprocessor.runG   s&    $ 	)w3 . .c#677 <+.>>+;+;D(c#455 .)-D&$(D!yy:	$++D11A 8,0"b",<)b'6777## 	Q*.*;*;IagggFVFV<W<W*X*X'B7|| .&{{1~~wwv / wwvwwz** Q-;AGGJ<O<O-P-Pz* ' $gD,@,P $gU[U_U_`nptUuUu $g#'#7#<#<#>#>L ''///  4;NNHHW--(55 5[1 !+!!*../?KK! ! '	! !I %++E+::DDBDDGDiD*x T!%!L!L$Sv$S7J47P7P$S$S$S	 Z%Y0CCHHWDUDU0V0V%Y%Y%Y
 E"D*=b*A*A"D"D"D) f VZZX]=^=^  $&77 + +KQ<<>>+ + + $ $  <<88Df'f:ffYfffSWfffD"g/55d;;z		z*MMkMMT!%%''((^MMu:	v zz$r   c                     d}g }i }|D ]g\  }}|dk    r|}|dk    r|                     |           *|dk    rt          |          ||<   C|| j        v rt          |dd          ||<   b|||<   h|||fS )z4 Return tuple: (id, [list, of, classes], {configs}) r9   rd   .r<   FT)fail_on_errorspreserve_none)appendr
   r6   r   )r   r:   rd   re   configsrG   rH   s          r   rQ   z$FencedBlockPreprocessor.handle_attrs   s     
	 
	DAqDy 	c q!!!!j +A..

d'' +AeSWXXX



7G##r   c                     |                     dd          }|                     dd          }|                     dd          }|                     dd          }|S )	z basic html escaping &z&amp;<z&lt;rJ   z&gt;rD   z&quot;)replace)r   txts     r   rZ   zFencedBlockPreprocessor._escape   sS    kk#w''kk#v&&kk#v&&kk#x((
r   )r(   r)   r*   recompiler   	MULTILINEDOTALLVERBOSErN   r   rn   rQ   rZ   r+   r,   s   @r   r$   r$   +   s         bj  	 	 	ry 2:- O
 
 
 
 
I  I  I V$ $ $$      r   r$   c                      t          di | S )Nr   )r   )r   s    r   makeExtensionr      s    (((((r   )__doc__textwrapr   r9   r   r"   r   
codehiliter   r	   r
   	attr_listr   r   utilr   serializersr   rz   r   r$   r   r   r   r   <module>r      s(   $             ( ( ( ( ( ( G G G G G G G G G G 3 3 3 3 3 3 3 3 ! ! ! ! ! ! - - - - - - 				k k k k k) k k k    l   D) ) ) ) )r   