o
    „¿Ñg ?  ã                   @  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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 )zã
An implementation of [PHP Markdown Extra](http://michelf.com/projects/php-markdown/extra/)'s
parsing of Markdown syntax in raw HTML.

See the [documentation](https://Python-Markdown.github.io/extensions/raw_html)
for details.
é    )Úannotationsé   )Ú	Extensioné   )ÚBlockProcessor)ÚPreprocessor)ÚRawHtmlPostprocessor)Úutil)ÚHTMLExtractorÚblank_line_reNc                      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Úh6ÚlegendÚliÚpÚsummaryÚtdÚth)ÚcanvasÚmathÚoptionÚpreÚscriptÚstyleÚtextarea)ÚsetÚblock_level_elementsÚcopyÚblock_level_tagsÚ	span_tagsÚraw_tagsÚsuperÚ__init__Ú
empty_tagsÚ
block_tagsÚspan_and_blocks_tags)ÚselfÚmdÚargsÚkwargs©Ú	__class__© ú^/var/www/html/bloggers_ems/venv/lib/python3.10/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.   r2   r4   r5   r;   7   s   
zHTMLExtractorExtra.resetc                   s(   t ƒ  ¡  | jr|  | jd ¡ dS dS )zHandle any buffered data.r   N)r)   Úcloser6   Úhandle_endtagr<   r2   r4   r5   r=   >   s   
þzHTMLExtractorExtra.closec                 C  s   | j  ¡ }t ¡ | _ |S )zJ Return element from `treebuilder` and reset `treebuilder` for later use. )r9   r=   r7   r8   )r.   Úelementr4   r4   r5   Úget_elementF   s   

zHTMLExtractorExtra.get_elementc                 C  sª   |  dd¡}|dkrd}| jr| jd nd}|dks"|dkr$|dkr$|}|dkr-|| jv s6|dkr8|| jv r8dS |dkrA|| jv sJ|dkrL|| jv rLdS || jv rSdS dS )	zS Return state from tag and `markdown` attribute. One of 'block', 'span', or 'off'. ÚmarkdownÚ0Ú1éÿÿÿÿNÚoffÚspanÚblock)Úgetr:   r,   r-   r'   r&   )r.   ÚtagÚattrsÚmd_attrÚparent_stater4   r4   r5   Ú	get_stateL   s   
zHTMLExtractorExtra.get_statec                   s  || j v r7|  ¡ s| jr7dd„ |D ƒ}d|v r+| d¡ t ||¡}tj|ddd}n|  ¡ }|  |d¡ d S || j	v r‘|  ¡ sC| jr‘dd„ |D ƒ}|  
||¡}| jsZ|d	v ri| jsi| dd ¡ tƒ  ||¡ d S d
| jv rx|| j	v rx|  d
¡ | j |¡ | j |¡ ||d< | j ||¡ d S | jrtƒ  ||¡ d S |  ¡ }| jr¶| jd dkr¶|  | jj |¡¡ n|  |¡ || jv rÆ|  ¡  d S d S )Nc                 S  ó"   i | ]\}}||d ur|n|“qS ©Nr4   ©Ú.0ÚkeyÚvaluer4   r4   r5   Ú
<dictcomp>d   ó   " z6HTMLExtractorExtra.handle_starttag.<locals>.<dictcomp>rA   ÚunicodeÚhtml©ÚencodingÚmethodTc                 S  rN   rO   r4   rP   r4   r4   r5   rT   q   rU   )NrE   r   rD   rE   )r+   Úat_line_startÚintailÚpopr7   ÚElementÚtostringÚget_starttag_textÚhandle_empty_tagr&   rM   Úinrawr6   r)   Úhandle_starttagr>   r:   Úappendr9   ÚstartÚhandle_datar/   Ú	htmlStashÚstoreÚCDATA_CONTENT_ELEMENTSÚclear_cdata_mode)r.   rI   rJ   r?   ÚdataÚstateÚtextr2   r4   r5   rc   a   s<   



þz"HTMLExtractorExtra.handle_starttagc                   s¤  || j v r¥| jrtƒ  |¡ d S || jv rƒ| jr0| j ¡ }| j ¡  | j |¡ ||kr-n| js| js|  	¡ }| j
r?| j
d nd}| d¡sQ| d¡rQ| j
 d¡ | j
 | jj |¡¡ | j
 d¡ g | _t | j| j| j t|  |¡ƒ d … ¡sd| _d S d S d S |  |¡}| jrž| jd dkrž|  | jj |¡¡ d S |  |¡ d S | jr°tƒ  |¡ d S |  |¡}| jrË| jd dkrË|  | jj |¡¡ d S |  |¡ d S )NrD   Ú ú

Ú
TrE   )r&   rb   r)   r>   r6   r]   r:   r9   Úendr@   ÚcleandocÚendswithrd   r/   rg   rh   rl   r   ÚmatchÚrawdataÚline_offsetÚoffsetÚlenÚget_endtag_textr\   rf   )r.   rI   Úitemr?   rm   r2   r4   r5   r>      sF   



û"ÿ
ð

