a
    ×
þ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mZ d	d
lm  m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 )a‹  
Python-Markdown Markdown in HTML Extension
===============================

An implementation of [PHP Markdown Extra](http://michelf.com/projects/php-markdown/extra/)'s
parsing of Markdown syntax in raw HTML.

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

Copyright The Python Markdown Project

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

é   )Ú	Extensioné   )ÚBlockProcessor)ÚPreprocessor)ÚRawHtmlPostprocessor)Úutil)ÚHTMLExtractorÚblank_line_reé    Nc                       s˜   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡ fdd„Zdd	„ Zd
d„ Z‡ fdd„Z	‡ fdd„Z
dd„ Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚHTMLExtractorExtrazƒ
    Override `HTMLExtractor` and create `etree` `Elements` for any elements which should have content parsed as
    Markdown.
    c                    sv   t |j ¡ ƒ| _t g d¢ƒ| _t g d¢ƒ| _tƒ j|g|¢R i |¤Ž t | jƒ| j| jB | jB  | _	| j	| jB | _
d S )N)ÚaddressÚddÚdtÚh1Úh2Úh3Úh4Úh5Úh6ZlegendÚliÚpÚsummaryÚtdÚth)ZcanvasÚmathÚoptionÚpreÚscriptÚstyleÚtextarea)ÚsetZblock_level_elementsÚcopyÚblock_level_tagsÚ	span_tagsZraw_tagsÚsuperÚ__init__Ú
empty_tagsÚ
block_tagsÚspan_and_blocks_tags)ÚselfÚmdÚargsÚkwargs©Ú	__class__© úg/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/markdown/extensions/md_in_html.pyr%       s    ÿzHTMLExtractorExtra.__init__c                    s$   g | _ t ¡ | _g | _tƒ  ¡  dS )z1Reset this instance.  Loses all unprocessed data.N)ÚmdstackÚetreeÚTreeBuilderÚtreebuilderÚmdstater$   Úreset©r)   r-   r/   r0   r6   0   s    
zHTMLExtractorExtra.resetc                    s$   t ƒ  ¡  | jr |  | jd ¡ dS )zHandle any buffered data.r
   N)r$   Úcloser1   Úhandle_endtagr7   r-   r/   r0   r8   7   s    
zHTMLExtractorExtra.closec                 C   s   | j  ¡ }t ¡ | _ |S )zJ Return element from `treebuilder` and reset `treebuilder` for later use. )r4   r8   r2   r3   )r)   Úelementr/   r/   r0   Úget_element?   s    

zHTMLExtractorExtra.get_elementc                 C   s®   |  dd¡}|dkrd}| jr(| jd nd}|dksD|dkrH|dkrH|}|dkrZ|| jv sl|dkrp|| jv rpdS |dkr‚|| jv s”|dkr˜|| jv r˜dS || jv r¦dS dS dS )	zS Return state from tag and `markdown` attribute. One of 'block', 'span', or 'off'. ÚmarkdownÚ0Ú1éÿÿÿÿNÚoffÚspanÚblock)Úgetr5   r'   r(   r#   r"   )r)   ÚtagÚattrsÚmd_attrZparent_stater/   r/   r0   Ú	get_stateE   s*    ÿÿÿÿ
zHTMLExtractorExtra.get_statec                    s’  || j v rn|  ¡ s| jrndd„ |D ƒ}d|v rV| d¡ t ||¡}tj|ddd}n|  ¡ }|  |d¡ d S || j	v r"|  ¡ sŠ| jr"dd„ |D ƒ}|  
||¡}| js¸|d	v rÔ| jsÔ| dd ¡ tƒ  ||¡ nLd
| jv rò|| j	v rò|  d
¡ | j |¡ | j |¡ ||d< | j ||¡ nl| jr:tƒ  ||¡ nT|  ¡ }| jrp| jd dkrp|  | jj |¡¡ n
|  |¡ || jv rŽ|  ¡  d S )Nc                 S   s"   i | ]\}}||d ur|n|“qS ©Nr/   ©Ú.0ÚkeyÚvaluer/   r/   r0   Ú
<dictcomp>]   ó    z6HTMLExtractorExtra.handle_starttag.<locals>.<dictcomp>r<   ÚunicodeÚhtml©ÚencodingÚmethodTc                 S   s"   i | ]\}}||d ur|n|“qS rH   r/   rI   r/   r/   r0   rM   j   rN   )Nr@   r   r?   r@   )r&   Úat_line_startÚintailÚpopr2   ÚElementÚtostringÚget_starttag_textÚhandle_empty_tagr"   rG   Úinrawr1   r$   Úhandle_starttagr9   r5   Úappendr4   ÚstartÚhandle_datar*   Ú	htmlStashÚstoreÚCDATA_CONTENT_ELEMENTSÚclear_cdata_mode)r)   rD   rE   r:   ÚdataÚstateÚtextr-   r/   r0   r\   Z   s:    


