o
    g~                     @  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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AttrListExtension)parseBoolValue_escape_attrib_htmlNc                      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/html/bloggers_ems/venv/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                      sV   e Zd ZdZeedejejB ej	B Z
 fddZdd Zdd Z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
        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   A   s   z FencedBlockPreprocessor.__init__c              	   C  sd  | j s| jjD ]}t|tr| | _t|trd| _qd| _ d	|}	 | j
|}|r+ddg i f\}}}}|drT| t|d\}}}t|rS|d}n|dr^|d}|d	rlt|d	|d	< | jr| jd
 r|d
dr| j }	|	| |rdd	||	d |	d< t|df||	ddd|	}
|
jdd}nad } } }}|r| jdd}d| t| d}|rdtd	| d}|rdt| d}| jr|r|d
dsd	dd | D }| |d}d| | d| | d| d	}| jj|}|d|   d| d|| d  }nnq%| dS )z8 Match and store Fenced Code Blocks in the `HtmlStash`. T
r   N attrsr   langhl_linesr,   z{} {} 	css_classcodepygments_styledefault)r4   styleF)shebangr   r   z class=""z id="c                 s  s2    | ]\}}|d krd| dt | dV  qdS )r,   r6   z="r=   Nr   ).0kvr   r   r   	<genexpr>   s    (z.FencedBlockPreprocessor.run.<locals>.<genexpr>z<prez><code>z</code></pre>)!r-   r#   registeredExtensions
isinstancer	   r"   r.   r   r/   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mr4   idclassesr   local_config	highliterr8   id_attr	lang_attr
class_attrkv_pairsprefixplaceholderr   r   r   runO   st   












 .
;zFencedBlockPreprocessor.runc                 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})` r2   r\   .r5   FT)fail_on_errorspreserve_none)appendr
   r0   r   )r   r3   r\   r]   configsr?   r@   r   r   r   rI      s   


z$FencedBlockPreprocessor.handle_attrsc                 C  s4   | dd}| dd}| dd}| dd}|S )	z basic html escaping &z&amp;<z&lt;rB   z&gt;r=   z&quot;)replace)r   txtr   r   r   rR      s
   zFencedBlockPreprocessor._escape)r%   r&   r'   __doc__recompiler   	MULTILINEDOTALLVERBOSErF   r   rf   rI   rR   r(   r   r   r   r   r!   1   s    	Kr!   c                  K  s   t di | S )Nr   )r   )r   r   r   r   makeExtension   s   rv   )rp   
__future__r   textwrapr   r2   r   r   r   
codehiliter   r	   r
   	attr_listr   r   utilr   serializersr   rq   r   r!   rv   r   r   r   r   <module>   s    