z HTMLExtractorExtra.handle_endtagc                 C  st   || j v r)dd„ |D ƒ}d|v r$| d¡ t ||¡}tj|ddd}n	|  ¡ }n|  ¡ }| j|| j |¡d d S )Nc                 S  rN   rO   r4   rP   r4   r4   r5   rT   ¾   rU   z9HTMLExtractorExtra.handle_startendtag.<locals>.<dictcomp>rA   rV   rW   rX   )Úis_block)	r+   r]   r7   r^   r_   r`   ra   r/   Úis_block_level)r.   rI   rJ   r?   rk   r4   r4   r5   Úhandle_startendtag¼   s   


z%HTMLExtractorExtra.handle_startendtagc                   s@   | j r
d|v r
d| _ | js| jstƒ  |¡ d S | j |¡ d S )Nrp   F)r\   rb   r6   r)   rf   r9   rk   )r.   rk   r2   r4   r5   rf   É   s
   zHTMLExtractorExtra.handle_datac                   sb   | j s| jstƒ  ||¡ d S |  ¡ r%|r%|  d| jj |¡ d ¡ d S |  | jj |¡¡ d S )Nrp   ro   )	rb   r6   r)   ra   r[   rf   r/   rg   rh   )r.   rk   r{   r2   r4   r5   ra   Ñ   s
    z#HTMLExtractorExtra.handle_empty_tagc                   ó6   |   ¡ s
| js
| jrtt| ƒ |¡S |  d¡ |d S )Nz<?r   )r[   r\   r6   r)   r
   Úparse_pirf   ©r.   Úir2   r4   r5   r   Ú   ó   
zHTMLExtractorExtra.parse_pic                   r~   )Nz<!r   )r[   r\   r6   r)   r
   Úparse_html_declarationrf   r€   r2   r4   r5   rƒ   ä   r‚   z)HTMLExtractorExtra.parse_html_declaration)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r;   r=   r@   rM   rc   r>   r}   rf   ra   r   rƒ   Ú__classcell__r4   r4   r2   r5   r   !   s    ,/	
r   c                   @  ó   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 )Nrp   rn   )Újoinr   r/   Úfeedr=   rr   Úsplit)r.   ÚlinesÚsourceÚparserr4   r4   r5   Úrunò   s
   


zHtmlBlockPreprocessor.runN)r„   r…   r†   r‡   r‘   r4   r4   r4   r5   rŠ   ï   ó    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 )NTr4   )r.   ÚparentrG   r4   r4   r5   Útestý   s   zMarkdownInHtmlProcessor.testc                 C  sž  |j  dd¡}|dkr–t|ƒD ]}|  |¡ qg }t|ƒD ]0\}}|jrM|j d¡}d|_t d¡}| j	 
|| d¡¡ t|ƒ}| ¡  | |d |f¡ q| ¡  |D ]\}}	|	D ]}
| ||
¡ qZqT|jr’|j d¡}d|_t d¡}| j	 
|| d¡¡ t|ƒ}| ¡  |D ]
}| d	|¡ q‰dS dS |d
kr¨t|ƒD ]}|  |¡ qždS |jdu r°d|_t |j¡|_t|ƒD ]}|  |¡ |jrÌt |j¡|_q»d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`.
        rA   rE   rG   rp   rn   Údivro   r   r   rF   N)Úattribr]   ÚlistÚparse_element_contentÚ	enumerateÚtailÚrstripr7   r^   r   ÚparseBlocksr   Úreverserd   Úinsertrm   r	   ÚAtomicString)r.   r?   rK   ÚchildÚtailsÚposrG   ÚdummyÚchildrenr›   rz   r4   r4   r5   r™     sX   	
€ÿ
÷ÿ

€ýz-MarkdownInHtmlProcessor.parse_element_contentc                 C  sŠ   t j |d ¡}|rCt| d¡ƒ}| jjjj| }t	|t
jƒrC| d¡ |  |¡ | |¡ | jjjj |¡ | jjjj |d¡ dS dS )Nr   r   rn   TF)r	   ÚHTML_PLACEHOLDER_RErt   ÚintÚgroupr   r/   rg   ÚrawHtmlBlocksÚ
isinstancer7   r^   r]   r™   rd   rŸ   )r.   r”   ÚblocksÚmÚindexr?   r4   r4   r5   r‘   G  s   


zMarkdownInHtmlProcessor.runN)r„   r…   r†   r‡   r•   r™   r‘   r4   r4   r4   r5   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 )zE Override default to handle any `etree` elements still in the stash. )rª   r7   r^   r/   Ú
serializerÚstr)r.   rm   r4   r4   r5   Ústash_to_string[  s   z+MarkdownInHTMLPostprocessor.stash_to_stringN)r„   r…   r†   r±   r4   r4   r4   r5   r®   Z  s    r®   c                   @  r‰   )Ú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. Ú
html_blocké   Úmarkdown_blockéi   Úraw_htmlé   N)ÚpreprocessorsÚregisterrŠ   r   Úblockprocessorsr“   Úpostprocessorsr®   )r.   r/   r4   r4   r5   ÚextendMarkdownf  s
   ÿz&MarkdownInHtmlExtension.extendMarkdownN)r„   r…   r†   r‡   r½   r4   r4   r4   r5   r²   c  r’   r²   c                  K  s   t di | ¤ŽS )Nr4   )r²   )r1   r4   r4   r5   ÚmakeExtensions  s   r¾   )r‡   Ú
__future__r   rn   r   r»   r   r¹   r   r¼   r   r	   Ú
htmlparserr
   r   Úxml.etree.ElementTreer7   ÚElementTreer   rŠ   r“   r®   r²   r¾   r4   r4   r4   r5   Ú<module>   s     O`	