Python Markdown extension example

The Python Markdown module, perhaps outdated, but the one that I use, can be extended using plugins. Here is a plugin I needed and built. It adds a user-specified CSS class to the generated P tags. It draws heavily on the examples at the above website. (I also had to read the code.)

# the name "markdown" was taken, in my module, so I aliased it
import markdown as markdownmodule
class ClassAdderTreeprocessor(markdownmodule.treeprocessors.Treeprocessor):
    """Markdown extension for h.markdownWithCssClass()"""
    def run(self, root):
        self.set_css_class(root)
        return root

    def set_css_class(self, element):
        """Sets class attribute of P tags to configured CSS class."""
        for child in element: 
            if child.tag == "p":
                child.set("class", self.ext.getConfig("css_class") ) #set the class attribute
            self.set_css_class(child) # run recursively on children

class ClassAdderExtension(markdownmodule.Extension):
    """Markdown extension for h.markdownWithCssClass()"""
    def __init__(self, *args, **configs):
        # define default configs
        self.config = {
            'css_class' : ["something-css-like",
                           "Set class name for p tags - Default: something-css-like"]
            }
        # Override defaults with user settings
        for key, value in configs.items():
            self.setConfig(key, value)

    def extendMarkdown(self, md, md_globals):
        # Insert a tree-processor that adds the configured CSS class to P tags
        treeprocessor = ClassAdderTreeprocessor(md)
        treeprocessor.ext = self
        md.treeprocessors['css'] = treeprocessor

def markdownWithCssClass(txt, cssClass):
    """Works like markdown() but adds given CSS class on generated P tags."""
    ext = ClassAdderExtension(css_class=cssClass)
    md = markdownmodule.Markdown(extensions=[ext], safe_mode='escape')
    html = md.convert(txt)
    return html

Have you written a plugin for this thing? Any other comments? Which Markdown processor in Python should I be using if not this one?

Published by olleolleolle

Olle is a programmer, enjoying sunny Malmö in Sweden.

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.