\@s dZddlmZddlmZddlmZddlmZddlm Z m Z dd l Z dd l Z dd l Z e jd Ze jd Zd d ZddZddZddZGdddeZGdddeZd ddZd 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]+)$cCs_tjd|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[s*rcCsxk||ks| rmtj|}|rZd|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#ccsY|jr|jVnx>|D]6}xt|D] }|Vq.W|jr|jVqqWdS)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%cs"fdd}tj||S)zC Extract raw HTML, reduce to plain text and swap with placeholder. c sxy)jjt|jd\}}Wn%ttfk rP|jdSYnXjre| redStjdd|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@s7eZdZdZeZddZddZdS)HeaderIdTreeprocessorz Assign IDs to headers. c Cs|j\}}|jd}|jd}x|jD]}|jdkr9|rd |jkru|jd }n0td jt||j }|||}|j d t ||j n|r t |jd|}|d krd }nd ||_q q9q9WdS)Nrrh1h2h3h4h5h6r r rzh%d)zh1zh2zh3zh4zh5zh6) _get_metaconfig getiteratortagattribgetr3joinr%r1setr#IDsr) selfdocZ start_levelZforce_idrsepr'r levelrrrruns   !  zHeaderIdTreeprocessor.runcCst|jdd}t|jd}t|jdrd|jjkrot|jjddd}nd|jjkrt|jjdd}qn||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=rrrrr4s   r4c@s4eZdZddZddZddZdS)HeaderIdExtensioncCshiddgd6ddgd6ddgd 6td gd 6|_x$|D]\}}|j||qDWdS) N1zBase level for headers.rITruez Force all headers to have an id.rK-zWord separator.rzCallable to generate anchorsr)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 td|S)NrX)rS)rXrrr makeExtensionsre)rR __future__rrr rr`rutilrr rloggingr getLoggerloggercompilerrr#r%r3r4rSrerrrrKs"      %