3 \#$@sdZddlmZddlmZddlmZddlmZddlm Z m Z m Z dd l m Z mZmZmZdd lZd d ZGd ddeZGdddeZifddZd S)z Table of Contents Extension for Python-Markdown * * * (c) 2008 [Jack Miller](http://codezen.org) Dependencies: * [Markdown 2.1+](http://packages.python.org/Markdown/) )absolute_import)unicode_literals) Extension) Treeprocessor)etreeparseBoolValueAMP_SUBSTITUTE)slugifyuniqueitertextstashedHTML2textNcs&ddigffdd |\}}|S)a@Given an unsorted list with errors and skips, return a nested one. [{'level': 1}, {'level': 2}] => [{'level': 1, 'children': [{'level': 2, 'children': []}]}] A wrong list is also converted: [{'level': 2}, {'level': 1}] => [{'level': 2, 'children': []}, {'level': 1, 'children': []}] levelics"|s ggfS|jd}d|jkr*g|d<|sZ||g\}}|dj||g|gfS|j}g}g}|d|dkr|j||j||dj|||\}}||7}||7}n^|s|j||g}||\}}|dj|n$|jd|||\}}|j|||7}||fS)Nrchildrenr)popkeysappendextendinsert)Zremaining_listZ prev_elementscurrentZ next_elementsrZ prev_elementZnext_elements2Z children2) build_correct$build/lib/markdown/extensions/toc.pyr!s:        z%order_toc_list..build_correctr)toc_listZ ordered_list__r)rrorder_toc_lists . rc@s4eZdZddZddZddZddZd d Zd S) TocTreeprocessorccs.x(|jD]}x|D]}||fVqWq WdS)N) getiterator)selfrootparentchildrrr iterparentVs zTocTreeprocessor.iterparentcCsdtjd}|j|_d||jd<d|jd<d|_x$|jD]}|j||j|q:W|j|dS)Na#hrefZtoclinkclass)rElementtextattrib getchildrenrremove)rcelem_idZanchorelemrrr add_anchor[s   zTocTreeprocessor.add_anchorcCsTtjd}|jdkrdtn|j|_d||jd<d|jd<d|jd <|j|dS) Nr$Tz%spara;r%r&Z headerlinkr'zPermanent linktitle)rr)use_permalinksr r*r+r)rr.r/ permalinkrrr add_permalinkfs    zTocTreeprocessor.add_permalinkcsB|jdr,tj|d}d|jd<|jd|_fdd||S)Nr2spanZtoctitler'csptj|d}x^|D]V}tj|d}tj|d}|jdd|_d|jdd|jd<|d r|d |qW|S) Nullir$namer(r%idr&r)r SubElementgetr*r+)rr!r7itemr8link)build_etree_ulrrr?vs    z8TocTreeprocessor.build_toc_etree..build_etree_ul)configrr;r+r*)rdivrheaderr)r?rbuild_toc_etreeos      z TocTreeprocessor.build_toc_etreecCs4tjd}d|jd<tjd}t|jd|_t|jdd|_|jdkrV|jd|_t }x*|j D]}d|jkrf|j |jdqfWg}d}x.|j |D]\}}d j t|j} | sq|jo|jj|jd ko|j|j o|jdkr(x.tt|D]} || |kr||| <PqWd }|j|jrd|jkrnt| |j} t|jd| d|} | |jd<n |jd} t|jd} |j| | | d|jr|j|| |jr|j|| qWt|} |j|| |jjjd}|r|j ||s0|jj!|}x |jj"j#D]}|j |}qW||j_$dS)NrAtocr'z [Hh][123456] anchorlinkr4Fr:r(markerprecodeTr -r)rr:r9prettify)rGrH)%rr)r+recompiler r@Z use_anchorsr3setraddr#joinr stripr*matchtagrangelenrmarkdownr intrr1r5rrCtreeprocessorsr<run serializerpostprocessorsvaluesrD)rdocrAZ header_rgxZused_idsr.rZ marker_foundpr*ir/Z tag_levelZtoc_list_nestedrJrDpprrrrYs`                zTocTreeprocessor.runN)__name__ __module__ __qualname__r#r1r5rCrYrrrrrSs   rc@s$eZdZeZgfddZddZdS) TocExtensioncCsJddgtdgddgddgdddgd |_x|D]\}}|j||q.WdS) Nz[TOC]zDText to find and replace with Table of Contents -Defaults to "[TOC]"zbFunction to generate anchors based on header text-Defaults to the headerid ext's slugify function.z1Title to insert into TOC
- Defaults to Nonerz.1 if header should be a self linkDefaults to 0z:1 or link text if a Sphinx-style permalink should be addedz Defaults to 0)rFr r2rEr4)r r@ setConfig)rconfigskeyvaluerrr__init__s zTocExtension.__init__cCs(|j|}|j|_|jjd|ddS)NrD_end)TreeProcessorClass getConfigsr@rXrO)rmd md_globalsZtocextrrrextendMarkdowns  zTocExtension.extendMarkdownN)rarbrcrrkrirorrrrrds rdcCs t|dS)N)rf)rd)rfrrr makeExtensionsrp)__doc__ __future__rrr(rrXrutilrr r Zheaderidr r r rrLrrrdrprrrr s    >x$