diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2020-03-21 10:28:17 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2021-02-07 11:16:53 +0000 |
commit | 06cba6ccd165ca8b224797e37fccb9e63f026d77 (patch) | |
tree | e82f1bc439997ae296f2e74f8a64d84c5d95f140 /iredis/markdown.py | |
parent | Initial commit. (diff) | |
download | iredis-06cba6ccd165ca8b224797e37fccb9e63f026d77.tar.xz iredis-06cba6ccd165ca8b224797e37fccb9e63f026d77.zip |
Adding upstream version 1.9.1.upstream/1.9.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
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)) |