a
    ×
þd”6  ã                   @   sà   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZ ddlZddlZddlZddlm  mZ d d
d„Zdd„ Ze d¡Zdd„ Zdd„ Zd!dd„Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZdd„ ZdS )"am  
Table of Contents Extension for Python-Markdown
===============================================

See <https://Python-Markdown.github.io/extensions/toc>
for documentation.

Original code Copyright 2008 [Jack Miller](https://codezen.org/)

All changes Copyright 2008-2014 The Python Markdown Project

License: [BSD](https://opensource.org/licenses/bsd-license.php)

é   )Ú	Extensioné   )ÚTreeprocessor)Úcode_escapeÚparseBoolValueÚAMP_SUBSTITUTEÚHTML_PLACEHOLDER_REÚAtomicString)ÚUnescapeTreeprocessoré    NFc                 C   sL   |s"t  d| ¡} |  dd¡ d¡} t dd| ¡ ¡  ¡ } t d |¡|| ¡S )z, Slugify a string, to make it URL friendly. ZNFKDÚasciiÚignorez[^\w\s-]Ú z[{}\s]+)	ÚunicodedataÚ	normalizeÚencodeÚdecodeÚreÚsubÚstripÚlowerÚformat)ÚvalueÚ	separatorÚunicode© r   ú`/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/markdown/extensions/toc.pyÚslugify   s
    r   c                 C   s   t | |ddS )zP Slugify a string, to make it URL friendly while preserving Unicode characters. T)r   )r   )r   r   r   r   r   Úslugify_unicode$   s    r   z^(.*)_([0-9]+)$c                 C   sX   | |v s| sJt  | ¡}|r<d| d¡t| d¡ƒd f } q d| df } q | | ¡ | S )z@ Ensure id is unique in set of ids. Append '_1', '_2'... if not z%s_%dr   r   )Ú
