o
    ¼>hFA  ã                   @  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
 dd	lmZ dd
lmZ ddlmZ ddlZddlZddlm  mZ ejd ej Zejd ej Ze d¡ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ deƒZ dd„ Z!dS )zŠ
Adds footnote handling to Python-Markdown.

See the [documentation](https://Python-Markdown.github.io/extensions/footnotes)
for details.
é    )Úannotationsé   )Ú	Extensioné   )ÚBlockProcessor)ÚInlineProcessor)ÚTreeprocessor)ÚPostprocessor)Úutil)ÚOrderedDictNÚzz1337820767766393qqÚqq3936677670287331zzz(fnref)(\d+)c                      s|   e Zd ZdZ‡ fdd„Zdd„ Zd#dd	„Zd$d%dd„Zd&dd„Zd'dd„Z	d(dd„Z
d)dd„Zd$d*dd„Zd+d!d"„Z‡  ZS ),ÚFootnoteExtensionz Footnote Extension. c                   s`   ddgddgddgddgd	d
gddgdœ| _ 	 tƒ jdi |¤Ž d| _i | _tƒ | _|  ¡  dS )z Setup configs. z///Footnotes Go Here///z1The text string that marks where the footnotes goFz9Avoid name collisions across multiple calls to `reset()`.z&#8617;zCThe text string that links from the footnote to the reader's place.ú{}zCThe text string that links from the reader's place to the footnote.z$Jump back to footnote %d in the textznThe text string used for the title HTML attribute of the backlink. %d will be replaced by the footnote number.ú:zFootnote separator.)ÚPLACE_MARKERÚ
UNIQUE_IDSÚBACKLINK_TEXTÚSUPERSCRIPT_TEXTÚBACKLINK_TITLEÚ	SEPARATORr   N© )ÚconfigÚsuperÚ__init__Úunique_prefixÚ
found_refsÚsetÚ	used_refsÚreset)ÚselfÚkwargs©Ú	__class__r   ú}/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/markdown/extensions/footnotes.pyr   )   s(   ÿÿÿÿþÿîzFootnoteExtension.__init__c                 C  sˆ   |  | ¡ |j| _|| _|jj t| ƒdd¡ d}|j t|| ƒdd¡ |j t	| ƒdd¡ |j t
| ƒdd¡ |j t| ƒdd¡ d	S )
z Add pieces to Markdown. Úfootnoteé   z\[\^([^\]]*)\]é¯   é2   zfootnote-duplicateé   é   N)ÚregisterExtensionÚparserÚmdÚblockprocessorsÚregisterÚFootnoteBlockProcessorÚinlinePatternsÚFootnoteInlineProcessorÚtreeprocessorsÚFootnoteTreeprocessorÚFootnotePostTreeprocessorÚpostprocessorsÚFootnotePostprocessor)r    r-   ÚFOOTNOTE_REr   r   r$   ÚextendMarkdownL   s   
z FootnoteExtension.extendMarkdownÚreturnÚNonec                 C  s(   t ƒ | _|  jd7  _i | _tƒ | _dS )z> Clear footnotes on reset, and prepare for distinct document. r   N)r   Ú	footnotesr   r   r   r   ©r    r   r   r$   r   e   s   zFootnoteExtension.resetFÚ	referenceÚstrÚfoundÚboolc                 C  sº   |s|S |}|| j v r@| |  ¡ d¡\}}t |¡}|r1d| d¡t| d¡ƒd |  ¡ |f }n
d|d|  ¡ |f }|| j v s| j  |¡ || jv rV| j|  d7  < |S d| j|< |S )z1 Get a unique reference if there are duplicates. r   ú%s%d%s%sr   )	r   ÚsplitÚget_separatorÚ	RE_REF_IDÚmatchÚgroupÚintÚaddr   )r    r>   r@   Úoriginal_refÚrefÚrestÚmr   r   r$   Ú
unique_refl   s    

*
ú

