o
    >hl                      @  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   /var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/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. fenced_code_block   N)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)linenums
guess_lang	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_linesr1   z{} {} 	css_classcodepygments_styledefault)r<   styleF)shebangr   r   z class=""z id="c                 s  s2    | ]\}}|d krd| dt | dV  qdS )r1   r>   z="rE   Nr   ).0kvr   r   r   	<genexpr>   s    (z.FencedBlockPreprocessor.run.<locals>.<genexpr>z<prez><code>z</code></pre>)!r2   r'   registeredExtensions
isinstancer	   r&   r3   r   r4   joinFENCED_BLOCK_REsearchgroupr   endhandle_attrslenpopr
   getcopyupdateformatr   hiliter   r   items_escape	htmlStashstorestartsplit)r   r6   exttextindexmr<   idclassesr   r;   	remainderlocal_config	highliterr@   id_attr	lang_attr
class_attrkv_pairsprefixplaceholderr   r   r   runS   s   













 ,
AzFencedBlockPreprocessor.runr;   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})` r:   rd   .r=   FT)fail_on_errorspreserve_none)appendr
   r5   r   )r   r;   rd   re   configsrG   rH   r   r   r   rR      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;rJ   z&gt;rE   z&quot;)replace)r   rw   r   r   r   r[      s
   zFencedBlockPreprocessor._escape)r'   r   r   r-   )r6   r7   r8   r7   )r;   rp   r8   rq   )rw   rx   r8   rx   )r)   r*   r+   __doc__recompiler   	MULTILINEDOTALLVERBOSErN   r   ro   rR   r[   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   r   )r|   
__future__r   textwrapr   r:   r   r#   r   
codehiliter   r	   r
   	attr_listr   r   utilr   serializersr   r}   typingr   r   r   markdownr   r   r%   r   r   r   r   r   <module>   s"    