U
    d)                     @   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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)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f | d S )Nlang_prefix	language-z6Prefix prepended to the language. Default: "language-")configsuper__init__)selfkwargs	__class__ C/tmp/pip-unpacked-wheel-muih9_xp/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   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                    s6   t  | || _d| _i | _d| _ddddg| _d S )NFZ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   9   s    z FencedBlockPreprocessor.__init__c              	   C   sx  | j s>| jjD ](}t|tr&| | _t|trd| _qd| _ d	|}| j
|}|rnddg i f\}}}}|dr| t|d\}}}t|r|d}n0|dr|d}|drt|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}nd } } }}|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  }qHqnqH| 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.   styleF)shebangr   r   z class=""z id="c                 s   s0   | ](\}}|d krd| dt | dV  qdS )r&   r0   z="r5   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grouphandle_attrsr
   lenpopr	   getcopyupdateformatr   Zhiliter   r   items_escapeZ	htmlStashstorestartendsplit)r   linesexttextmr.   idclassesr   Zlocal_configZ	highliterr1   Zid_attrZ	lang_attrZ
class_attrZkv_pairsprefixplaceholderr   r   r   runG   sl    







"



 .zFencedBlockPreprocessor.runc                 C   s   d}g }i }|D ]f\}}|dkr&|}q|dkr:| | q|dkrPt|||< q|| jkrnt|ddd||< q|||< q|||fS )z4 Return tuple: (id, [list, of, classes], {configs}) r,   rQ   .r/   FT)Zfail_on_errorsZpreserve_none)appendr	   r*   r   )r   r-   rQ   rR   Zconfigsr7   r8   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;r:   z&gt;r5   z&quot;)replace)r   txtr   r   r   rH      s
    zFencedBlockPreprocessor._escape)r"   r#   r$   recompiler   	MULTILINEDOTALLVERBOSEr=   r   rU   r@   rH   r%   r   r   r   r   r   +   s   	Kr   c                  K   s
   t f | S )N)r   )r   r   r   r   makeExtension   s    ra   )__doc__textwrapr   r,   r   r   r   Z
codehiliter   r   r	   	attr_listr
   r   utilr   Zserializersr   r\   r   r   ra   r   r   r   r   <module>   s    