50 lines
1.6 KiB
Python
Executable file
50 lines
1.6 KiB
Python
Executable file
#!/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)
|
|
|