U
    \> e¢@  ã                   @  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 ddlmZmZmZ er’ddl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_reN)ÚTYPE_CHECKINGÚLiteralÚMapping)ÚMarkdownc                      s¼   e Zd ZdZddœ‡ fdd„Z‡ fdd„Z‡ fdd	„Zd
dœdd„Zdddœdd„Z‡ fdd„Z	‡ fdd„Z
dd„ Z‡ fdd„Z‡ fdd„Zdddœ‡ fdd „Zdddœ‡ fd!d"„Z‡  ZS )#ÚHTMLExtractorExtrazƒ
    Override `HTMLExtractor` and create `etree` `Elements` for any elements which should have content parsed as
    Markdown.
    r   )Úmdc                   s”   t |j ¡ ƒ| _t ddddddddd	d
dddddgƒ| _t dddddddgƒ| _tƒ j|f|ž|Ž 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ÚthZ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)Úselfr   ÚargsÚkwargs©Ú	__class__© úB/tmp/pip-unpacked-wheel-wj0og6ym/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;   ;   s    
zHTMLExtractorExtra.resetc                   s$   t ƒ  ¡  | jr |  | jd ¡ dS )zHandle any buffered data.r   N)r*   Úcloser6   Úhandle_endtagr<   r2   r4   r5   r=   B   s    
zHTMLExtractorExtra.closeúetree.Element)Úreturnc                 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_elementJ   s    

zHTMLExtractorExtra.get_elementzMapping[str, str]z'Literal[('block', 'span', 'off', None)])Úattrsr@   c                 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ksl|dkrp|| jkrpdS |dkr‚|| jks”|dkr˜|| jkr˜dS || jk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)Úgetr:   r-   r.   r)   r(   )r/   ÚtagrC   Úmd_attrZparent_stater4   r4   r5   Ú	get_stateP   s*    ÿÿÿÿ
zHTMLExtractorExtra.get_statec                   s’  || j krn|  ¡ s| jrndd„ |D ƒ}d|krV| d¡ t ||¡}tj|ddd}n|  ¡ }|  |d¡ d S || j	kr"|  ¡ sŠ| jr"dd„ |D ƒ}|  
||¡}| js¸|d	krÔ| jsÔ| dd ¡ tƒ  ||¡ nLd
| jkrò|| j	krò|  d
¡ | j |¡ | j |¡ ||d< | j ||¡ nl| jr:tƒ  ||¡ nT|  ¡ }| jrp| jd dkrp|  | jj |¡¡ n
|  |¡ || jkrŽ|  ¡  d S )Nc                 S  s"   i | ]\}}||d k	r|n|“qS ©Nr4   ©Ú.0ÚkeyÚvaluer4   r4   r5   Ú
<dictcomp>h   s      z6HTMLExtractorExtra.handle_starttag.<locals>.<dictcomp>rD   ÚunicodeÚhtml©ÚencodingÚmethodTc                 S  s"   i | ]\}}||d k	r|n|“qS rO   r4   rP   r4   r4   r5   rT   u   s      )NrH   r   rG   rH   )r,   Úat_line_startÚintailÚpopr7   ÚElementÚtostringÚget_starttag_textÚhandle_empty_tagr(   rN   Úinrawr6   r*   Úhandle_starttagr>   r:   Úappendr9   ÚstartÚhandle_datar   Ú	htmlStashÚstoreÚCDATA_CONTENT_ELEMENTSÚclear_cdata_mode)r/   rL   rC   rA   ÚdataÚstateÚtextr2   r4   r5   rb   e   s:    


z"HTMLExtractorExtra.handle_starttagc                   sš  || j kr>| jr"tƒ  |¡ q–|| jk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 )NrG   Ú ú

Ú
TrH   )r(   ra   r*   r>   r6   r\   r:   r9   ÚendrB   ÚcleandocÚendswithrc   r   rf   rg   rk   r   ÚmatchÚrawdataÚline_offsetÚoffsetÚlenZget_endtag_textr[   re   )r/   rL   ÚitemrA   rl   r2   r4   r5   r>   ‘   s@    


"ÿ

z HTMLExtractorExtra.handle_endtagc                 C  st   || j krRdd„ |D ƒ}d|krH| d¡ t ||¡}tj|ddd}qZ|  ¡ }n|  ¡ }| j|| j |¡d d S )Nc                 S  s"   i | ]\}}||d k	r|n|“qS rO   r4   rP   r4   r4   r5   rT   Â   s      z9HTMLExtractorExtra.handle_startendtag.<locals>.<dictcomp>rD   rU   rV   rW   )Úis_block)	r,   r\   r7   r]   r^   r_   r`   r   Zis_block_level)r/   rL   rC   rA   rj   r4   r4   r5   Úhandle_startendtagÀ   s    


