U
    ú±dë=  ã                   @   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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 )a7  
Footnotes Extension for Python-Markdown
=======================================

Adds footnote handling to Python-Markdown.

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

Copyright The Python Markdown Project

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

é   )Ú	Extensioné   )ÚBlockProcessor)ÚInlineProcessor)ÚTreeprocessor)ÚPostprocessor)Úutilé    )ÚOrderedDictNZzz1337820767766393qqZqq3936677670287331zzz(fnref)(\d+)c                       sl   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	d
„Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Z‡  ZS )ÚFootnoteExtensionz Footnote Extension. c                    sZ   ddgddgddgddgd	d
gddgdœ| _ tƒ jf |Ž d| _i | _tƒ | _|  ¡  dS )z Setup configs. z///Footnotes Go Here///z1The text string that marks where the footnotes goFz7Avoid 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__© úA/tmp/pip-unpacked-wheel-muih9_xp/markdown/extensions/footnotes.pyr   #   s0    ÿÿÿÿÿÿê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)ZregisterExtensionÚparserÚmdÚblockprocessorsÚregisterÚFootnoteBlockProcessorZinlinePatternsÚFootnoteInlineProcessorÚtreeprocessorsÚFootnoteTreeprocessorÚFootnotePostTreeprocessorÚpostprocessorsÚFootnotePostprocessor)r   r)   ZFOOTNOTE_REr    r    r!   ÚextendMarkdownH   s    
z FootnoteExtension.extendMarkdownc                 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   a   s    zFootnoteExtension.resetFc                 C   s°   |s|S |}|| j krx| |  ¡ d¡\}}t |¡}|rbd| d¡t| d¡ƒd |  ¡ |f }qd|d|  ¡ |f }q| j  |¡ || jkr¢| j|  d7  < n
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   Ú	referenceÚfoundZoriginal_refÚrefÚrestÚmr    r    r!   Ú
unique_refh   s    

*

zFootnoteExtension.unique_refc                    s   ‡ ‡fdd„‰ ˆ |ƒ}|S )z@ Return ElementTree Element that contains Footnote placeholder. c                    sz   | D ]p}|j r2|j  ˆ d¡¡dkr2|| df  S |jr\|j ˆ d¡¡dkr\|| df  S ˆ |ƒ}|d k	r|  S qd S )Nr   éÿÿÿÿTF)ÚtextÚfindÚ	getConfigÚtail)ÚelementÚchildZ	child_res©Úfinderr   r    r!   rL      s    
z:FootnoteExtension.findFootnotesPlaceholder.<locals>.finderr    )r   ÚrootÚresr    rK   r!   ÚfindFootnotesPlaceholder}   s    z*FootnoteExtension.findFootnotesPlaceholderc                 C   s   || j |< dS )z' Store a footnote for later retrieval. N©r4   )r   ÚidrE   r    r    r!   ÚsetFootnote   s    zFootnoteExtension.setFootnotec                 C   s
   |   d¡S )z Get the footnote separator. r   )rG   r5   r    r    r!   r8   “   s    zFootnoteExtension.get_separatorc                 C   s2   |   d¡rd|  ¡ | j|f S d |  ¡ |¡S dS )z Return footnote link id. r   z	fn%s%d-%szfn{}{}N)rG   r8   r   Úformat)r   rQ   r    r    r!   ÚmakeFootnoteId—   s    
z FootnoteExtension.makeFootnoteIdc                 C   sB   |   d¡r&|  d|  ¡ | j|f |¡S |  d |  ¡ |¡|¡S dS )z Return footnote back-link id. r   zfnref%s%d-%sz	fnref{}{}N)rG   rC   r8   r   rS   )r   rQ   r?   r    r    r!   ÚmakeFootnoteRefIdž   s    
z#FootnoteExtension.makeFootnoteRefIdc                 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 |d¡}| d|  
|¡¡ | j || j| ¡ t |ƒD ]}	| |	¡ | |	¡ q°t d¡}
|
 dd|  |¡ ¡ |
 dd¡ |
 d| |¡¡ t|
