U
    Sh8                     @  s  d Z ddlmZ ddlmZ ddlmZmZ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 erddlmZ ddlmZmZ ddddddddddddZG dd deddZG dd deZdddddZd d!d!ddd"d#d$Z d%ddd&d'd(Z!dd)d%dddd*d+d,Z"d-dd.d/d0Z#d1d2d!d3dd4d5d6d7Z$d1d2d!d3dd4d5d8d9Z%d1d2d!d3dd4d5d:d;Z&d1d2d!d3dd4d5d<d=Z'd1d2d!d3dd4d5d>d?Z(d1d2d!d3dd4d5d@dAZ)d1d2d!d3dd4d5dBdCZ*d1d2d!d3dd4d5dDdEZ+dFS )GzProcess footnotes    )annotations)partial)TYPE_CHECKINGSequence	TypedDict)
MarkdownIt)parseLinkLabel)
StateBlock)	StateCore)StateInline)Token)is_code_block)RendererProtocol)EnvTypeOptionsDictTF)inlinemove_to_endalways_match_refsr   boolNone)mdr   r   r   returnc                C  s   | j jddtdddgi tt|d}|rR| jjddt | jjdd| n| jjdd| |rz| j	jd	d
t
 | dt | dt | dt | dt | dt | dt | dt | dt dS )a  Plugin ported from
    `markdown-it-footnote <https://github.com/markdown-it/markdown-it-footnote>`__.

    It is based on the
    `pandoc definition <http://johnmacfarlane.net/pandoc/README.html#footnotes>`__:

    .. code-block:: md

        Normal footnote:

        Here is a footnote reference,[^1] and another.[^longnote]

        [^1]: Here is the footnote.

        [^longnote]: Here's one with multiple blocks.

            Subsequent paragraphs are indented to show that they
        belong to the previous footnote.

    :param inline: If True, also parse inline footnotes (^[...]).
    :param move_to_end: If True, move footnote definitions to the end of the token stream.
    :param always_match_refs: If True, match references, even if the footnote is not defined.

    	referencefootnote_defZaltZ	paragraphalways_matchimagefootnote_inlinefootnote_refr   footnote_tailfootnote_block_openfootnote_block_closefootnote_openfootnote_closefootnote_anchorfootnote_captionfootnote_anchor_nameN)blockZrulerbeforer   r   r   r   afterr   corer   Zadd_render_rulerender_footnote_refrender_footnote_block_openrender_footnote_block_closerender_footnote_openrender_footnote_closerender_footnote_anchorrender_footnote_captionrender_footnote_anchor_name)r   r   r   r   Z_footnote_ref r3   Q/root/rtd-docs/venv/lib/python3.8/site-packages/mdit_py_plugins/footnote/index.pyfootnote_plugin   s*       
r5   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	_RefDatastrlabelintcountcontentzlist[Token]tokensN__name__
__module____qualname____annotations__r3   r3   r3   r4   r6   M   s   
r6   )totalc                   @  s   e Zd ZU ded< ded< dS )_FootnoteDatazdict[str, int]refszdict[int, _RefData]listNr=   r3   r3   r3   r4   rC   V   s   
rC   r   )envr   c                 C  s(   |  di }| di  | di  |S )N	footnotesrD   rE   )
setdefault)rF   rG   r3   r3   r4   _data_from_env]   s    rI   r	   r9   )state	startLineendLinesilentr   c                 C  s  t | |rdS | j| | j|  }| j| }|d |kr<dS | j| dkrNdS | j|d  dkrddS |d }||k r| j| dkrdS | j| dkrq|d7 }ql||d krdS |d7 }||ks| j| d	krdS |rd
S |d7 }| j|d |d  }t| j}d|d d	| < tddd}	d|i|	_| j	|	_	|  j	d7  _	| j
|	 | j| }
| j| }| j| }| j}|}| j| | | j| | j|    }}||k r| j| }|dkr|d|d  7 }n|dkr|d7 }nq|d7 }q|| | j|< || | j|< || j|< |  jd7  _d| _| j| | jk rL| j|  | j7  < | jj| || || _|  jd8  _|| j|< || j|< |
| j|< || jg|	_tddd}|  j	d8  _	| j	|_	| j
| d
S )z!Process footnote block definitionF   [   ^    ]:TrD   footnote_reference_open r8   	Zfootnotefootnote_reference_close)r   ZbMarksZtShiftZeMarkssrcrI   rF   r   metalevelr<   appendZsCountZ
parentTypeZ	blkIndentr   r'   tokenizelinemap)rJ   rK   rL   rM   startmaximumposr8   footnote_data
open_tokenZoldBMarkZ	oldTShiftZ	oldSCountZoldParentTypeZposAfterColoninitialoffsetchtokenr3   r3   r4   r   g   s    
















r   r   )rJ   rM   r   c           
      C  s   | j }| j}|d |krdS | j| dkr.dS | j|d  dkrDdS |d }t| |d }|dk rfdS |st| jd }t|}g }| jj	| j|| | j| j| | 
dd	d}	d
|i|	_| j|| |d||< |d | _|| _ dS )z!Process inline footnotes (^[...])rR   FrQ   rP   rO   r   rE   r   rX   id)r;   r<   T)posMaxrd   r[   r   rI   rF   lenr   r   parsepushr\   )
rJ   rM   rc   rb   Z
labelStartZlabelEndrD   
footnoteIdr<   rj   r3   r3   r4   r      s8       

