Added ability for syntax highlight in code blocks.

Docutils can leverage pygments python package to create syntax highlight
inside code blocks. Implementation consists two custom classes for
getting HTML code tag contain appropriate class keyword and value.
This commit is contained in:
2022-07-06 16:51:13 +02:00
parent 3861302048
commit 1e88e10c78
2 changed files with 24 additions and 3 deletions

View File

@@ -1,4 +1,4 @@
FROM gitea/gitea:latest
COPY ./rst2htmlbody.py /bin/rst2htmlbody
RUN apk --no-cache add py3-docutils && \
RUN apk --no-cache add py3-docutils py3-pygments && \
chmod 755 /bin/rst2htmlbody

View File

@@ -5,6 +5,20 @@ from docutils import core
from docutils.writers import html5_polyglot
# add class "chroma" to the code block, to get the syntax highlighting
class CustomHTMLTranslator(html5_polyglot.HTMLTranslator):
def visit_literal_block(self, node):
self.body.append(self.starttag(node, 'pre', '', CLASS='literal-block'))
if 'code' in node.get('classes', []):
self.body.append('<code class="chroma">')
class CustomWriter(html5_polyglot.Writer):
def __init__(self):
super().__init__()
self.translator_class = CustomHTMLTranslator
def main():
if not sys.stdin.isatty():
text = sys.stdin.readlines()
@@ -15,8 +29,15 @@ def main():
with open(sys.argv[1]) as fobj:
text = fobj.read()
parts = core.publish_parts(writer=html5_polyglot.Writer(),
source=''.join(text))
try:
import pygments
settings = {'syntax_highlight': 'short'}
except ImportError:
settings = {'syntax_highlight': 'none'}
parts = core.publish_parts(writer=CustomWriter(),
source=''.join(text),
settings_overrides=settings)
print(parts.get('body', ''))