3 \@sdZddlmZddlmZddlmZddlmZddlm Z m Z dd l Z dd l Z dd l Z e jd Ze jd Zd d ZddZddZddZGdddeZGdddeZdddZd S)a HeaderID Extension for Python-Markdown ====================================== Auto-generate id attributes for HTML headers. Basic usage: >>> import markdown >>> text = "# Some Header #" >>> md = markdown.markdown(text, ['headerid']) >>> print md

Some Header

All header IDs are unique: >>> text = ''' ... #Header ... #Header ... #Header''' >>> md = markdown.markdown(text, ['headerid']) >>> print md

Header

Header

Header

To fit within a html template's hierarchy, set the header base level: >>> text = ''' ... #Some Header ... ## Next Level''' >>> md = markdown.markdown(text, ['headerid(level=3)']) >>> print md

Some Header

Next Level

Works with inline markup. >>> text = '#Some *Header* with [markup](http://example.com).' >>> md = markdown.markdown(text, ['headerid']) >>> print md

Some Header with markup.

Turn off auto generated IDs: >>> text = ''' ... # Some Header ... # Another Header''' >>> md = markdown.markdown(text, ['headerid(forceid=False)']) >>> print md

Some Header

Another Header

Use with MetaData extension: >>> text = '''header_level: 2 ... header_forceid: Off ... ... # A Header''' >>> md = markdown.markdown(text, ['headerid', 'meta']) >>> print md

A Header

Copyright 2007-2011 [Waylan Limberg](http://achinghead.com/). Project website: Contact: markdown@freewisdom.org License: BSD (see ../docs/LICENSE for details) Dependencies: * [Python 2.3+](http://python.org) * [Markdown 2.0+](http://packages.python.org/Markdown/) )absolute_import)unicode_literals) Extension) Treeprocessor)HTML_PLACEHOLDER_REparseBoolValueNMARKDOWNz^(.*)_([0-9]+)$cCsBtjd|jdd}tjdd|jdjj}tjd|||S)z, Slugify a string, to make it URL friendly. ZNFKDasciiignorez[^\w\s-]z[%s\s]+) unicodedata normalizeencoderesubdecodestriplower)value separatorr)build/lib/markdown/extensions/headerid.pyslugify[srcCs^xN||ks| rNtj|}|r@d|jdt|jddf}qd|df}qW|j||S)z@ Ensure id is unique in set of ids. Append '_1', '_2'... if not z%s_%drr) IDCOUNT_REmatchgroupintadd)ididsmrrruniquebs " r#ccsF|jr|jVx2|D]*}xt|D] }|Vq"W|jr|jVqWdS)z Loop through all children and return text only. Reimplements method of same name added to ElementTree in Python 2.7 N)textitertexttail)elemesrrrr%ns  r%csfdd}tj||S)zC Extract raw HTML, reduce to plain text and swap with placeholder. c s\yjjt|jd\}}Wnttfk r<|jdSXjrN| rNdStjdd|S)z& Substitute raw html with plain text. rrr z(<[^>]+>)|(&[\#a-zA-Z0-9]+;)) htmlStash rawHtmlBlocksrr IndexError TypeErrorsafeModerr)r"rawsafe)mdrr _html_subs  z#stashedHTML2text.._html_sub)rr)r$r1r2r)r1rstashedHTML2text}s r3c@s&eZdZdZeZddZddZdS)HeaderIdTreeprocessorz Assign IDs to headers. c Cs|j\}}|jd}|jd}x|jD]}|jdkr*|rd |jkrR|jd }n td jt||j }|||}|j d t ||j |r*t |jd|}|d krd }d ||_q*WdS)Nrrh1h2h3h4h5h6r r rzh%d)r5r6r7r8r9r:) _get_metaconfig getiteratortagattribgetr3joinr%r1setr#IDsr) selfdocZ start_levelZforce_idrsepr'r levelrrrruns        zHeaderIdTreeprocessor.runcCsxt|jdd}t|jd}t|jdrpd|jjkrPt|jjddd}d|jjkrpt|jjdd}||fS)z2 Return meta data suported by this ext as a tuple rIrforceidMetaZ header_levelrZheader_forceid)rr>r hasattrr1rL)rFrIforcerrrr=s   zHeaderIdTreeprocessor._get_metaN)__name__ __module__ __qualname____doc__rDrErJr=rrrrr4sr4c@s$eZdZddZddZddZdS)HeaderIdExtensioncCsBddgddgddgtdgd|_x|D]\}}|j||q&WdS) N1zBase level for headers.Truez Force all headers to have an id.-zWord separator.zCallable to generate anchors)rIrKrr)rr> setConfig)rFconfigskeyrrrr__init__s zHeaderIdExtension.__init__cCs^|j|t|_||j_|j|j_d|jjkrH|jjd|jdn|jjd|jddS)N attr_listheaderidz >attr_listz >prettify) registerExtensionr4 processorr1 getConfigsr>treeprocessorskeysr)rFr1 md_globalsrrrextendMarkdowns  z HeaderIdExtension.extendMarkdowncCst|j_dS)N)rDr^rE)rFrrrresetszHeaderIdExtension.resetN)rOrPrQrZrcrdrrrrrSs  rScCs t|dS)N)rX)rS)rXrrr makeExtensionsre)N)rR __future__rrr rr`rutilrr rloggingr getLoggerloggercompilerrr#r%r3r4rSrerrrrKs"       %