Modify output

You can modify the output of the markdown text making a renderer subclass.

List of renderer methods

This is a list of methods for a renderer class, all this methods are necessary to the mpiece.lexer.Lexer class runs correctly. Depending of the lexer object, the renderer methods maybe change.

  • render_bold(str text)
  • render_italic(str text)
  • render_underline(str text)
  • render_strike(str text)
  • render_code_inline(str text)
  • render_link(str text, str href, str title='')
  • render_image(self, src, alt, str title='')
  • render_new_line(str text)
  • render_olist(str text, int start)
  • render_olist_item(str text)
  • render_ulist(str text, str start)
  • render_blockquote(str text)
  • render_header(str text, int level)
  • render_fenced_code(str code, str lang='', str title='')
  • render_break_line(str symbol)
  • render_table(str text)
  • render_table_header(str text)
  • render_table_header_cell(str text)
  • render_table_body(str text)
  • render_table_body_row(str text)
  • render_table_body_cell(str text, str align='')

Usage examples

Make new subclass of HtmlRenderers to converts the **text** markdown and _text_ markdown in custom html code.

from mpiece.renderer import HtmlRenderer
from mpiece import markdown

class CustomHtmlRenderer(HtmlRenderer):

    def render_bold(self, text):
        return '<strong class="custom-class">%s</text>' % self.escape(text)

    def render_underline(self, text):
        # self.use_underline is an attribute to decide if the ``_text_``
        # grammar will converts in underline or italic
        if self.use_underline:
            return '<ins class="custom-class">%s</ins>' % self.escape(text)

        else:
        # self.use_underline is False. ``_text_`` will be a italic text.
            return self.render_italic(text)


renderer = CustomHtmlRenderer()
text_md = '**bold text** and _underline text_'

result = markdown(text_md, renderer=renderer)
print(result)
# output: <p><strong class="custom-class">bold text</strong> and <ins class="custom-class>underline_text</ins></p>

Rendering the lists and images.

from mpiece.renderer import HtmlRenderer
from mpiece import markdown

class CustomHtmlRenderer(HtmlRenderer):

    def render_ulist(self, text, start):
        cssclass = 'class-a' if start == '*' else 'class-b'
        return '<ul class="%s">%s</ul>' % (cssclass, self.escape(text))

    def render_ulist_item(self, text):
        return '<li class="li-item">%s</li>' % self.escape(text)

    def render_olist(self, text, start):
        return '<ol start="%d" class="c-class">%s</ol>' % (start, self.escape(text))

    def render_olist_item(self, text):
        return '<li class="li-item">%s</li>' % self.escape(text)

    def render_image(self, src, alt, title=''):
        src = self.escape_link(src)
        alt, title = self.escape_args(alt, title)

        return '<span class="image"><img src="%s" alt="%s" title="%s"></span>' %( src, alt, title)


text_md = """

- item 1
- item 2
- item 3
  continue item

  new line item 3 ![image](src)

1. item 1
2. item 2
"""

renderer = CustomHtmlRenderer()
result = markdown(text_md, renderer=renderer)

print(result)

"""
output:

<ul class="class-b"><li class="li-item"><p>item 1</p>
</li><li class="li-item"><p>item 2</p>
</li><li class="li-item"><p>item 3</p>
<p>continue item</p>
<p>new line item 3 <span class="image"><img src="src" alt="image" title="None"></span></p></li></ul>
<ol start="1" class="c-class"><li class="li-item"><p>item 1</p></li><li class="li-item"><p>item 2</p></li></ol>
"""

Make new subclass for use pygmentize package in the fenced code markdown.

from mpiece.renderer import HtmlRenderer
from mpiece import markdown

from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import html

class CodeHtmlRenderer(HtmlRenderer):

def render_code(self, code, lang='', title=''):

       if not lang:
        return '<pre>%s</pre>' % self.escape(code)

    # Using pygmentize to parser code
    lexer = get_lexer_by_name(lang, stripall=True)
    formatter = HtmlFormatter()
    return highlight(code, lexer, formatter)

Warning

If you want modify the html code output. You should be escape the html characters in the text. You can use HtmlRenderer.escape() and HtmlRenderer.escape_args() methods.

Also you should escape the image and links urls to avoid dangerous schemes: data, javasript, vbscript. You can use HtmlRenderer.escape_link() method for this task.