from markdown import markdown from html import escape import re colors = [ "red", "green", "yellow", "blue", "magenta", "cyan" ] markup = [ "bold", "italic", "underline", "strike" ] tokens = re.compile( r"\[({}): (.+?)]".format( "|".join(colors + markup)), flags=re.DOTALL) quotes = re.compile(">>([0-9]+)") linequotes = re.compile("^(>.+)$", flags=re.MULTILINE) def apply_formatting(msg_obj, formatter): """ Receives a messages object from a thread and returns it with all the message bodies passed through FORMATTER. """ for x in msg_obj["messages"].keys(): msg_obj["messages"][x]["body"] = \ formatter(msg_obj["messages"][x]["body"]) return msg_obj def raw(text): """ Just return the message in the same state that it was submitted. """ return text def html(text): """ Returns messages in html format, after being sent through markdown. Color directives are given as: content Directives may be nested. If you don't have access to a fully featured and compliant html renderer in your client, you should use one of the simpler directives like strip, indice, or raw. """ text = TOKENS.sub(map_html, escape(text)) text = QUOTES.sub(r'\g<0>', text) return markdown( LINEQUOTES.sub(r'\1
', text)) # and this is the callback used by the sub statement def map_html(match): directive, body = match.group(1).lower(), match.group(2) if directive in colors: return '{1}'.format(directive, body) elif directive in markup: return '<{0}>{1}'.format(directive[0], body) return body