diff options
Diffstat (limited to 'hack/rst2html')
-rwxr-xr-x | hack/rst2html | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/hack/rst2html b/hack/rst2html new file mode 100755 index 0000000..e3a390d --- /dev/null +++ b/hack/rst2html @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +# https://gist.github.com/mastbaum/2655700 + +import sys +import re + +import docutils.core +from docutils.transforms import Transform +from docutils.nodes import TextElement, Inline, Text +from docutils.parsers.rst import Directive, directives +from docutils.writers.html4css1 import Writer, HTMLTranslator + + +class UnfuckedHTMLTranslator(HTMLTranslator): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.in_literal_block = False + + def visit_literal_block(self, node): + self.in_literal_block = True + self.body.append(self.starttag(node, 'pre', CLASS='literal-block')) + self.body.append('<span class="lineno"></span><span class="line">') + + def depart_literal_block(self, node): + self.in_literal_block = False + self.body.append('\n</span></pre>\n') + + def visit_Text(self, node): + if self.in_literal_block: + for match in re.finditer('([^\n]*)(\n|$)', node.astext()): + text, end = match.groups() + + if text: + super().visit_Text(Text(text)) + + if end == '\n': + if isinstance(node.parent, Inline): + self.depart_inline(node.parent) + self.body.append(f'</span>\n<span class="lineno"></span><span class="line">') + if isinstance(node.parent, Inline): + self.visit_inline(node.parent) + + else: + super().visit_Text(node) + + +html_writer = Writer() +html_writer.translator_class = UnfuckedHTMLTranslator +docutils.core.publish_cmdline(writer=html_writer) + |