3 \@sdZddlmZddlmZddlmZddlmZddlm Z dd l Z y e j Z Wn e k rrdd l m Z YnXd d Zd dZddZddZe defdefdefdefd"gZddZddZGdddeZGdddeZifd d!Zd S)#a Attribute List Extension for Python-Markdown ============================================ Adds attribute list syntax. Inspired by [maruku](http://maruku.rubyforge.org/proposal.html#attribute_lists)'s feature of the same name. Copyright 2011 [Waylan Limberg](http://achinghead.com/). Contact: markdown@freewisdom.org License: BSD (see ../LICENSE.md for details) Dependencies: * [Python 2.4+](http://python.org) * [Markdown 2.1+](http://packages.python.org/Markdown/) )absolute_import)unicode_literals) Extension) Treeprocessor) isBlockLevelN)ScannercCs|jd\}}||jdfS)N=")splitstrip)stkvr*build/lib/markdown/extensions/attr_list.py_handle_double_quote"srcCs|jd\}}||jdfS)Nr ')r r )rrrrrrr_handle_single_quote&srcCs |jdS)Nr )r )rrrrr_handle_key_value*srcCs<|jdrd|ddfS|jdr4d|ddfS||fS)N.r#id) startswith)rrrrr _handle_word-s   rz [^ ]+=".*?"z [^ ]+='.*?'z [^ ]+=[^ ]*z[^ ]+ cCstj|dS)z= Parse attribute list and return a list of attribute tuples. r)_scannerscan)strrrr get_attrs<sr!cCs |jdkS)Nh1h2h3h4h5h6)r"r#r$r%r&r')tag)elemrrrisheader@sr*c@s\eZdZdZejdeZejdeZejdeZejdZ ddZ dd Z d d Z d S) AttrListTreeprocessorz\{\:?([^\}]*)\}z [ ]+%s[ ]*$z \n[ ]*%s[ ]*$z^%sz[^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]+cCsx|jD]}t|jr|j}t|s6|jdkr<|j}t|oL|jdkrd}x$t|D]\}}|jd kr^|}Pq^W|dkr|d jr|j |d j}|r|j ||j d|d jd|j |d _n|dk o|dko||djrB|j ||dj}|r|j ||j d||djd|j ||d_n@|j r|j |j }|r|j ||j d|j d|j |_ qt|r|djr|j |dj}|r|j ||j d|djd|j |d_t|r|djjdj|d_n|j r|j |j }| r>|jdkr>tj |j|j }|r|j ||j d|j d|j |_ t|r|j jdj|_ q |jr |jj|j}|r |j ||j d|j|jd|_q WdS)NdtliulolrrrZtd)r.r/r0r0r0r0r0r0r0r0r0) getiteratorrr(BLOCK_REr* HEADER_RElen enumeratetailsearch assign_attrsgroupstarttextrstripreBASE_RE INLINE_REmatchend)selfdocr)REposichildmrrrrunNs^   &    zAttrListTreeprocessor.runcCsfx`t|D]T\}}|dkrL|jd}|r>|jdd||fq^|jd|q |j|j||q WdS)z Assign attrs to element. rclassz%s %sN)r!getset sanitize_name)rBr)attrsrrclsrrrr8s z"AttrListTreeprocessor.assign_attrscCs|jjd|S)zz Sanitize name as 'an XML Name, minus the ":"'. See http://www.w3.org/TR/REC-xml-names/#NT-NCName _)NAME_REsub)rBnamerrrrMsz#AttrListTreeprocessor.sanitize_nameN) __name__ __module__ __qualname__r>r=compiler3r2r?rQrIr8rMrrrrr+Cs >r+c@seZdZddZdS)AttrListExtensioncCs|jjdt|ddS)N attr_listz >prettify)treeprocessorsaddr+)rBmd md_globalsrrrextendMarkdownsz AttrListExtension.extendMarkdownN)rTrUrVr^rrrrrXsrXcCs t|dS)N)configs)rX)r_rrr makeExtensionsr`)rN)__doc__ __future__rrrrZrutilrr=r AttributeErrorZsrerrrrrr!r*r+rXr`rrrrs2      _