z"HTMLExtractorExtra.handle_starttagc                    sš  || j v r>| jr"tƒ  |¡ q–|| jv rú| jr^| j ¡ }| j ¡  | j |¡ ||kr,q^q,| jsø|  	¡ }| j
r|| j
d nd}| d¡s | d¡r | j
 d¡ | j
 | jj |¡¡ | j
 d¡ g | _t | j| j| j t|  |¡ƒ d … ¡sød| _nB|  |¡}| jr2| jd dkr2|  | jj |¡¡ n
|  |¡ nX| jrTtƒ  |¡ nB|  |¡}| jrŒ| jd dkrŒ|  | jj |¡¡ n
|  |¡ d S )Nr?   Ú ú

Ú
Tr@   )r"   r[   r$   r9   r1   rV   r5   r4   Úendr;   ÚcleandocÚendswithr]   r*   r`   ra   re   r	   ÚmatchÚrawdataÚline_offsetÚoffsetÚlenZget_endtag_textrU   r_   )r)   rD   Úitemr:   rf   r-   r/   r0   r9   †   s@    


"ÿ

z HTMLExtractorExtra.handle_endtagc                 C   st   || j v rRdd„ |D ƒ}d|v rH| d¡ t ||¡}tj|ddd}qZ|  ¡ }n|  ¡ }| j|| j |¡d d S )Nc                 S   s"   i | ]\}}||d ur|n|“qS rH   r/   rI   r/   r/   r0   rM   ·   rN   z9HTMLExtractorExtra.handle_startendtag.<locals>.<dictcomp>r<   rO   rP   rQ   )Úis_block)	r&   rV   r2   rW   rX   rY   rZ   r*   Zis_block_level)r)   rD   rE   r:   rd   r/   r/   r0   Úhandle_startendtagµ   s    


z%HTMLExtractorExtra.handle_startendtagc                    s>   | j rd|v rd| _ | js | js.tƒ  |¡ n| j |¡ d S )Nri   F)rU   r[   r1   r$   r_   r4   rd   )r)   rd   r-   r/   r0   r_   Â   s
    zHTMLExtractorExtra.handle_datac                    s^   | j s| jstƒ  ||¡ n>|  ¡ rF|rF|  d| jj |¡ d ¡ n|  | jj |¡¡ d S )Nri   rh   )	r[   r1   r$   rZ   rT   r_   r*   r`   ra   )r)   rd   rs   r-   r/   r0   rZ   Ê   s
    z#HTMLExtractorExtra.handle_empty_tagc                    s6   |   ¡ s| js| jr$tt| ƒ |¡S |  d¡ |d S )Nz<?r   )rT   rU   r1   r$   r   Úparse_pir_   ©r)   Úir-   r/   r0   ru   Ó   s    
zHTMLExtractorExtra.parse_pic                    s6   |   ¡ s| js| jr$tt| ƒ |¡S |  d¡ |d S )Nz<!r   )rT   rU   r1   r$   r   Úparse_html_declarationr_   rv   r-   r/   r0   rx   Ý   s    
z)HTMLExtractorExtra.parse_html_declaration)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r6   r8   r;   rG   r\   r9   rt   r_   rZ   ru   rx   Ú__classcell__r/   r/   r-   r0   r      s   ,/	
r   c                   @   s   e Zd ZdZdd„ ZdS )ÚHtmlBlockPreprocessorzDRemove html blocks from the text and store them for later retrieval.c                 C   s8   d  |¡}t| jƒ}| |¡ | ¡  d  |j¡ d¡S )Nri   rg   )Újoinr   r*   Úfeedr8   rk   Úsplit)r)   ÚlinesÚsourceÚparserr/   r/   r0   Úrunë   s
    


zHtmlBlockPreprocessor.runN)ry   rz   r{   r|   r…   r/   r/   r/   r0   r~   è   s   r~   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚMarkdownInHtmlProcessorzNProcess Markdown Inside HTML Blocks which have been stored in the `HtmlStash`.c                 C   s   dS )NTr/   )r)   ÚparentrB   r/   r/   r0   Útestö   s    zMarkdownInHtmlProcessor.testc                 C   s¦  |j  dd¡}|dkr,t|ƒD ]}|  |¡ q g }t|ƒD ]`\}}|jr<|j d¡}d|_t d¡}| j	 
|| d¡¡ t|ƒ}| ¡  | |d |f¡ q<| ¡  |D ]\}}	|	D ]}
| ||
¡ q¶qª|jr¢|j d¡}d|_t d¡}| j	 
|| d¡¡ t|ƒ}| ¡  |D ]}| d	|¡ qnv|d
krRt|ƒD ]}|  |¡ q>nP|jdu rdd|_t |j¡|_t|ƒD ]&}|  |¡ |jrzt |j¡|_qzdS )až  
        Recursively parse the text content of an `etree` Element as Markdown.

        Any block level elements generated from the Markdown will be inserted as children of the element in place
        of the text content. All `markdown` attributes are removed. For any elements in which Markdown parsing has
        been disabled, the text content of it and its children are wrapped in an `AtomicString`.
        r<   r@   rB   ri   rg   Údivrh   r   r
   rA   N)ÚattribrV   ÚlistÚparse_element_contentÚ	enumerateÚtailÚrstripr2   rW   r„   ZparseBlocksr   Úreverser]   Úinsertrf   r   ZAtomicString)r)   r:   rF   ÚchildÚtailsÚposrB   ÚdummyÚchildrenrŽ   rr   r/   r/   r0   rŒ   ú   sJ    	