r   r   )rJ   rM   r   r   c                C  s  | j }| j}|d |krdS t| j}|s6|d s6dS | j| dkrHdS | j|d  dkr^dS |d }||k r| j| dkrdS | j| d	krq|d7 }qf||d krdS ||krdS |d7 }| j|d |d  }d
| |d kr|sdS |s|d d
| ddk r<t|d }|dd|d |< ||d d
| < n|d d
|  }|d | d }	|d | d  d7  < | ddd}
||	|d|
_|| _|| _ dS )z$Process footnote references ([^...])   FrD   rO   rP   rQ   rR   )rS   
rT   rU   rV   r   rE   )r8   r:   r:   r   rX   rk   subIdr8   T)	rl   rd   rI   rF   r[   getrm   ro   r\   )rJ   rM   r   rc   rb   re   rd   r8   rp   ZfootnoteSubIdrj   r3   r3   r4   r      sN    

r   r
   )rJ   r   c                 C  s  d}i }d| j krdS g }g }| jD ]l}|jdkrPd}g }|jd }|d q$|jdkrvd}||d| < |d q$|r|| ||  q$d	d
 t| j|D | _t| j }|d sdS tddd}| j| |d  D ]\}	}
tddd}|	|
	ddd|_| j| d|
krg }tddd}d|_
|| tddd}|
d |_|
d |_|| tddd}d|_
|| nd|
kr|	d|
d  g }| j| | jt| jd  jdkr| j }nd}d|
kr|
d dkr|
d nd}d}||k rNtddd}|	||
	ddd|_| j| |d7 }q
|r`| j| tddd}| j| qtddd}| j| dS )zvPost-processing step, to move footnote tokens to end of the token stream.

    Also removes un-referenced tokens.
    FrG   NrW   Tr8   rZ   rU   c                 S  s   g | ]\}}|r|qS r3   r3   ).0tfr3   r3   r4   
<listcomp>O  s      z!footnote_tail.<locals>.<listcomp>rE   r    rX   rP   r"   )rk   r8   r<   Zparagraph_openpr   r   r;   Zparagraph_closerV   r:   r$   rs   r#   r!   )rF   r<   typer\   r^   ziprI   r   itemsru   r'   childrenr;   extendrm   pop)rJ   Z	insideRefZ	refTokenscurrentZ
tok_filtertokZcurrentLabelre   rj   iZ	foot_noter<   ZlastParagraphrw   jr3   r3   r4   r   -  s    
















r   r   zSequence[Token]r   r7   )selfr<   idxoptionsrF   r   c                 C  sD   t || jd d }d}|dd }t|t r<d| d}|| S )Nrk   rP   rX   ZdocId-)r7   r\   ru   
isinstance)r   r<   r   r   rF   nprefixZdoc_idr3   r3   r4   r2     s    
r2   c                 C  sR   t || jd d }|| jdddkrF|dt || jd  7 }d| d S )	Nrk   rP   rt   rV   r   rU   rO   rT   )r7   r\   ru   )r   r<   r   r   rF   r   r3   r3   r4   r1     s    r1   c                 C  sx   | j d ||||}| j d ||||}|}|| jdddkr\|dt|| jd  7 }d| d | d	 | d
 S )Nr&   r%   rt   rV   r   rU   z&<sup class="footnote-ref"><a href="#fnz" id="fnrefz">z
</a></sup>)rulesr\   ru   r7   )r   r<   r   r   rF   identcaptionZrefidr3   r3   r4   r+     s&    r+   c                 C  s   |j r
dndd d S )Nz<hr class="footnotes-sep" />
z<hr class="footnotes-sep">
z<section class="footnotes">
z<ol class="footnotes-list">
)ZxhtmlOutr   r<   r   r   rF   r3   r3   r4   r,     s    
r,   c                 C  s   dS )Nz</ol>
</section>
r3   r   r3   r3   r4   r-     s    r-   c                 C  sL   | j d ||||}|| jdddkr@|d|| jd  7 }d| d S )Nr&   rt   rV   r   rU   z
<li id="fnz" class="footnote-item">)r   r\   ru   r   r<   r   r   rF   r   r3   r3   r4   r.     s    r.   c                 C  s   dS )Nz</li>
r3   r   r3   r3   r4   r/     s    r/   c                 C  sL   | j d ||||}|| jd dkr@|dt|| jd  7 }d| d S )Nr&   rt   r   rU   z <a href="#fnrefu%   " class="footnote-backref">↩︎</a>)r   r\   r7   r   r3   r3   r4   r0      s    r0   N),__doc__
__future__r   	functoolsr   typingr   r   r   Zmarkdown_itr   Zmarkdown_it.helpersr   Zmarkdown_it.rules_blockr	   Zmarkdown_it.rules_corer
   Zmarkdown_it.rules_inliner   Zmarkdown_it.tokenr   Zmdit_py_plugins.utilsr   Zmarkdown_it.rendererr   Zmarkdown_it.utilsr   r   r5   r6   rC   rI   r   r   r   r   r2   r1   r+   r,   r-   r.   r/   r0   r3   r3   r3   r4   <module>   sB   7	
b+:e