_t|ƒrn|d }|jdkrB|jt |_| |
¡ qnt |d¡}| |
¡ qn|S )z( Return div of footnotes as et Element. NÚdivÚclassr"   ÚhrÚolr   z%dr   r   )ÚstartÚlirQ   ÚaÚhrefú#úfootnote-backrefÚtitlerD   Úp)Úlistr4   ÚkeysÚetreeÚElementr   Ú
SubElementrG   ÚreplaceÚ	enumeraterT   r(   Z
parseChunkÚappendÚremoverU   rS   ÚFN_BACKLINK_TEXTrE   ÚlenÚtagÚNBSP_PLACEHOLDER)r   rM   rV   rY   Zsurrogate_parentZbacklink_titleÚindexrQ   r[   ÚelZbacklinkÚnodera   r    r    r!   ÚmakeFootnotesDiv¥   s>    



þz"FootnoteExtension.makeFootnotesDiv)F)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r3   r   rC   rO   rR   r8   rT   rU   rr   Ú__classcell__r    r    r   r!   r       s   %

r   c                       sN   e Zd ZdZe dej¡Z‡ fdd„Zdd„ Z	dd„ Z
d	d
„ Zdd„ Z‡  ZS )r,   z7 Find all footnote references and store for later use. z!^[ ]{0,3}\[\^([^\]]*)\]:[ ]*(.*)$c                    s   t ƒ  |j¡ || _d S ©N)r   r   r(   r4   ©r   r4   r   r    r!   r   ×   s    zFootnoteBlockProcessor.__init__c                 C   s   dS )NTr    )r   ÚparentÚblockr    r    r!   ÚtestÛ   s    zFootnoteBlockProcessor.testc                 C   s@  |  d¡}| j |¡}|r0| d¡}| d¡g}|| ¡ d…  d¡}| j |¡}|rª|d| ¡ …  d¡}	d |d |  	|	¡g¡ d¡|d< | 
d|| ¡ d… ¡ n2d |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Úsearchr;   ÚendÚlstriprZ   ÚrstripÚjoinÚdetabÚinsertÚstripÚextendÚdetectTabbedr4   rR   )r   rz   Úblocksr{   rB   rQ   Ú	fn_blocksZtherestÚm2Úbeforer"   r    r    r!   ÚrunÞ   s(    

""
zFootnoteBlockProcessor.runc                 C   sŒ   g }|rˆ|d   d¡rˆ| d¡}| j |¡}|rr|d| ¡ …  d¡}| |  |¡¡ | d|| ¡ d… ¡ qˆq†| |  |¡¡ qqˆq|S )z† Find indented text and remove indent before further proccesing.

        Returns: a list of blocks with indentation removed.
        r	   ú    Nr}   )	Ú
startswithr~   r   r€   rZ   rƒ   ri   r…   r†   )r   rŠ   r‹   r{   rB   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)r7   rh   r   r„   )r   r{   ÚlinesÚiÚliner    r    r!   r…     s
    

zFootnoteBlockProcessor.detab)rs   rt   ru   rv   ÚreÚcompileÚ	MULTILINEr   r   r|   rŽ   r‰   r…   rw   r    r    r   r!   r,   Ò   s   $r,   c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )r-   z? InlinePattern for footnote markers in a document's body text. c                    s   t ƒ  |¡ || _d S rx   )r   r   r4   )r   Úpatternr4   r   r    r!   r   -  s    z FootnoteInlineProcessor.__init__c                 C   s´   |  d¡}|| jj ¡ kr¬t 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 d S )Nr   Úsupr\   rQ   T)r?   r]   r^   rW   zfootnote-refr   r	   )NNN)r;   r4   rc   rd   re   rf   r   rU   rT   rG   rS   rb   ro   rE   rZ   r   )r   rB   ÚdatarQ   r™   r\   r    r    r!   ÚhandleMatch1  s    