IDCOUNT_REÚmatchÚgroupÚintÚadd)ÚidÚidsÚmr   r   r   Úunique,   s    
"
r'   c                 C   sF   g }|   ¡ D ]*}t|tƒr,| t |¡¡ q| |¡ qd |¡ ¡ S )zGet title name.r   )ÚitertextÚ
isinstancer	   ÚappendÚhtmlÚunescapeÚjoinr   )ÚelÚtextÚcr   r   r   Úget_name8   s    
r1   Tc                    s   ‡ ‡fdd„}t  || ¡S )zN Extract raw HTML from stash, reduce to plain text and swap with placeholder. c              	      s`   zˆ j jt|  d¡ƒ }W n  ttfy:   |  d¡ Y S 0 t dd|¡}ˆr\t dd|¡}|S )z& Substitute raw html with plain text. r   r   z	(<[^>]+>)r   z(&[\#a-zA-Z0-9]+;))Z	htmlStashZrawHtmlBlocksr"   r!   Ú
IndexErrorÚ	TypeErrorr   r   )r&   ÚrawÚres©ÚmdÚstrip_entitiesr   r   Ú	_html_subF   s    z#stashedHTML2text.<locals>._html_sub)r   r   )r/   r7   r8   r9   r   r6   r   ÚstashedHTML2textD   s    r:   c                 C   s   t ƒ }| | ¡S )z Unescape escaped text. )r
   r,   )r/   r0   r   r   r   r,   U   s    r,   c           	      C   s  g }t | ƒr|  d¡}g |d< |d g}| |¡ g }| r|  d¡}|d }g |d< ||d k rÂ| ¡  d}t|ƒD ]}||d kr’|d7 }qx q˜qx|r¸|d| … }|d| … }| |¡ ||d krê|rÞ|d d n| |¡ n"|d  |¡ | |¡ | |¡ |}q8|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': []}]
    r   ÚchildrenÚleveléÿÿÿÿr   N)ÚlenÚpopr*   Úreversed)	Útoc_listZordered_listÚlastÚlevelsÚparentsÚtZcurrent_levelZto_popÚpr   r   r   Únest_toc_tokens[   sB    






ÿÿ

rG   c                       sT   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚTocTreeprocessorc                    s   t ƒ  |¡ |d | _|d | _t|d ƒd | _|d | _|d | _|d | _t	|d ƒ| _
|d	 | _t	|d
 dƒ| _| jd u rŒ|d
 | _|d | _|d | _t d¡| _t|d tƒrèd|d v rèdd„ |d  d¡D ƒ\| _| _nd| _t|d ƒ| _d S )NÚmarkerÚtitleÚ	baselevelr   r   r   Ú	toc_classÚ
anchorlinkÚanchorlink_classÚ	permalinkFÚpermalink_classÚpermalink_titlez[Hh][123456]Ú	toc_depthú-c                 S   s   g | ]}t |ƒ‘qS r   )r"   )Ú.0Úxr   r   r   Ú
<listcomp>­   ó    z-TocTreeprocessor.__init__.<locals>.<listcomp>)ÚsuperÚ__init__rI   rJ   r"   Ú
base_levelr   ÚseprL   r   Úuse_anchorsrN   Úuse_permalinksrP   rQ   r   ÚcompileÚ
header_rgxr)   ÚstrÚsplitÚtoc_topÚ
toc_bottom)Úselfr7   Úconfig©Ú	__class__r   r   rY   ›   s&    









"zTocTreeprocessor.__init__c                 c   s@   |D ]6}| j  |j¡s|jdvr||fV  |  |¡E dH  qdS )z? Iterator wrapper to get allowed parent and child all at once. )ÚpreÚcodeN)r_   r    ÚtagÚ
iterparent)rd   ÚnodeÚchildr   r   r   rk   ²   s    
zTocTreeprocessor.iterparentc                 C   s|   |   |¡D ]l\}}d | ¡ ¡ ¡ }|s*q
|jr
|j ¡ | jkr
t|ƒdkr
tt|ƒƒD ]}|| |krX|||<  q
qXq
dS )z Replace marker with elem. r   r   N)rk   r-   r(   r   r/   rI   r>   Úrange)rd   ÚrootÚelemrF   r0   r/   Úir   r   r   Úreplace_marker½   s    
"zTocTreeprocessor.replace_markerc                 C   s.   t |jd ƒ| j }|dkr d}d| |_dS )z. Adjust header level according to base level. r=   é   zh%dN)r"   rj   rZ   )rd   rp   r<   r   r   r   Ú	set_levelÒ   s    zTocTreeprocessor.set_levelc                 C   sl   t  d¡}|j|_d| |jd< | j|jd< d|_|D ]}| |¡ q6t|ƒr^| |d ¡ qF| |¡ d S )NÚaú#ÚhrefÚclassr   r   )ÚetreeÚElementr/   ÚattribrN   r*   r>   Úremove)rd   r0   Úelem_idÚanchorrp   r   r   r   Ú
add_anchorÙ   s    
zTocTreeprocessor.add_anchorc                 C   s^   t  d¡}| jdu rdt n| j|_d| |jd< | j|jd< | jrP| j|jd< | |¡ d S )Nru   Tz%spara;rv   rw   rx   rJ   )	ry   rz   r]   r   r/   r{   rP   rQ   r*   )rd   r0   r}   rO   r   r   r   Úadd_permalinkå   s    
ÿ
þzTocTreeprocessor.add_permalinkc                    sr   t  d¡}| j|jd< | jr:t  |d¡}d|jd< | j|_‡ fdd„‰ ˆ ||ƒ d| jjv rn| jjd  	|¡ |S )z' Return a string div given a toc list. Údivrx   ÚspanZtoctitlec                    sl   t  |d¡}| D ]V}t  |d¡}t  |d¡}| dd¡|_d| dd¡ |jd< |d	 rˆ |d	 |ƒ q|S )
NÚulÚliru   Únamer   rv   r$   rw   r;   )ry   Ú
SubElementÚgetr/   r{   )rA   Úparentrƒ   Úitemr„   Úlink©Úbuild_etree_ulr   r   rŒ   û   s    z6TocTreeprocessor.build_toc_div.<locals>.build_etree_ulZprettify)
ry   rz   rL   r{   rJ   r†   r/   r7   ÚtreeprocessorsÚrun)rd   rA   r   Úheaderr   r‹   r   Úbuild_toc_divð   s    


zTocTreeprocessor.build_toc_divc           
      C   s¸  t ƒ }| ¡ D ]}d|jv r| |jd ¡ qg }| ¡ D ]}t|jtƒr:| j |j¡r:|  	|¡ t
|ƒ}d|jvr tt|| jƒƒ}t|  || j¡|ƒ|jd< t|jd ƒ| jkrt|jd ƒ| jkr| t|jd ƒ|jd ttt|j d|¡ƒ| jddƒdœ¡ d|jv r |jd= | jr:|  ||jd ¡ | jdvr:|  ||jd ¡ q:t|ƒ}|  |¡}| jr~|  ||¡ | j |¡}| jj D ]}	|	 !|¡}q’|| j_"|| j_#d S )Nr$   r=   zdata-toc-labelF)r8   )r<   r$   r…   )FN)$ÚsetÚiterr{   r#   r)   rj   r`   r_   r    rt   r1   r,   r:   r7   r'   r   r[   r"   rb   rc   r*   r   r‡   r\   r   r]   r€   rG   r   rI   rr   Ú
serializerZpostprocessorsrŽ   Ú
toc_tokensÚtoc)
rd   ÚdocZused_idsr.   r”   r/   Z	innertextr   r•   Úppr   r   r   rŽ     sH    