z%HTMLExtractorExtra.handle_startendtagc                   s>   | j rd|krd| _ | js | js.tƒ  |¡ n| j |¡ d S )Nro   F)r[   ra   r6   r*   re   r9   rj   )r/   rj   r2   r4   r5   re   Í   s
    zHTMLExtractorExtra.handle_datac                   s^   | j s| jstƒ  ||¡ n>|  ¡ rF|rF|  d| jj |¡ d ¡ n|  | jj |¡¡ d S )Nro   rn   )	ra   r6   r*   r`   rZ   re   r   rf   rg   )r/   rj   ry   r2   r4   r5   r`   Õ   s
    z#HTMLExtractorExtra.handle_empty_tagÚint)Úir@   c                   s6   |   ¡ s| js| jr$tt| ƒ |¡S |  d¡ |d S )Nz<?r   )rZ   r[   r6   r*   r
   Úparse_pire   ©r/   r|   r2   r4   r5   r}   Þ   s    
zHTMLExtractorExtra.parse_pic                   s6   |   ¡ s| js| jr$tt| ƒ |¡S |  d¡ |d S )Nz<!r   )rZ   r[   r6   r*   r
   Úparse_html_declarationre   r~   r2   r4   r5   r   è   s    
z)HTMLExtractorExtra.parse_html_declaration)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+   r;   r=   rB   rN   rb   r>   rz   re   r`   r}   r   Ú__classcell__r4   r4   r2   r5   r   %   s   ,/	
r   c                   @  s    e Zd ZdZdddœdd„ZdS )ÚHtmlBlockPreprocessorzDRemove html blocks from the text and store them for later retrieval.ú	list[str])Úlinesr@   c                 C  s8   d  |¡}t| jƒ}| |¡ | ¡  d  |j¡ d¡S )Nro   rm   )Újoinr   r   Úfeedr=   rq   Úsplit)r/   r‡   ÚsourceÚparserr4   r4   r5   Úrunö   s
    


zHtmlBlockPreprocessor.runN)r€   r   r‚   rƒ   r   r4   r4   r4   r5   r…   ó   s   r…   c                   @  sD   e Zd ZdZddddœdd„Zddd	œd
d„Zddddœdd„ZdS )ÚMarkdownInHtmlProcessorzNProcess Markdown Inside HTML Blocks which have been stored in the `HtmlStash`.r?   ÚstrÚbool)ÚparentrJ   r@   c                 C  s   dS )NTr4   )r/   r‘   rJ   r4   r4   r5   Útest  s    zMarkdownInHtmlProcessor.testÚNone)rA   r@   c                 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k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`.
        rD   rH   rJ   ro   rm   Údivrn   r   r   rI   N)Úattribr\   ÚlistÚparse_element_contentÚ	enumerateÚtailÚrstripr7   r]   rŒ   ZparseBlocksrŠ   Úreverserc   Úinsertrl   r	   ZAtomicString)r/   rA   rM   ÚchildÚtailsÚposrJ   ÚdummyÚchildrenr™   rx   r4   r4   r5   r—     sJ    	




z-MarkdownInHtmlProcessor.parse_element_contentr†   )r‘   Úblocksr@   c                 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   rm   TF)r	   ZHTML_PLACEHOLDER_RErs   r{   ÚgrouprŒ   r   rf   ZrawHtmlBlocksÚ
isinstancer7   r]   r\   r—   rc   rœ   )r/   r‘   r¢   ÚmÚindexrA   r4   r4   r5   r   K  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dœdd„ZdS )ÚMarkdownInHTMLPostprocessorzstr | etree.Elementr   )rl   r@   c                 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¤   r7   r]   r   Ú
serializerr   )r/   rl   r4   r4   r5   Ústash_to_string_  s    z+MarkdownInHTMLPostprocessor.stash_to_stringN)r€   r   r‚   r©   r4   r4   r4   r5   r§   ^  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   r4   r4   r5   ÚextendMarkdownj  s      ÿz&MarkdownInHtmlExtension.extendMarkdownN)r€   r   r‚   rƒ   r²   r4   r4   r4   r5   rª   g  s   rª   c                  K  s
   t f | ŽS rO   )rª   )r1   r4   r4   r5   ÚmakeExtensionw  s    r³   )rƒ   Ú
__future__r   rm   r   r°   r   r®   r   r±   r   r	   Z
htmlparserr
   r   Úxml.etree.ElementTreer7   ÚElementTreeÚtypingr   r   r   rD   r   r   r…   rŽ   r§   rª   r³   r4   r4   r4   r5   Ú<module>   s$    O`	