ÿzFootnoteExtension.unique_refÚrootúetree.Elementú0tuple[etree.Element, etree.Element, bool] | Nonec                   s   ‡ ‡fdd„‰ ˆ |ƒ}|S )z@ Return ElementTree Element that contains Footnote placeholder. c                   sz   | D ]8}|j r|j  ˆ d¡¡dkr|| df  S |jr.|j ˆ d¡¡dkr.|| df  S ˆ |ƒ}|d ur:|  S qd S )Nr   éÿÿÿÿTF)ÚtextÚfindÚ	getConfigÚtail)ÚelementÚchildÚ	child_res©Úfinderr    r   r$   r[   …   s   ÿz:FootnoteExtension.findFootnotesPlaceholder.<locals>.finderr   )r    rO   Úresr   rZ   r$   ÚfindFootnotesPlaceholder   s   z*FootnoteExtension.findFootnotesPlaceholderÚidrS   c                 C  s   || j |< dS )z' Store a footnote for later retrieval. N©r<   )r    r^   rS   r   r   r$   ÚsetFootnote•   ó   zFootnoteExtension.setFootnotec                 C  s
   |   d¡S )z Get the footnote separator. r   )rU   r=   r   r   r$   rD   ™   s   
zFootnoteExtension.get_separatorc                 C  s.   |   d¡rd|  ¡ | j|f S d |  ¡ |¡S )z Return footnote link id. r   z	fn%s%d-%szfn{}{})rU   rD   r   Úformat)r    r^   r   r   r$   ÚmakeFootnoteId   s   
z FootnoteExtension.makeFootnoteIdc                 C  s>   |   d¡r|  d|  ¡ | j|f |¡S |  d |  ¡ |¡|¡S )z Return footnote back-link id. r   zfnref%s%d-%sz	fnref{}{})rU   rN   rD   r   rb   )r    r^   r@   r   r   r$   ÚmakeFootnoteRefId¤   s   
z#FootnoteExtension.makeFootnoteRefIdúetree.Element | Nonec                 C  s\  t | j ¡ ƒs	dS t d¡}| dd¡ t |d¡ t |d¡}t d¡}|  d¡ dd	¡}t	| j ¡ d
dD ]t\}}t |d¡}| d|  
|¡¡ | j || j| ¡ t |ƒD ]}	| |	¡ | |	¡ qXt d¡}
|
 dd|  |¡ ¡ |
 dd¡ |
 d| |¡¡ t|
_t|ƒr«|d }|jdkr |jt |_| |
¡ q7t |d¡}| |
¡ q7|S )z/ Return `div` of footnotes as `etree` Element. NÚdivÚclassr%   ÚhrÚolr   z%dr   r   )ÚstartÚlir^   ÚaÚhrefú#úfootnote-backrefÚtitlerR   Úp)Úlistr<   ÚkeysÚetreeÚElementr   Ú
SubElementrU   ÚreplaceÚ	enumeraterc   r,   Ú
parseChunkÚappendÚremoverd   rb   ÚFN_BACKLINK_TEXTrS   ÚlenÚtagÚNBSP_PLACEHOLDER)r    rO   rf   ri   Úsurrogate_parentÚbacklink_titleÚindexr^   rk   ÚelÚbacklinkÚnoderq   r   r   r$   ÚmakeFootnotesDiv«   s@   



þ

€z"FootnoteExtension.makeFootnotesDiv)r:   r;   )F)r>   r?   r@   rA   r:   r?   )rO   rP   r:   rQ   )r^   r?   rS   r?   r:   r;   )r:   r?   )r^   r?   r:   r?   )r^   r?   r@   rA   r:   r?   )rO   rP   r:   re   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r9   r   rN   r]   r`   rD   rc   rd   r†   Ú__classcell__r   r   r"   r$   r   &   s    #




r   c                      sX   e Zd ZdZe dej¡Zd‡ fdd„Zddd„Z	ddd„Z
ddd„Zddd„Z‡  ZS )r0   z7 Find all footnote references and store for later use. z!^[ ]{0,3}\[\^([^\]]*)\]:[ ]*(.*)$r<   r   c                   s   t ƒ  |j¡ || _d S ©N)r   r   r,   r<   ©r    r<   r"   r   r$   r   Ý   s   
zFootnoteBlockProcessor.__init__ÚparentrP   Úblockr?   r:   rA   c                 C  s   dS )NTr   )r    rŽ   r   r   r   r$   Útestá   s   zFootnoteBlockProcessor.testÚblocksú	list[str]c                 C  s<  |  d¡}| j |¡}|r–| d¡}| d¡g}|| ¡ d…  d¡}| j |¡}|rT|d| ¡ …  d¡}	d |d |  	|	¡g¡ d¡|d< | 
d|| ¡ d… ¡ nd |d |  	|¡g¡ d¡|d< | |  |¡¡ d |¡}
| j ||
 ¡ ¡ |d| ¡ …  ¡ r”| 
