o
    +el                      @  s   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mZ dd	lmZmZ dd
lmZ ddlmZ ddlZddlmZmZmZ erNddlmZ G dd deZG dd deZdd ZdS )z
This extension adds Fenced Code Blocks to Python-Markdown.

See the [documentation](https://Python-Markdown.github.io/extensions/fenced_code_blocks)
for details.
    )annotations)dedent   )	Extension   )Preprocessor)
CodeHiliteCodeHiliteExtensionparse_hl_lines)get_attrs_and_remainderAttrListExtension)parseBoolValue_escape_attrib_htmlN)TYPE_CHECKINGAnyIterable)Markdownc                      s$   e Zd Z fddZdd Z  ZS )FencedCodeExtensionc                   s&   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__r   ?lib/python3.10/site-packages/markdown/extensions/fenced_code.pyr   '   s   zFencedCodeExtension.__init__c                 C  s(   | |  |jt||  dd dS )z9 Add `FencedBlockPreprocessor` to the Markdown instance. Zfenced_code_block   N)ZregisterExtensionpreprocessorsregisterFencedBlockPreprocessor
getConfigs)r   mdr   r   r   extendMarkdown.   s   
z"FencedCodeExtension.extendMarkdown)__name__
__module____qualname__r   r&   __classcell__r   r   r   r   r   &   s    r   c                      s^   e Zd ZdZeedejejB ej	B Z
d fddZdddZdddZdddZ  ZS )r#   z& Find and extract fenced code blocks. 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
        r%   r   r   dict[str, Any]c                   s2   t  | || _d| _i | _d| _g d| _d S )NF)ZlinenumsZ
guess_langZ	noclassesuse_pygments)r   r   r   checked_for_depscodehilite_confuse_attr_listbool_options)r   r%   r   r   r   r   r   E   s   z FencedBlockPreprocessor.__init__lines	list[str]returnc              	   C  s  | j s| jjD ]}t|tr| | _t|trd| _qd| _ d	|}d}	 | j
||}|rGddg i f\}}}}	|drct|d\}
}|rQ|d}q&| |
\}}}	t|rb|d}n|drm|d}|d	r{t|d	|	d	< | jr| jd
 r|	d
dr| j }||	 |rdd	||d |d< t|df||ddd|}|jdd}ndd } } }}|r| jdd}d| t| d}|rdtd	| d}|rdt| d}| jr|	r|	d
dsd	dd |	 D }| |d}d| | d| | d| d	}| jj|}|d|   d| d|| d  }| d t| }nnq'| dS )z8 Match and store Fenced Code Blocks in the `HtmlStash`. T
r   r   N attrslanghl_linesr,   z{} {} Z	css_classcodeZpygments_styledefault)r7   ZstyleF)Zshebangr   r   z class=""z id="c                 s  s2    | ]\}}|d krd| dt | dV  qdS )r,   r9   z="r<   Nr   ).0kvr   r   r   	<genexpr>   s    (z.FencedBlockPreprocessor.run.<locals>.<genexpr>z<prez><code>z</code></pre>)!r-   r%   ZregisteredExtensions
isinstancer	   r$   r.   r   r/   joinFENCED_BLOCK_REsearchgroupr   endhandle_attrslenpopr
   getcopyupdateformatr   Zhiliter   r   items_escapeZ	htmlStashstorestartsplit)r   r1   exttextindexmr7   idclassesr   r6   Z	remainderZlocal_configZ	highliterr:   Zid_attrZ	lang_attrZ
class_attrZkv_pairsprefixZplaceholderr   r   r   runS   s   













 ,
AzFencedBlockPreprocessor.runr6   Iterable[tuple[str, str]]%tuple[str, list[str], dict[str, Any]]c                 C  s   d}g }i }|D ]3\}}|dkr|}q|dkr| | q|dkr(t|||< q|| jv r7t|ddd||< q|||< q|||fS )z6 Return tuple: `(id, [list, of, classes], {configs})` r5   rX   .r8   FT)Zfail_on_errorsZpreserve_none)appendr
   r0   r   )r   r6   rX   rY   Zconfigsr>   r?   r   r   r   rH      s   


z$FencedBlockPreprocessor.handle_attrstxtstrc                 C  s4   | dd}| dd}| dd}| dd}|S )	z basic html escaping &z&amp;<z&lt;rA   z&gt;r<   z&quot;)replace)r   r`   r   r   r   rP      s
   zFencedBlockPreprocessor._escape)r%   r   r   r+   )r1   r2   r3   r2   )r6   r\   r3   r]   )r`   ra   r3   ra   )r'   r(   r)   __doc__recompiler   	MULTILINEDOTALLVERBOSErD   r   r[   rH   rP   r*   r   r   r   r   r#   5   s    	

Rr#   c                  K  s   t di | S )Nr   )r   )r   r   r   r   makeExtension   s   rk   )re   Z
__future__r   textwrapr   r5   r   r!   r   Z
codehiliter   r	   r
   Z	attr_listr   r   utilr   Zserializersr   rf   typingr   r   r   Zmarkdownr   r   r#   rk   r   r   r   r   <module>   s"    