ÿz#FootnoteInlineProcessor.handleMatch)rs   rt   ru   rv   r   r›   rw   r    r    r   r!   r-   *  s   r-   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )r0   z% Amend footnote div with duplicates. c                 C   s
   || _ d S rx   rP   ry   r    r    r!   r   D  s    z"FootnotePostTreeprocessor.__init__c           
      C   s¼   |  d¡D ]¬}|j dd¡dkr
|jd  | j ¡ d¡\}}g }td|d ƒD ]B}t |¡}d||| j ¡ |f |jd< | 	|¡ |  j
d7  _
qNt|ƒd	 }	|D ]}|	 	|¡ q¢ q¸q
d
S )z@ Adjust current li and add the duplicates: fnref2, fnref3, etc. r\   rW   Ú r_   r]   r   r   r6   rD   N)ÚiterÚattribÚgetr7   r4   r8   ÚrangeÚcopyÚdeepcopyri   Úoffsetrb   )
r   r[   Ú
duplicatesÚlinkr@   rA   Úlinksro   Zsib_linkrp   r    r    r!   Úadd_duplicatesG  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. rQ   rœ   r   z	{}ref{}{}r	   )rž   rŸ   r7   r4   r8   rS   r   )r   r[   ÚfnrA   Zlink_idr    r    r!   Úget_num_duplicates[  s     z,FootnotePostTreeprocessor.get_num_duplicatesc                 C   s0   t |ƒD ]"}|  |¡}|dkr|  ||¡ qdS )z= Find duplicate footnotes and format and add the duplicates. r   N)rb   r©   r§   )r   rz   r[   Úcountr    r    r!   Úhandle_duplicatesa  s    
z+FootnotePostTreeprocessor.handle_duplicatesc                 C   sJ   d| _ | d¡D ]4}|j dd¡dkr| d¡D ]}|  |¡  qq0qdS )z= Crawl the footnote div and add missing duplicate footnotes. r	   rV   rW   rœ   r"   rY   N)r£   r   rž   rŸ   r«   )r   rM   rV   rY   r    r    r!   rŽ   j  s    
zFootnotePostTreeprocessor.runN)	rs   rt   ru   rv   r   r§   r©   r«   rŽ   r    r    r    r!   r0   A  s   	r0   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r/   z3 Build and append footnote div to end of document. c                 C   s
   || _ d S rx   rP   ry   r    r    r!   r   y  s    zFootnoteTreeprocessor.__init__c                 C   s~   | j  |¡}|d k	rz| j  |¡}|rp|\}}}t|ƒ |¡}|rX| |¡ | ||¡ qz| |d |¡ d |_n
| |¡ d S )Nr   )	r4   rr   rO   rb   ro   rj   r†   rH   ri   )r   rM   ZfootnotesDivÚresultrJ   rz   ZisTextÚindr    r    r!   rŽ   |  s    

zFootnoteTreeprocessor.runN©rs   rt   ru   rv   r   rŽ   r    r    r    r!   r/   v  s   r/   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r2   z* Replace placeholders with html entities. c                 C   s
   || _ d S rx   rP   ry   r    r    r!   r     s    zFootnotePostprocessor.__init__c                 C   s    |  t| j d¡¡}|  td¡S )Nr   z&#160;)rg   rk   r4   rG   rn   )r   rE   r    r    r!   rŽ   ’  s
     
ÿzFootnotePostprocessor.runNr®   r    r    r    r!   r2     s   r2   c                  K   s
   t f | ŽS )z- Return an instance of the FootnoteExtension )r   )r   r    r    r!   ÚmakeExtension™  s    r¯   ) rv   rœ   r   r*   r   Zinlinepatternsr   r.   r   r1   r   r   Úcollectionsr
   r•   r¡   Úxml.etree.ElementTreerd   ÚElementTreeZSTXZETXrk   rn   r–   r9   r   r,   r-   r0   r/   r2   r¯   r    r    r    r!   Ú<module>   s*   
 3X5