d|d| ¡ …  d¡¡ dS | 
d|¡ dS )	z- Find, set, and remove footnote definitions. r   r   r   NÚ
z

TF)ÚpopÚREÚsearchrG   ÚendÚlstriprj   ÚrstripÚjoinÚdetabÚinsertÚstripÚextendÚdetectTabbedr<   r`   )r    rŽ   r‘   r   rM   r^   Ú	fn_blocksÚtherestÚm2Úbeforer%   r   r   r$   Úrunä   s(   

""
zFootnoteBlockProcessor.runc                 C  s”   g }|rH|d   d¡rC| d¡}| j |¡}|r:|d| ¡ …  d¡}| |  |¡¡ | d|| ¡ d… ¡ 	 |S | |  |¡¡ n	 |S |s|S )z’ Find indented text and remove indent before further processing.

        Returns:
            A list of blocks with indentation removed.
        r   ú    Nr“   )	Ú
startswithr”   r•   r–   rj   r™   rz   r›   rœ   )r    r‘   r    r   rM   r£   r   r   r$   rŸ     s    
üìz#FootnoteBlockProcessor.detectTabbedc                 C  s@   |  d¡}t|ƒD ]\}}| d¡r|dd… ||< q	d |¡S )zˆ Remove one level of indent from a block.

        Preserve lazily indented blocks by only removing indent from indented lines.
        r“   r¥   é   N)rC   rx   r¦   rš   )r    r   ÚlinesÚiÚliner   r   r$   r›   %  s   

€
zFootnoteBlockProcessor.detab©r<   r   )rŽ   rP   r   r?   r:   rA   )rŽ   rP   r‘   r’   r:   rA   )r‘   r’   r:   r’   )r   r?   r:   r?   )r‡   rˆ   r‰   rŠ   ÚreÚcompileÚ	MULTILINEr•   r   r   r¤   rŸ   r›   r‹   r   r   r"   r$   r0   Ø   s    


$r0   c                      s,   e Zd ZdZd‡ fdd„Zddd„Z‡  ZS )r2   zC `InlineProcessor` for footnote markers in a document's body text. Úpatternr?   r<   r   c                   s   t ƒ  |¡ || _d S rŒ   )r   r   r<   )r    r¯   r<   r"   r   r$   r   4  s   
z FootnoteInlineProcessor.__init__rM   úre.Match[str]Údatar:   ú3tuple[etree.Element | None, int | None, int | None]c                 C  s°   |  d¡}|| jj ¡ v rVt d¡}t |d¡}| d| jj|dd¡ | dd| j |¡ ¡ | d	d
¡ | j 	d¡ 
t| jj ¡ ƒ |¡d ¡|_|| d¡| d¡fS dS )Nr   Úsuprl   r^   T)r@   rm   rn   rg   zfootnote-refr   r   )NNN)rG   r<   rs   rt   ru   rv   r   rd   rc   rU   rb   rr   r‚   rS   rj   r—   )r    rM   r±   r^   r³   rl   r   r   r$   ÚhandleMatch8  s   

ÿz#FootnoteInlineProcessor.handleMatch)r¯   r?   r<   r   )rM   r°   r±   r?   r:   r²   )r‡   rˆ   r‰   rŠ   r   r´   r‹   r   r   r"   r$   r2   1  s    r2   c                   @  sB   e Zd ZdZddd„Zddd„Zddd„Zddd„Zddd„ZdS )r5   z% Amend footnote div with duplicates. r<   r   c                 C  ó
   || _ d S rŒ   r_   r   r   r   r$   r   K  ó   
z"FootnotePostTreeprocessor.__init__rk   rP   Ú
duplicatesrH   r:   r;   c           
      C  s¾   |  d¡D ]W}|j dd¡dkr\|jd  | j ¡ d¡\}}g }td|d ƒD ]!}t |¡}d||| j ¡ |f |jd< | 	|¡ |  j
d7  _
q't|ƒd	 }	|D ]}|	 	|¡ qQ d
S qd
S )zF Adjust current `li` and add the duplicates: `fnref2`, `fnref3`, etc. rl   rg   Ú ro   rm   r   r   rB   rR   N)ÚiterÚattribÚgetrC   r<   rD   ÚrangeÚcopyÚdeepcopyrz   Úoffsetrr   )
r    rk   r·   ÚlinkrK   rL   Úlinksr‚   Úsib_linkrƒ   r   r   r$   Úadd_duplicatesN  s   

òþz(FootnotePostTreeprocessor.add_duplicatesc                 C  sD   |j  dd¡ | j ¡ d¡\}}d || j ¡ |¡}| jj |d¡S )z3 Get the number of duplicate refs of the footnote. r^   r¸   r   z	{}ref{}{}r   )rº   r»   rC   r<   rD   rb   r   )r    rk   ÚfnrL   Úlink_idr   r   r$   Úget_num_duplicatesb  s    z,FootnotePostTreeprocessor.get_num_duplicatesrŽ   c                 C  s0   t |ƒD ]}|  |¡}|dkr|  ||¡ qdS )z= Find duplicate footnotes and format and add the duplicates. r   N)rr   rÆ   rÃ   )r    rŽ   rk   Úcountr   r   r$   Úhandle_duplicatesh  s   
€ûz+FootnotePostTreeprocessor.handle_duplicatesrO   c                 C  sF   d| _ | d¡D ]}|j dd¡dkr | d¡D ]}|  |¡  qdS )z= Crawl the footnote div and add missing duplicate footnotes. r   rf   rg   r¸   r%   ri   N)r¿   r¹   rº   r»   rÈ   )r    rO   rf   ri   r   r   r$   r¤   q  s   
€úzFootnotePostTreeprocessor.runNr«   )rk   rP   r·   rH   r:   r;   )rk   rP   r:   rH   )rŽ   rP   r:   r;   ©rO   rP   r:   r;   )	r‡   rˆ   r‰   rŠ   r   rÃ   rÆ   rÈ   r¤   r   r   r   r$   r5   H  s    



	r5   c                   @  s$   e Zd ZdZddd„Zdd
d„ZdS )r4   z3 Build and append footnote div to end of document. r<   r   c                 C  rµ   rŒ   r_   r   r   r   r$   r   €  r¶   zFootnoteTreeprocessor.__init__rO   rP   r:   r;   c                 C  s†   | j  |¡}|d urA| j  |¡}|r:|\}}}t|ƒ |¡}|r-| |¡ | ||¡ d S | |d |¡ d |_d S | |¡ d S d S )Nr   )	r<   r†   r]   rr   r‚   r{   rœ   rV   rz   )r    rO   ÚfootnotesDivÚresultrX   rŽ   ÚisTextÚindr   r   r$   r¤   ƒ  s   


ôzFootnoteTreeprocessor.runNr«   rÉ   ©r‡   rˆ   r‰   rŠ   r   r¤   r   r   r   r$   r4   }  s    
r4   c                   @  s$   e Zd ZdZddd„Zdd	d
„ZdS )r7   z* Replace placeholders with html entities. r<   r   c                 C  rµ   rŒ   r_   r   r   r   r$   r   –  r¶   zFootnotePostprocessor.__init__rS   r?   r:   c                 C  s    |  t| j d¡¡}|  td¡S )Nr   z&#160;)rw   r|   r<   rU   r   )r    rS   r   r   r$   r¤   ™  s   ÿzFootnotePostprocessor.runNr«   )rS   r?   r:   r?   rÎ   r   r   r   r$   r7   ”  s    
r7   c                  K  s   t di | ¤ŽS )z/ Return an instance of the `FootnoteExtension` Nr   )r   )r!   r   r   r$   ÚmakeExtension   ra   rÏ   )"rŠ   Ú
__future__r   r¸   r   r.   r   Úinlinepatternsr   r3   r   r6   r	   r
   Úcollectionsr   r¬   r½   Úxml.etree.ElementTreert   ÚElementTreeÚSTXÚETXr|   r   r­   rE   r   r0   r2   r5   r4   r7   rÏ   r   r   r   r$   Ú<module>   s.   
 3Y5