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)