o
    ©i e?9  ã                   @  sì   d Z ddlm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 )#z‹
Add table of contents support to Python-Markdown.

See the [documentation](https://Python-Markdown.github.io/extensions/toc)
for details.
é    )Úannotationsé   )Ú	Extensioné   )ÚTreeprocessor)Úcode_escapeÚparseBoolValueÚAMP_SUBSTITUTEÚHTML_PLACEHOLDER_REÚAtomicString)ÚUnescapeTreeprocessorNFc                 C  sL   |st  d| ¡} |  dd¡ d¡} t dd| ¡ ¡  ¡ } t d |¡|| ¡S )z, Slugify a string, to make it URL friendly. ÚNFKDÚasciiÚignorez[^\w\s-]Ú z[{}\s]+)	ÚunicodedataÚ	normalizeÚencodeÚdecodeÚreÚsubÚstripÚlowerÚformat)ÚvalueÚ	separatorÚunicode© r   úF/var/www/myenv/lib/python3.10/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  sb   | |v s| s*t  | ¡}|rd| d¡t| d¡ƒd f } nd| df } | |v s| r| | ¡ | 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   Úunique2   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_name>   s   
r3   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 w t dd|¡}ˆr.t dd|¡}|S )z& Substitute raw html with plain text. r   r   z	(<[^>]+>)r   z(&[\#a-zA-Z0-9]+;))Ú	htmlStashÚrawHtmlBlocksr$   r#   Ú
IndexErrorÚ	TypeErrorr   r   )r(   ÚrawÚres©ÚmdÚstrip_entitiesr   r   Ú	_html_subL   s   ÿz#stashedHTML2text.<locals>._html_sub)r
   r   )r1   r;   r<   r=   r   r:   r   ÚstashedHTML2textJ   s   r>   c                 C  s   t ƒ }| | ¡S )z Unescape escaped text. )r   r.   )r1   r2   r   r   r   r.   [   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rG|d7 }q: |rX|d| … }|d| … }| |¡ ||d krq|rk|d d n| |¡ n|d  |¡ | |¡ | |¡ |}| s|S )aV  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_listÚordered_listÚlastÚlevelsÚparentsÚtÚcurrent_levelÚto_popÚpr   r   r   Únest_toc_tokensa   s>   







Ü&rN   c                      sX   e Zd 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 )ÚTocTreeprocessorz& Step through document and build TOC. c                   s  t ƒ  |¡ |d | _|d | _t|d ƒd | _|d | _|d | _|d | _|d | _	t
|d	 ƒ| _|d
 | _t
|d dƒ| _| jd u rK|d | _|d | _|d | _t
|d dƒ| _t d¡| _t|d tƒr‚d|d v r‚dd„ |d  d¡D ƒ\| _| _d S d| _t|d ƒ| _d S )NÚmarkerÚtitleÚ	baselevelr   r   r   Ú	toc_classÚtitle_classÚ
anchorlinkÚanchorlink_classÚ	permalinkFÚpermalink_classÚpermalink_titleÚpermalink_leadingz[Hh][123456]Ú	toc_depthú-c                 S  s   g | ]}t |ƒ‘qS r   )r$   )Ú.0Úxr   r   r   Ú
<listcomp>¹   s    z-TocTreeprocessor.__init__.<locals>.<listcomp>)ÚsuperÚ__init__rP   rQ   r$   Ú
base_levelr   ÚseprS   rT   r   Úuse_anchorsrV   Úuse_permalinksrX   rY   rZ   r   ÚcompileÚ
header_rgxr+   ÚstrÚsplitÚtoc_topÚ
toc_bottom)Úselfr;   Úconfig©Ú	__class__r   r   ra   ¥   s*   










$zTocTreeprocessor.__init__c                 c  sB    |D ]}| 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)rg   r"   ÚtagÚ
iterparent)rl   ÚnodeÚchildr   r   r   rs   ¾   s   €
€ýzTocTreeprocessor.iterparentc                 C  s|   |   |¡D ]6\}}d | ¡ ¡ ¡ }|sq|jr;|j ¡ | jkr;t|ƒdkr;tt|ƒƒD ]}|| |kr:|||<  nq,qdS )z Replace marker with elem. r   r   N)rs   r/   r*   r   r1   rP   rB   Úrange)rl   ÚrootÚelemrM   r2   r1   Ú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. rA   é   zh%dN)r$   rr   rb   )rl   rx   r@   r   r   r   Ú	set_levelÞ   s   zTocTreeprocessor.set_levelc                 C  sr   t  d¡}|j|_d| |jd< | j|jd< d|_|D ]}| |¡ qt|ƒr2| |d ¡ t|ƒs'| |¡ d S )NÚaú#ÚhrefÚclassr   r   )ÚetreeÚElementr1   ÚattribrV   r,   rB   Úremove)rl   r2   Úelem_idÚanchorrx   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r(| j|jd< | jr:|j|_	d|_| 
d	|¡ d S | |¡ d S )
Nr}   Tz%spara;r~   r   r€   rQ   r   r   )r   r‚   re   r	   r1   rƒ   rX   rY   rZ   ÚtailÚinsertr,   )rl   r2   r…   rW   r   r   r   Úadd_permalinkñ   s   

