From 89b962d3feba26469547914a04eee338eb71d14c Mon Sep 17 00:00:00 2001 From: Jesse Tan Date: Thu, 12 Dec 2019 11:45:45 +0100 Subject: [PATCH 1/3] Add inline syntax highlighting using docutils :code: role --- sphinx/environment/__init__.py | 1 + sphinx/writers/html.py | 5 ++++- sphinx/writers/html5.py | 5 ++++- sphinx/writers/latex.py | 7 +++++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py index bc9bf49a74e..4804c89c52e 100644 --- a/sphinx/environment/__init__.py +++ b/sphinx/environment/__init__.py @@ -46,6 +46,7 @@ default_settings = { 'embed_stylesheet': False, 'cloak_email_addresses': True, + 'syntax_highlight': 'short', 'pep_base_url': 'https://www.python.org/dev/peps/', 'pep_references': None, 'rfc_base_url': 'https://tools.ietf.org/html/', diff --git a/sphinx/writers/html.py b/sphinx/writers/html.py index 9ac76901bc5..bb66278ae4a 100644 --- a/sphinx/writers/html.py +++ b/sphinx/writers/html.py @@ -537,8 +537,11 @@ def visit_literal(self, node): self.body.append(self.starttag(node, 'kbd', '', CLASS='docutils literal notranslate')) else: + classes = 'docutils literal notranslate' + if 'code' in node['classes']: + classes += ' highlight' self.body.append(self.starttag(node, 'code', '', - CLASS='docutils literal notranslate')) + CLASS=classes)) self.protect_literal_text += 1 def depart_literal(self, node): diff --git a/sphinx/writers/html5.py b/sphinx/writers/html5.py index fe57f42bff5..7fbfa0c11c6 100644 --- a/sphinx/writers/html5.py +++ b/sphinx/writers/html5.py @@ -484,8 +484,11 @@ def visit_literal(self, node): self.body.append(self.starttag(node, 'kbd', '', CLASS='docutils literal notranslate')) else: + classes = 'docutils literal notranslate' + if 'code' in node['classes']: + classes += ' highlight' self.body.append(self.starttag(node, 'code', '', - CLASS='docutils literal notranslate')) + CLASS=classes)) self.protect_literal_text += 1 def depart_literal(self, node): diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index d0bd38ce2dc..55e0e56cb76 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -464,6 +464,7 @@ def __init__(self, document, builder): self.in_footnote = 0 self.in_caption = 0 self.in_term = 0 + self.in_code = 0 self.needs_linetrimming = 0 self.in_minipage = 0 self.no_latex_floats = 0 @@ -2044,6 +2045,8 @@ def depart_citation_reference(self, node): def visit_literal(self, node): # type: (nodes.Element) -> None self.no_contractions += 1 + if('code' in node.get('classes', [])): + self.in_code = 1 if self.in_title: self.body.append(r'\sphinxstyleliteralintitle{\sphinxupquote{') else: @@ -2052,6 +2055,7 @@ def visit_literal(self, node): def depart_literal(self, node): # type: (nodes.Element) -> None self.no_contractions -= 1 + self.in_code = 0 self.body.append('}}') def visit_footnote_reference(self, node): @@ -2294,6 +2298,9 @@ def visit_inline(self, node): elif classes in [['accelerator']]: self.body.append(r'\sphinxaccelerator{') self.context.append('}') + elif classes and self.in_code: + self.body.append(r'\PYG{%s}{' % ','.join(classes)) + self.context.append('}') elif classes and not self.in_title: self.body.append(r'\DUrole{%s}{' % ','.join(classes)) self.context.append('}') From 8de338ea51c1751c8758819b584628d9c4d4bf05 Mon Sep 17 00:00:00 2001 From: Jesse Tan Date: Mon, 16 Dec 2019 20:27:32 +0100 Subject: [PATCH 2/3] Use Transform module for code role instead of doing bookkeeping in writer --- sphinx/builders/latex/transforms.py | 10 ++++++++++ sphinx/writers/latex.py | 6 +----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/sphinx/builders/latex/transforms.py b/sphinx/builders/latex/transforms.py index 9fe44bc95ee..c7313c8a5cf 100644 --- a/sphinx/builders/latex/transforms.py +++ b/sphinx/builders/latex/transforms.py @@ -599,6 +599,15 @@ def apply(self): node.remove(index) node.parent.insert(i + 1, index) +class InlineCodeTransform(SphinxTransform): + default_priority = 200 + + def apply(self): + for node in self.document.traverse(nodes.literal): + for subnode in node: + if isinstance(subnode, nodes.inline): + # mark inline nodes just under literal node as "code" to handle them in writer! + subnode['code'] = True def setup(app: Sphinx) -> Dict[str, Any]: app.add_transform(FootnoteDocnameUpdater) @@ -610,6 +619,7 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_post_transform(LiteralBlockTransform) app.add_post_transform(MathReferenceTransform) app.add_post_transform(ShowUrlsTransform) + app.add_post_transform(InlineCodeTransform) return { 'version': 'builtin', diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 55e0e56cb76..501fb946bf7 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -464,7 +464,6 @@ def __init__(self, document, builder): self.in_footnote = 0 self.in_caption = 0 self.in_term = 0 - self.in_code = 0 self.needs_linetrimming = 0 self.in_minipage = 0 self.no_latex_floats = 0 @@ -2045,8 +2044,6 @@ def depart_citation_reference(self, node): def visit_literal(self, node): # type: (nodes.Element) -> None self.no_contractions += 1 - if('code' in node.get('classes', [])): - self.in_code = 1 if self.in_title: self.body.append(r'\sphinxstyleliteralintitle{\sphinxupquote{') else: @@ -2055,7 +2052,6 @@ def visit_literal(self, node): def depart_literal(self, node): # type: (nodes.Element) -> None self.no_contractions -= 1 - self.in_code = 0 self.body.append('}}') def visit_footnote_reference(self, node): @@ -2298,7 +2294,7 @@ def visit_inline(self, node): elif classes in [['accelerator']]: self.body.append(r'\sphinxaccelerator{') self.context.append('}') - elif classes and self.in_code: + elif classes and node.get('code', False): self.body.append(r'\PYG{%s}{' % ','.join(classes)) self.context.append('}') elif classes and not self.in_title: From ccc069f5c846be7865fa0dce851806f72382a3dd Mon Sep 17 00:00:00 2001 From: Jesse Tan Date: Mon, 16 Dec 2019 20:35:44 +0100 Subject: [PATCH 3/3] Fix Flake8 errors --- sphinx/builders/latex/transforms.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sphinx/builders/latex/transforms.py b/sphinx/builders/latex/transforms.py index c7313c8a5cf..251d7ff900e 100644 --- a/sphinx/builders/latex/transforms.py +++ b/sphinx/builders/latex/transforms.py @@ -599,16 +599,18 @@ def apply(self): node.remove(index) node.parent.insert(i + 1, index) + class InlineCodeTransform(SphinxTransform): + """Mark inline nodes just under literal node as "code" to handle them in writer""" default_priority = 200 def apply(self): for node in self.document.traverse(nodes.literal): for subnode in node: if isinstance(subnode, nodes.inline): - # mark inline nodes just under literal node as "code" to handle them in writer! subnode['code'] = True + def setup(app: Sphinx) -> Dict[str, Any]: app.add_transform(FootnoteDocnameUpdater) app.add_post_transform(BibliographyTransform)