\ @ 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 m Z m
Z
d d l Z d d l Z d d l
Z
e j d
Z e j d Z d d
Z d d Z d d Z d d Z Gd d d e Z Gd d d e Z d d d Z d 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
All header IDs are unique:
>>> text = '''
... #Header
... #Header
... #Header'''
>>> md = markdown.markdown(text, ['headerid'])
>>> print md
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
Next Level
Works with inline markup.
>>> text = '#Some *Header* with [markup](http://example.com).'
>>> md = markdown.markdown(text, ['headerid'])
>>> print md
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]+)$c C s_ t j d | j d d } t j d d | j d j j } t j d | | | S)z, Slugify a string, to make it URL friendly. ZNFKDasciiignorez[^\w\s-] z[%s\s]+)unicodedata normalizeencoderesubdecodestriplower)value separator r )build/lib/markdown/extensions/headerid.pyslugify[ s *r c C s xk | | k s | rm t j | } | rZ d | j d t | j d d f } q d | d f } q W| j | | S)z@ Ensure id is unique in set of ids. Append '_1', '_2'... if not z%s_%dr r )
IDCOUNT_REmatchgroupintadd)ididsmr r r uniqueb s /
r# c c sY | j r | j Vn x> | D]6 } x t | D] } | Vq. W| j r | j Vq q Wd S)z Loop through all children and return text only.
Reimplements method of same name added to ElementTree in Python 2.7
N)textitertexttail)elemesr r r r% n s
r% c s" f d d } t j | | S)zC Extract raw HTML, reduce to plain text and swap with placeholder. c sx y) j j t | j d \ } } Wn% t t f k
rP | j d SYn X j re | re d St j d d | S)z& Substitute raw html with plain text. r r r
z(<[^>]+>)|(&[\#a-zA-Z0-9]+;)) htmlStash
rawHtmlBlocksr r
IndexError TypeErrorsafeModer r )r" rawsafe)mdr r _html_sub s )z#stashedHTML2text.._html_sub)r r )r$ r1 r2 r )r1 r stashedHTML2text} s r3 c @ s7 e Z d Z d Z e Z d d Z d d Z d S)HeaderIdTreeprocessorz Assign IDs to headers. c C s | j \ } } | j d } | j d } x | j D] } | j d k r9 | r d | j k ru | j d } n0 t d
j t | | j } | | | } | j
d t | | j n | r t
| j d | } | d k r d } n d
| | _ q q9 q9 Wd S)Nr r h1h2h3h4h5h6r r
r zh%d)zh1zh2zh3zh4zh5zh6) _get_metaconfiggetiteratortagattribgetr3 joinr% r1 setr# IDsr ) selfdocZstart_levelZforce_idr sepr' r levelr r r run s
! zHeaderIdTreeprocessor.runc C s t | j d d } t | j d } t | j d r d | j j k ro t | j j d d d } n d | j j k r t | j j d d } q n | | f S)z2 Return meta data suported by this ext as a tuple rI r forceidMetaZheader_levelr Zheader_forceid)r r> r hasattrr1 rL )rF rI forcer r r r= s ! zHeaderIdTreeprocessor._get_metaN)__name__
__module____qualname____doc__rD rE rJ r= r r r r r4 s r4 c @ s4 e Z d Z d d Z d d Z d d Z d S)HeaderIdExtensionc C sh i d d g d 6d d g d 6d d g d 6t d
g d 6| _ x$ | D] \ } } | j | | qD Wd S)N1zBase level for headers.rI Truez Force all headers to have an id.rK -zWord separator.r zCallable to generate anchorsr )r r> setConfig)rF configskeyr r r r __init__ s
zHeaderIdExtension.__init__c C s | j | t | _ | | j _ | j | j _ d | j j k rh | j j d | j d n | j j d | j d d S)N attr_listheaderidz
>attr_listz >prettify) registerExtensionr4 processorr1
getConfigsr> treeprocessorskeysr )rF r1
md_globalsr r r extendMarkdown s
z HeaderIdExtension.extendMarkdownc C s t | j _ d S)N)rD r^ rE )rF r r r reset s zHeaderIdExtension.resetN)rO rP rQ rZ rc rd r r r r rS s rS c C s
t d | S)NrX )rS )rX r r r
makeExtension s re )rR
__future__r r r
r r` r utilr r r loggingr getLoggerloggercompiler r r# r% r3 r4 rS re r r r r K s" %