Source code for errbot.rendering

# vim: noai:ts=4:sw=4
import re

from markdown import Markdown
from markdown.extensions.extra import ExtraExtension

# Attribute regexp looks for extendend syntax: {: ... }
ATTR_RE = re.compile(r"{:([^}]*)}")
MD_ESCAPE_RE = re.compile(
    "|".join(
        re.escape(c)
        for c in (
            "\\",
            "`",
            "*",
            "_",
            "{",
            "}",
            "[",
            "]",
            "(",
            ")",
            ">",
            "#",
            "+",
            "-",
            ".",
            "!",
        )
    )
)

# Here are few helpers to simplify the conversion from markdown to various
# backend formats.


[docs] def ansi(): """This makes a converter from markdown to ansi (console) format. It can be called like this: from errbot.rendering import ansi md_converter = ansi() # you need to cache the converter ansi_txt = md_converter.convert(md_txt) """ from .ansiext import AnsiExtension md = Markdown(output_format="ansi", extensions=[ExtraExtension(), AnsiExtension()]) md.stripTopLevelTags = False return md
[docs] def text(): """This makes a converter from markdown to text (unicode) format. It can be called like this: from errbot.rendering import text md_converter = text() # you need to cache the converter pure_text = md_converter.convert(md_txt) """ from .ansiext import AnsiExtension md = Markdown(output_format="text", extensions=[ExtraExtension(), AnsiExtension()]) md.stripTopLevelTags = False return md
[docs] def imtext(): """This makes a converter from markdown to imtext (unicode) format. imtest is the format like gtalk, slack or skype with simple _ or * markup. It can be called like this: from errbot.rendering import imtext md_converter = imtext() # you need to cache the converter im_text = md_converter.convert(md_txt) """ from .ansiext import AnsiExtension md = Markdown( output_format="imtext", extensions=[ExtraExtension(), AnsiExtension()] ) md.stripTopLevelTags = False return md
[docs] class Mde2mdConverter:
[docs] def convert(self, mde): while True: m = ATTR_RE.search(mde) if m is None: break left, right = m.span() mde = mde[:left] + mde[right:] return mde
[docs] def md(): """This makes a converter from markdown-extra to markdown, stripping the attributes from extra.""" return Mde2mdConverter()
[docs] def xhtml(): """This makes a converter from markdown to xhtml format. It can be called like this: from errbot.rendering import xhtml md_converter = xhtml() # you need to cache the converter html = md_converter.convert(md_txt) """ return Markdown(output_format="xhtml", extensions=[ExtraExtension()])
[docs] def md_escape(txt): """Call this if you want to be sure your text won't be interpreted as markdown :param txt: bare text to escape. """ return MD_ESCAPE_RE.sub(lambda match: "\\" + match.group(0), txt)