Home | History | Annotate | Download | only in markdown
      1 """
      2 POST-PROCESSORS
      3 =============================================================================
      4 
      5 Markdown also allows post-processors, which are similar to preprocessors in
      6 that they need to implement a "run" method. However, they are run after core
      7 processing.
      8 
      9 """
     10 
     11 
     12 import markdown
     13 
     14 class Processor:
     15     def __init__(self, markdown_instance=None):
     16         if markdown_instance:
     17             self.markdown = markdown_instance
     18 
     19 class Postprocessor(Processor):
     20     """
     21     Postprocessors are run after the ElementTree it converted back into text.
     22 
     23     Each Postprocessor implements a "run" method that takes a pointer to a
     24     text string, modifies it as necessary and returns a text string.
     25 
     26     Postprocessors must extend markdown.Postprocessor.
     27 
     28     """
     29 
     30     def run(self, text):
     31         """
     32         Subclasses of Postprocessor should implement a `run` method, which
     33         takes the html document as a single text string and returns a
     34         (possibly modified) string.
     35 
     36         """
     37         pass
     38 
     39 
     40 class RawHtmlPostprocessor(Postprocessor):
     41     """ Restore raw html to the document. """
     42 
     43     def run(self, text):
     44         """ Iterate over html stash and restore "safe" html. """
     45         for i in range(self.markdown.htmlStash.html_counter):
     46             html, safe  = self.markdown.htmlStash.rawHtmlBlocks[i]
     47             if self.markdown.safeMode and not safe:
     48                 if str(self.markdown.safeMode).lower() == 'escape':
     49                     html = self.escape(html)
     50                 elif str(self.markdown.safeMode).lower() == 'remove':
     51                     html = ''
     52                 else:
     53                     html = markdown.HTML_REMOVED_TEXT
     54             if safe or not self.markdown.safeMode:
     55                 text = text.replace("<p>%s</p>" % 
     56                             (markdown.preprocessors.HTML_PLACEHOLDER % i),
     57                             html + "\n")
     58             text =  text.replace(markdown.preprocessors.HTML_PLACEHOLDER % i, 
     59                                  html)
     60         return text
     61 
     62     def escape(self, html):
     63         """ Basic html escaping """
     64         html = html.replace('&', '&amp;')
     65         html = html.replace('<', '&lt;')
     66         html = html.replace('>', '&gt;')
     67         return html.replace('"', '&quot;')
     68 
     69 
     70 class AndSubstitutePostprocessor(Postprocessor):
     71     """ Restore valid entities """
     72     def __init__(self):
     73         pass
     74 
     75     def run(self, text):
     76         text =  text.replace(markdown.AMP_SUBSTITUTE, "&")
     77         return text
     78