o
    ç&•a²  ã                   @   sŒ   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ZG dd„ deƒZG dd„ deƒZd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)ÚparseBoolValueNc                       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   úA/usr/lib/python3/dist-packages/markdown/extensions/fenced_code.pyr      s   ÿzFencedCodeExtension.__init__c                 C   s(   |  | ¡ |j t||  ¡ ƒdd¡ dS )z7 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                       sR   e 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   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   8   s   z FencedBlockPreprocessor.__init__c              
   C   s:  | 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 ¡ }	|	 |¡ |r“d d 	|¡|	d ¡|	d< t| d¡f||	 dd¡dœ|	¤Ž}
|
jdd�}nOd } } }}|rÁd | j dd¡|¡}|rËd d 	|¡¡}|rÒd |¡}| jrë|rë| d
d¡sëdd 	dd„ | ¡ D ƒ¡ }dj|||||  | d¡¡d�}| jj |¡}d |d| ¡ … ||| ¡ d… ¡}nnq%| d¡S )z6 Match and store Fenced Code Blocks in the HtmlStash. TÚ
r   NÚ Úattrsr   ÚlangÚhl_linesr)   z{} {}ú Ú	css_classÚcodeÚpygments_styleÚdefault)r1   ÚstyleF)Úshebangz class="{}{}"r   r   z class="{}"z id="{}"c                 s   s*   � | ]\}}|d krdj ||d�V  qdS )r)   z	{k}="{v}")ÚkÚvN)Úformat)Ú.0r:   r;   r   r   r   Ú	<genexpr>„   s   €  ÿz.FencedBlockPreprocessor.run.<locals>.<genexpr>z1<pre{id}{cls}><code{lang}{kv}>{code}</code></pre>)ÚidÚclsr1   Úkvr5   z{}
{}
{}) r*   r    ÚregisteredExtensionsÚ
isinstancer   r   r+   r   r,   ÚjoinÚFENCED_BLOCK_REÚsearchÚgroupÚhandle_attrsr
   ÚlenÚpopr	   ÚgetÚcopyÚupdater<   r   Úhiliter   ÚitemsÚ_escapeÚ	htmlStashÚstoreÚstartÚendÚsplit)r   ÚlinesÚextÚtextÚmr1   r?   Úclassesr   Úlocal_configÚ	highliterr5   Úid_attrÚ	lang_attrÚ
class_attrÚkv_pairsÚplaceholderr   r   r   ÚrunF   s‚   


€


€




þÿ
ýü

ÿûþÀ
Az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 )z4 Return tuple: (id, [list, of, classes], {configs}) r/   r?   Ú.r2   FT)Úfail_on_errorsÚpreserve_none)Úappendr	   r-   r   )r   r0   r?   rZ   Úconfigsr:   r;   r   r   r   rH   —   s   


z$FencedBlockPreprocessor.handle_attrsc                 C   s4   |  dd¡}|  dd¡}|  dd¡}|  dd¡}|S )	z basic html escaping ú&z&amp;ú<z&lt;ú>z&gt;ú"z&quot;)Úreplace)r   Útxtr   r   r   rP   ©   s
   zFencedBlockPreprocessor._escape)r"   r#   r$   ÚreÚcompiler   Ú	MULTILINEÚDOTALLÚVERBOSErE   r   rb   rH   rP   r%   r   r   r   r   r   *   s    	öQr   c                  K   s   t di | ¤ŽS )Nr   )r   )r   r   r   r   ÚmakeExtension²   s   rs   )Ú__doc__Útextwrapr   r/   r   r   r   Ú
codehiliter   r   r	   Ú	attr_listr
   r   Úutilr   rn   r   r   rs   r   r   r   r   Ú<module>   s     	