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(object):
[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)