a
    ¶¯6`‰  ã                   @   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f i |¤Ž d S )NÚlang_prefixú	language-z6Prefix prepended to the language. Default: "language-")ÚconfigÚsuperÚ__init__)ÚselfÚkwargs©Ú	__class__© ú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. 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                       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   aa  
            (?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)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   8   s    z FencedBlockPreprocessor.__init__c              
   C   sJ  | j s>| jjD ](}t|tƒr&| ¡ | _t|tƒrd| _qd| _ d 	|¡}| j
 |¡}|r@ddg i f\}}}}| d¡r¦|  t| d¡ƒ¡\}}}t|ƒrÖ| d¡}n0| d¡rº| d¡}| d¡rÖt| d¡ƒ|d< | jrZ| jd	 rZ| d	d¡rZ| j ¡ }	|	 |¡ |r,d
 d 	|¡|	d ¡|	d< t| d¡f||	 dd¡dœ|	¤Ž}
|
 ¡ }nªd } } }}|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… ¡}qHq@qH| d¡S )z6 Match and store Fenced Code Blocks in the HtmlStash. TÚ
NÚ Úattrsr   ÚlangÚhl_linesr$   z{} {}ú Z	css_classÚcodeZpygments_styleÚdefault)r,   Zstylez class="{}{}"r   r   z class="{}"z id="{}"Fc                 s   s(   | ] \}}|d krdj ||dV  qdS )r$   z	{k}="{v}")ÚkÚvN)Úformat)Ú.0r1   r2   r   r   r   Ú	<genexpr>„   s   z.FencedBlockPreprocessor.run.<locals>.<genexpr>z1<pre{id}{cls}><code{lang}{kv}>{code}</code></pre>)ÚidÚclsr,   Zkvr/   z{}
{}
{}) r%   r   ZregisteredExtensionsÚ
isinstancer   r   r&   r   r'   ÚjoinÚFENCED_BLOCK_REÚsearchÚgroupÚhandle_attrsr
   ÚlenÚpopr	   ÚgetÚcopyÚupdater3   r   Zhiliter   ÚitemsÚ_escapeZ	htmlStashZstoreÚstartÚendÚsplit)r   ÚlinesZextÚtextÚmr,   r6   Úclassesr   Zlocal_configZ	highliterr/   Zid_attrZ	lang_attrZ
class_attrZkv_pairsZplaceholderr   r   r   ÚrunF   sz    







"

þÿ
ýü

ÿ
ûþzFencedBlockPreprocessor.runc                 C   s‚   d}g }i }|D ]f\}}|dkr&|}q|dkr:|  |¡ q|dkrPt|ƒ||< q|| jv rnt|ddd||< q|||< q|||fS )z4 Return tuple: (id, [list, of, classes], {configs}) r*   r6   Ú.r-   FT)Zfail_on_errorsZpreserve_none)Úappendr	   r(   r   )r   r+   r6   rK   Zconfigsr1   r2   r   r   r   r=   —   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   Ztxtr   r   r   rD   ©   s
    zFencedBlockPreprocessor._escape)r    r!   r"   ÚreÚcompiler   Ú	MULTILINEÚDOTALLÚVERBOSEr:   r   rL   r=   rD   r#   r   r   r   r   r   *   s   	öQr   c                  K   s   t f i | ¤ŽS )N)r   )r   r   r   r   ÚmakeExtension²   s    rY   )Ú__doc__Útextwrapr   r*   r   r   r   Z
codehiliter   r   r	   Z	attr_listr
   r   Úutilr   rT   r   r   rY   r   r   r   r   Ú<module>   s    	