ÿþzTocTreeprocessor.add_permalinkc                   sz   t  d¡}| j|jd< | jr!t  |d¡}| jr| j|jd< | j|_‡ fdd„‰ ˆ ||ƒ d| jj	v r;| jj	d  
|¡ |S )z' Return a string div given a toc list. Údivr€   Úspanc                   sl   t  |d¡}| D ]+}t  |d¡}t  |d¡}| dd¡|_d| dd¡ |jd< |d	 r3ˆ |d	 |ƒ q|S )
NÚulÚlir}   Únamer   r~   r&   r   r?   )r   Ú
SubElementÚgetr1   rƒ   )rE   Úparentr   ÚitemrŽ   Úlink©Úbuild_etree_ulr   r   r–     s   €z6TocTreeprocessor.build_toc_div.<locals>.build_etree_ulÚprettify)r   r‚   rS   rƒ   rQ   r   rT   r1   r;   ÚtreeprocessorsÚrun)rl   rE   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rOt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&   rA   zdata-toc-labelF)r<   )r@   r&   r   )FN)$ÚsetÚiterrƒ   r%   r+   rr   rh   rg   r"   r|   r3   r.   r>   r;   r)   r   rc   r$   rj   rk   r,   r   r‘   rd   r‡   re   rŠ   rN   r›   rP   rz   Ú
serializerÚpostprocessorsr™   Ú
toc_tokensÚtoc)
rl   ÚdocÚused_idsr0   r    r1   Ú	innertextr‹   r¡   Úppr   r   r   r™      sL   
€

(þý


€
zTocTreeprocessor.run)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ra   rs   rz   r|   r‡   rŠ   r›   r™   Ú__classcell__r   r   rn   r   rO   ¢   s    rO   c                      s0   e Zd ZeZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTocExtensionc                   st   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d	dgddgt dgddgddgdœ| _	 tƒ jdi |¤Ž d S )Nz[TOC]zeText to find and replace with Table of Contents. Set to an empty string to disable. Default: `[TOC]`.r   z;Title to insert into TOC `<div>`. Default: an empty string.Útoctitlez2CSS class used for the title. Default: `toctitle`.r¡   z4CSS class(es) used for the link. Default: `toclink`.Fz7True if header should be a self link. Default: `False`.Útoclinkz5CSS class(es) used for the link. Defaults: `toclink`.r   zPTrue or link text if a Sphinx-style permalink should be added. Default: `False`.Ú
headerlinkz7CSS class(es) used for the link. Default: `headerlink`.zPermanent linkz<Title attribute of the permalink. Default: `Permanent link`.z\True if permalinks should be placed at start of the header, rather than end. Default: False.Ú1z%Base level for headers. Default: `1`.zFFunction to generate anchors based on header text. Default: `slugify`.r\   zWord separator. Default: `-`.r{   a'  Define the range of section levels to include in the Table of Contents. A single integer (b) defines the bottom section level (<h1>..<hb>) only. A string consisting of two digits separated by a hyphen in between (`2-5`) defines the top (t) and the bottom (b) (<ht>..<hb>). Default: `6` (bottom).)rP   rQ   rT   rS   rU   rV   rW   rX   rY   rZ   rR   r   r   r[   r   )r   rm   r`   ra   )rl   Úkwargsrn   r   r   ra   V  s@   þÿÿÿÿÿÿÿÿþÿþÙ/zTocExtension.__init__c                 C  s<   |  | ¡ || _|  ¡  |  ||  ¡ ¡}|j |dd¡ dS )z% Add TOC tree processor to Markdown. r¡   é   N)ÚregisterExtensionr;   ÚresetÚTreeProcessorClassÚ
getConfigsr˜   Úregister)rl   r;   Útocextr   r   r   ÚextendMarkdownŠ  s
   
zTocExtension.extendMarkdownc                 C  s   d| j _g | j _d S )Nr   )r;   r¡   r    )rl   r   r   r   r³   ’  s   zTocExtension.reset)	r¦   r§   r¨   rO   r´   ra   r¸   r³   rª   r   r   rn   r   r«   R  s
    4r«   c                  K  s   t di | ¤ŽS )Nr   )r«   )r°   r   r   r   ÚmakeExtension—  s   r¹   )F)T) r©   Ú
__future__r   r   r   r˜   r   Úutilr   r   r	   r
   r   r   r   r-   r   Úxml.etree.ElementTreer   ÚElementTreer   r    rf   r!   r)   r3   r>   r.   rN   rO   r«   r¹   r   r   r   r   Ú<module>   s,   



A 1E