,þý


zTocTreeprocessor.run)Ú__name__Ú
__module__Ú__qualname__rY   rk   rr   rt   r   r€   r   rŽ   Ú__classcell__r   r   rf   r   rH   š   s   rH   c                       s0   e Zd ZeZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTocExtensionc                    sf   ddgddgddgddgd	dgd
dgddgddgddgt dgddgddgdœ| _tƒ jf i |¤Ž d S )Nz[TOC]zhText to find and replace with Table of Contents - Set to an empty string to disable. Defaults to "[TOC]"r   z<Title to insert into TOC <div> - Defaults to an empty stringr•   z6CSS class(es) used for the link. Defaults to "toclink"Fz8True if header should be a self link - Defaults to FalseZtoclinkr   zQTrue or link text if a Sphinx-style permalink should be added - Defaults to FalseZ
headerlinkz9CSS class(es) used for the link. Defaults to "headerlink"zPermanent linkz?Title attribute of the permalink - Defaults to 'Permanent link'Ú1zBase level for headers.zdFunction to generate anchors based on header text - Defaults to the headerid ext's slugify function.rS   z Word separator. Defaults to "-".rs   a%  Define the range of section levels to include inthe Table of Contents. A single integer (b) definesthe bottom section level (<h1>..<hb>) only.A string consisting of two digits separated by a hyphenin between ("2-5"), define the top (t) and thebottom (b) (<ht>..<hb>). Defaults to `6` (bottom).)rI   rJ   rL   rM   rN   rO   rP   rQ   rK   r   r   rR   )r   re   rX   rY   )rd   Úkwargsrf   r   r   rY   D  sD    ÿÿÿÿÿÿÿÿÿÿâ'zTocExtension.__init__c                 C   s<   |  | ¡ || _|  ¡  |  ||  ¡ ¡}|j |dd¡ d S )Nr•   é   )ZregisterExtensionr7   ÚresetÚTreeProcessorClassZ
getConfigsr   Úregister)rd   r7   Ztocextr   r   r   ÚextendMarkdownn  s
    
zTocExtension.extendMarkdownc                 C   s   d| j _g | j _d S )Nr   )r7   r•   r”   )rd   r   r   r   r    u  s    zTocExtension.reset)	r˜   r™   rš   rH   r¡   rY   r£   r    r›   r   r   rf   r   rœ   @  s   *rœ   c                  K   s   t f i | ¤ŽS )N)rœ   )rž   r   r   r   ÚmakeExtensionz  s    r¤   )F)T)Ú__doc__r   r   r   r   Úutilr   r   r   r   r	   r
   r   r+   r   Úxml.etree.ElementTreery   ÚElementTreer   r   r^   r   r'   r1   r:   r,   rG   rH   rœ   r¤   r   r   r   r   Ú<module>   s(   



? ':