U
    \> e¸  ã                   @  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	Z	erLdd	l
mZ d
d„ Zdd„ Zdd„ Zdd„ Ze	 defdefdefdefdg¡Zdddœdd„Zdddœdd „ZG d!d"„ d"eƒZG d#d$„ d$eƒZd%d&„ ZdS )'zè
 Adds attribute list syntax. Inspired by
[Maruku](http://maruku.rubyforge.org/proposal.html#attribute_lists)'s
feature of the same name.

See the [documentation](https://Python-Markdown.github.io/extensions/attr_list)
for details.
é    )Úannotations)ÚTYPE_CHECKINGé   )Ú	Extensioné   )ÚTreeprocessorN)ÚElementc                 C  s   |  dd¡\}}|| d¡fS )Nú=r   ú"©ÚsplitÚstrip©ÚsÚtÚkÚv© r   úA/tmp/pip-unpacked-wheel-wj0og6ym/markdown/extensions/attr_list.pyÚ_handle_double_quote%   s    r   c                 C  s   |  dd¡\}}|| d¡fS )Nr	   r   ú'r   r   r   r   r   Ú_handle_single_quote*   s    r   c                 C  s   |  dd¡S )Nr	   r   )r   ©r   r   r   r   r   Ú_handle_key_value/   s    r   c                 C  s<   |  d¡rd|dd … fS |  d¡r4d|dd … fS ||fS )NÚ.r   ú#Úid)Ú
startswithr   r   r   r   Ú_handle_word3   s
    

r   z[^ =]+=".*?"z[^ =]+='.*?'z[^ =]+=[^ =]+z[^ =]+)ú NÚstrzlist[tuple[str, str]])r    Úreturnc                 C  s   t  | ¡d S )z= Parse attribute list and return a list of attribute tuples. r   )Ú_scannerÚscan)r    r   r   r   Ú	get_attrsD   s    r$   r   Úbool)Úelemr!   c                 C  s
   | j dkS )N)Úh1Úh2Úh3Úh4Úh5Úh6)Útag)r&   r   r   r   ÚisheaderI   s    r.   c                   @  s|   e Zd ZdZe d e¡¡Ze d e¡¡Ze d e¡¡Z	e d¡Z
dddœd	d
„Zddddœdd„Zdddœdd„ZdS )ÚAttrListTreeprocessorz!\{\:?[ ]*([^\}\n ][^\}\n]*)[ ]*\}z[ ]+{}[ ]*$z\n[ ]*{}[ ]*$z^{}zÃ[^A-Z_a-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02ff\u0370-\u037d\u037f-\u1fff\u200c-\u200d\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd\:\-\.0-9\u00b7\u0300-\u036f\u203f-\u2040]+r   ÚNone)Údocr!   c                 C  sª  |  ¡ D ]š}| j |j¡rf| j}t|ƒs6|jdkr<| j}t|ƒrˆ|jdkrˆd }t|ƒD ]\}}|jdkr^|} qzq^|d krÐ|d j	rÐ| 
|d j	¡}|rÎ|  || d¡¡ |d j	d | ¡ … |d _	n¶|d k	rF|dkrF||d  j	rF| 
||d  j	¡}|r†|  || d¡¡ ||d  j	d | ¡ … ||d  _	n@|jrd| 
|j¡}|rd|  || d¡¡ |jd | ¡ … |_nÜt|ƒr|d j	r| 
|d j	¡}|rd|  || d¡¡ |d j	d | ¡ … |d _	t|ƒrd|d j	 d¡ ¡ |d _	n\|jr¤| 
|j¡}|r¤|  || d¡¡ |jd | ¡ … |_t|ƒr¤|j d¡ ¡ |_q|j	r| j |j	¡}|r|  || d¡¡ |j	| ¡ d … |_	qd S )N)ÚdtÚtdÚthÚli)ÚulÚoléÿÿÿÿr   r   r   )ÚiterÚmdZis_block_levelr-   ÚBLOCK_REr.   Ú	HEADER_REÚlenÚ	enumerateÚtailÚsearchÚassign_attrsÚgroupÚstartÚtextÚrstripÚ	INLINE_REÚmatchÚend)Úselfr1   r&   ZREÚposÚiÚchildÚmr   r   r   ÚrunY   sZ    
$&

zAttrListTreeprocessor.runr    )r&   Úattrsr!   c                 C  sb   t |ƒD ]T\}}|dkrJ| d¡}|r<| dd ||¡¡ q\| d|¡ q| |  |¡|¡ qdS )z Assign `attrs` to element. r   Úclassz{} {}N)r$   ÚgetÚsetÚformatÚsanitize_name)rI   r&   rO   r   r   Úclsr   r   r   rA   •   s    
z"AttrListTreeprocessor.assign_attrs)Únamer!   c                 C  s   | j  d|¡S )z{
        Sanitize name as 'an XML Name, minus the ":"'.
        See https://www.w3.org/TR/REC-xml-names/#NT-NCName
        Ú_)ÚNAME_REÚsub)rI   rV   r   r   r   rT   £   s    z#AttrListTreeprocessor.sanitize_nameN)Ú__name__Ú
__module__Ú__qualname__ZBASE_REÚreÚcompilerS   r<   r;   rF   rX   rN   rA   rT   r   r   r   r   r/   M   s   
<r/   c                   @  s   e Zd ZdZdd„ ZdS )ÚAttrListExtensionz. Attribute List extension for Python-Markdown c                 C  s"   |j  t|ƒdd¡ | | ¡ d S )NÚ	attr_listé   )ÚtreeprocessorsÚregisterr/   ZregisterExtension)rI   r:   r   r   r   ÚextendMarkdown­   s    z AttrListExtension.extendMarkdownN)rZ   r[   r\   Ú__doc__rd   r   r   r   r   r_   «   s   r_   c                  K  s
   t f | ŽS )N)r_   )Úkwargsr   r   r   ÚmakeExtension²   s    rg   )re   Ú
__future__r   Útypingr   Ú r   rb   r   r]   Úxml.etree.ElementTreer   r   r   r   r   ÚScannerr"   r$   r.   r/   r_   rg   r   r   r   r   Ú<module>   s.   	û	^