z-MarkdownInHtmlProcessor.parse_element_contentc                 C   sŠ   t j |d ¡}|r†t| d¡ƒ}| jjjj| }t	|t
jƒr†| d¡ |  |¡ | |¡ | jjjj |¡ | jjjj |d¡ dS dS )Nr
   r   rg   TF)r   ZHTML_PLACEHOLDER_RErm   ÚintÚgroupr„   r*   r`   ZrawHtmlBlocksÚ
isinstancer2   rW   rV   rŒ   r]   r‘   )r)   r‡   ÚblocksÚmÚindexr:   r/   r/   r0   r…   @  s    


zMarkdownInHtmlProcessor.runN)ry   rz   r{   r|   rˆ   rŒ   r…   r/   r/   r/   r0   r†   ó   s   Fr†   c                   @   s   e Zd Zdd„ ZdS )ÚMarkdownInHTMLPostprocessorc                 C   s$   t |tjƒr| j |¡S t|ƒS dS )zE Override default to handle any `etree` elements still in the stash. N)r™   r2   rW   r*   Ú
serializerÚstr)r)   rf   r/   r/   r0   Ústash_to_stringT  s    z+MarkdownInHTMLPostprocessor.stash_to_stringN)ry   rz   r{   r    r/   r/   r/   r0   r   S  s   r   c                   @   s   e Zd ZdZdd„ ZdS )ÚMarkdownInHtmlExtensionz/Add Markdown parsing in HTML to Markdown class.c                 C   sD   |j  t|ƒdd¡ |jj t|jƒdd¡ |j t|ƒdd¡ dS )z Register extension instances. Z
html_blocké   Zmarkdown_blockéi   Zraw_htmlé   N)ÚpreprocessorsÚregisterr~   r„   Úblockprocessorsr†   Úpostprocessorsr   )r)   r*   r/   r/   r0   ÚextendMarkdown_  s
    ÿz&MarkdownInHtmlExtension.extendMarkdownN)ry   rz   r{   r|   r©   r/   r/   r/   r0   r¡   \  s   r¡   c                  K   s   t f i | ¤ŽS rH   )r¡   )r,   r/   r/   r0   ÚmakeExtensionl  s    rª   )r|   rg   r   r§   r   r¥   r   r¨   r   r   Z
htmlparserr   r	   Úxml.etree.ElementTreer2   ÚElementTreer   r~   r†   r   r¡   rª   r/   r/   r/   r0   Ú<module>   s    O`	