diff options
Diffstat (limited to 'iredis/markdown.py')
-rw-r--r-- | iredis/markdown.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/iredis/markdown.py b/iredis/markdown.py new file mode 100644 index 0000000..ff2b726 --- /dev/null +++ b/iredis/markdown.py @@ -0,0 +1,69 @@ +""" +Markdown render. + +use https://github.com/lepture/mistune render to html, then print with my style. +""" + +import logging +import mistune +import re +from prompt_toolkit.formatted_text import to_formatted_text, HTML + + +logger = logging.getLogger(__name__) + + +class TerminalRender(mistune.Renderer): + def _to_title(self, text): + return f"{text}\n{'='*len(text)}\n" + + def paragraph(self, text): + return text + "\n\n" + + def block_code(self, code, language=None): + code = "\n".join([" " + line for line in code.splitlines()]) + return super().block_code(code) + + def header(self, text, level, raw=None): + if level == 2: + header_text = self._to_title(text) + return super().header(header_text, 2) + return super().header(self._to_title(text), level) + + def list(self, body, ordered=True): + """Rendering list tags like ``<ul>`` and ``<ol>``. + + :param body: body contents of the list. + :param ordered: whether this list is ordered or not. + """ + tag = "ul" + if ordered: + tag = "ol" + return "<%s>%s</%s>\n" % (tag, body, tag) + + def list_item(self, text): + """Rendering list item snippet. Like ``<li>``.""" + return "<li> * %s</li>\n" % text + + +class RedisDocLexer(mistune.BlockLexer): + def enable_at_title(self): + self.rules.at_title = re.compile(r"^@(\w+) *(?:\n+|$)") # @example + self.default_rules.insert(0, "at_title") + + def parse_at_title(self, m): + text = m.group(1) + self.tokens.append({"type": "heading", "level": 2, "text": text}) + + +renderer = TerminalRender() +block_lexer = RedisDocLexer() +block_lexer.enable_at_title() +markdown_render = mistune.Markdown(renderer, block=block_lexer) + + +def render(text): + html_text = markdown_render(text) + logger.debug("[Document] {} ...".format(html_text)[:20]) + + return to_formatted_text(HTML(html_text)) |