\4 @sdZddlmZddlmZddlmZddlmZddlZdd ZGd d d ej Z Gd d d e Z Gddde Z Gddde Z dS)a POST-PROCESSORS ============================================================================= Markdown also allows post-processors, which are similar to preprocessors in that they need to implement a "run" method. However, they are run after core processing. )absolute_import)unicode_literals)util)odictNcKs:tj}t||d%s

 ) rangemarkdown htmlStash html_counter rawHtmlBlockssafeModestrlowerrhtml_replacement_text isblocklevelreplaceget_placeholder)rrihtmlsaferrrr3s "  zRawHtmlPostprocessor.runcCsF|jdd}|jdd}|jdd}|jddS) z Basic html escaping &z&z>"z")r()rr+rrrrFszRawHtmlPostprocessor.escapecCsOtjd|}|rK|jddd kr5dStj|jdSd S) Nz^\<\/?([^ >]+)rr!?@%TF)r1r2r3r4)rematchgroupr isBlockLevel)rr+mrrrr'Ms z!RawHtmlPostprocessor.isblocklevelN)rrrrrrr'rrrrr 0s   r c@s"eZdZdZddZdS)r z Restore valid entities cCs|jtjd}|S)Nr-)r(rAMP_SUBSTITUTE)rrrrrrZszAndSubstitutePostprocessor.runN)rrrrrrrrrr Ws r c@sMeZdZdZejdejejfZ ddZ ddZ dS)r z Restore escaped chars z %s(\d+)%scCstjt|jdS)Nr)rint2strintr7)rr9rrrrdszUnescapePostprocessor.unescapecCs|jj|j|S)N)REsubr)rrrrrrgszUnescapePostprocessor.runN) rrrrr5compilerSTXETXr=rrrrrrr _s  r )r __future__rrrrrr5r Processorrr r r rrrr s  '