\@sNdZddlmZddlmZddlmZddlmZddlm Z dd l Z y e j Z Wn"e k rdd l m Z YnXd d Zd dZddZddZe defdefdefdefd"gZddZddZGdddeZGdddeZid 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*srcCsP|jdr#d|ddfS|jdrFd|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@seZdZdZejdeZejdeZejdeZejdZ 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|jrx|j}t|sF|jdkrR|j}nt|r|jdkrd}x3t|D]%\}}|jd kr|}PqqW|dkr!|d jr!|j |d j}|r|j ||j d|d jd|j |d _qqu|dk r|dkr||djr|j ||dj}|r|j ||j d||djd|j ||d_qqu|j ru|j |j }|r|j ||j d|j d|j |_ qquqt|r|djr|j |dj}|ru|j ||j d|djd|j |d_t|r|djjdj|d_qquq|j r|j |j }| r |jdkr tj |j|j }n|ru|j ||j d|j d|j |_ t|rr|j jdj|_ qrquqq |jr |jj|j}|r|j ||j d|j|jd|_qq q WdS)NdtliulolrrrZtd)zulzolr0r0r0r0r0r0r0r0r0) getiteratorrr(BLOCK_REr* HEADER_RElen enumeratetailsearch assign_attrsgroupstarttextrstripreBASE_RE INLINE_REmatchend)selfdocr)REposichildmrrrrunNs^  *)2 %$ ,  ' zAttrListTreeprocessor.runcCsxt|D]v\}}|dkrj|jd}|rW|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^rrrrrXs rXcCs td|S)Nconfigs)rX)r_rrr makeExtensionsr`)rN)__doc__ __future__rrrrZrutilrr=r AttributeErrorZsrerrrrrr!r*r+rXr`rrrrs2              _