Skip to content
This repository was archived by the owner on Nov 3, 2021. It is now read-only.

Commit 6d6294f

Browse files
ngzhianMs2ger
authored andcommitted
Extend the HTML and LaTeX translator
Instead of overwriting the nodes, we extend the translators provided by Sphinx, and customize the visit_math and visit_math_block logic, to do our hyperlinking logic before calling the base class visit methods. This allows us to deduplicate the logic we copied earlier. For mathdefbs.py, remove all latex related logic, since we don't use this extension to build latex. Issue #1157
1 parent 37c7c38 commit 6d6294f

File tree

2 files changed

+51
-127
lines changed

2 files changed

+51
-127
lines changed

document/core/util/mathdef.py

Lines changed: 35 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
from sphinx.ext.mathbase import math
2-
from sphinx.ext.mathbase import displaymath
32
from sphinx.ext.mathbase import MathDirective
4-
from sphinx.ext.mathjax import html_visit_math
5-
from sphinx.ext.mathjax import html_visit_displaymath
6-
from sphinx.util.texescape import tex_escape_map, tex_replace_map
7-
from docutils import nodes, utils
3+
from sphinx.util.texescape import tex_replace_map
4+
from sphinx.writers.html5 import HTML5Translator
5+
from sphinx.writers.latex import LaTeXTranslator
6+
from docutils import nodes
87
from docutils.parsers.rst.directives.misc import Replace
9-
from docutils.parsers.rst.roles import math_role
108
from six import text_type
119
import re
1210

@@ -22,14 +20,6 @@ def html_transform_math_xref(node):
2220
new_text = xref_re.sub(lambda m: html_hyperlink(m.group(1), m.group(2)), node.astext())
2321
node.children[0] = nodes.Text(new_text)
2422

25-
def ext_html_visit_math(self, node):
26-
html_transform_math_xref(node)
27-
html_visit_math(self, node)
28-
29-
def ext_html_visit_displaymath(self, node):
30-
html_transform_math_xref(node)
31-
html_visit_displaymath(self, node)
32-
3323
# Mirrors sphinx/writers/latex
3424
def latex_hyperlink(file, id):
3525
id = text_type(id).translate(tex_replace_map).\
@@ -41,42 +31,6 @@ def latex_transform_math_xref(node):
4131
new_text = xref_re.sub(lambda m: latex_hyperlink(m.group(1), m.group(2)), node.astext())
4232
node.children[0] = nodes.Text(new_text)
4333

44-
# TODO: this is duplicated from sphinx.writers.latex.LaTeXTranslator, figure out
45-
# a better way to extend it so that we don't have to duplicate this code.
46-
def latex_visit_math(self, node):
47-
if self.in_title:
48-
self.body.append(r'\protect\(%s\protect\)' % node.astext())
49-
else:
50-
self.body.append(r'\(%s\)' % node.astext())
51-
raise nodes.SkipNode
52-
53-
def ext_latex_visit_math(self, node):
54-
latex_transform_math_xref(node)
55-
latex_visit_math(self, node)
56-
57-
# TODO: this is duplicated from sphinx.writers.latex.LaTeXTranslator, figure out
58-
# a better way to extend it so that we don't have to duplicate this code.
59-
def latex_visit_displaymath(self, node):
60-
if node.get('label'):
61-
label = "equation:%s:%s" % (node['docname'], node['label'])
62-
else:
63-
label = None
64-
65-
if node.get('nowrap'):
66-
if label:
67-
self.body.append(r'\label{%s}' % label)
68-
self.body.append(node.astext())
69-
else:
70-
from sphinx.util.math import wrap_displaymath
71-
self.body.append(wrap_displaymath(node.astext(), label,
72-
self.builder.config.math_number_all))
73-
raise nodes.SkipNode
74-
75-
def ext_latex_visit_displaymath(self, node):
76-
latex_transform_math_xref(node)
77-
latex_visit_displaymath(self, node)
78-
79-
8034
# Expand mathdef names in math roles and directives
8135

8236
def_re = re.compile('\\\\[A-Za-z][0-9A-Za-z]*', re.M)
@@ -110,7 +64,7 @@ def run(self):
11064
self.content[i] = replace_mathdefs(doc, s)
11165
for i, s in enumerate(self.arguments):
11266
self.arguments[i] = replace_mathdefs(doc, s)
113-
return super(ExtMathDirective, self).run()
67+
return super().run()
11468

11569
class MathdefDirective(Replace):
11670
def run(self):
@@ -130,20 +84,39 @@ def run(self):
13084
doc.mathdefs[name] = [arity, ''.join(self.content)]
13185
self.content[0] = ':math:`' + self.content[0]
13286
self.content[-1] = self.content[-1] + '`'
133-
return super(MathdefDirective, self).run()
134-
87+
return super().run()
88+
89+
class WebAssemblyHTML5Translator(HTML5Translator):
90+
"""
91+
Customize HTML5Translator.
92+
Convert xref in math and math block nodes to hrefs.
93+
"""
94+
def visit_math(self, node, math_env = ''):
95+
html_transform_math_xref(node)
96+
super().visit_math(node, math_env)
97+
98+
def visit_math_block(self, node, math_env = ''):
99+
html_transform_math_xref(node)
100+
super().visit_math_block(node, math_env)
101+
102+
class WebAssemblyLaTeXTranslator(LaTeXTranslator):
103+
"""
104+
Customize LaTeXTranslator.
105+
Convert xref in math and math block nodes to hyperrefs.
106+
"""
107+
def visit_math(self, node):
108+
latex_transform_math_xref(node)
109+
super().visit_math(node)
110+
111+
def visit_math_block(self, node):
112+
latex_transform_math_xref(node)
113+
super().visit_math_block(node)
135114

136115
# Setup
137116

138117
def setup(app):
139-
app.add_node(math,
140-
override = True,
141-
html = (ext_html_visit_math, None),
142-
latex = (ext_latex_visit_math, None))
143-
app.add_node(displaymath,
144-
override = True,
145-
html = (ext_html_visit_displaymath, None),
146-
latex = (ext_latex_visit_displaymath, None))
118+
app.set_translator('html', WebAssemblyHTML5Translator)
119+
app.set_translator('latex', WebAssemblyLaTeXTranslator)
147120
app.add_role('math', ext_math_role)
148-
app.add_directive('math', ExtMathDirective)
121+
app.add_directive('math', ExtMathDirective, override = True)
149122
app.add_directive('mathdef', MathdefDirective)

document/core/util/mathdefbs.py

Lines changed: 16 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44
# mathdef.py controlled by buildername.
55

66
from sphinx.ext.mathbase import math
7-
from sphinx.ext.mathbase import displaymath
87
from sphinx.ext.mathbase import MathDirective
98
from sphinx.ext.mathjax import html_visit_math
109
from sphinx.ext.mathjax import html_visit_displaymath
11-
from sphinx.util.texescape import tex_escape_map, tex_replace_map
12-
from docutils import nodes, utils
10+
from sphinx.writers.html5 import HTML5Translator
11+
from docutils import nodes
1312
from docutils.parsers.rst.directives.misc import Replace
14-
from docutils.parsers.rst.roles import math_role
15-
from six import text_type
1613
import re
1714

1815

@@ -27,57 +24,6 @@ def html_transform_math_xref(node):
2724
new_text = xref_re.sub(lambda m: html_hyperlink(m.group(1), m.group(2)), node.astext())
2825
node.children[0] = nodes.Text(new_text)
2926

30-
def ext_html_visit_math(self, node):
31-
html_transform_math_xref(node)
32-
html_visit_math(self, node)
33-
34-
def ext_html_visit_displaymath(self, node):
35-
html_transform_math_xref(node)
36-
html_visit_displaymath(self, node)
37-
38-
# Mirrors sphinx/writers/latex
39-
def latex_hyperlink(file, id):
40-
id = text_type(id).translate(tex_replace_map).\
41-
encode('ascii', 'backslashreplace').decode('ascii').\
42-
replace('_', '-').replace('\\', '_')
43-
return '\\hyperref[%s:%s]' % (file, id)
44-
45-
def latex_transform_math_xref(node):
46-
new_text = xref_re.sub(lambda m: latex_hyperlink(m.group(1), m.group(2)), node.astext())
47-
node.children[0] = nodes.Text(new_text)
48-
49-
def latex_visit_math(self, node):
50-
if self.in_title:
51-
self.body.append(r'\protect\(%s\protect\)' % node.astext())
52-
else:
53-
self.body.append(r'\(%s\)' % node.astext())
54-
raise nodes.SkipNode
55-
56-
def ext_latex_visit_math(self, node):
57-
latex_transform_math_xref(node)
58-
latex_visit_math(self, node)
59-
60-
def latex_visit_displaymath(self, node):
61-
if node.get('label'):
62-
label = "equation:%s:%s" % (node['docname'], node['label'])
63-
else:
64-
label = None
65-
66-
if node.get('nowrap'):
67-
if label:
68-
self.body.append(r'\label{%s}' % label)
69-
self.body.append(node.astext())
70-
else:
71-
from sphinx.util.math import wrap_displaymath
72-
self.body.append(wrap_displaymath(node.astext(), label,
73-
self.builder.config.math_number_all))
74-
raise nodes.SkipNode
75-
76-
def ext_latex_visit_displaymath(self, node):
77-
latex_transform_math_xref(node)
78-
latex_visit_displaymath(self, node)
79-
80-
8127
# Expand mathdef names in math roles and directives
8228

8329
def_re = re.compile('\\\\[A-Za-z][0-9A-Za-z]*', re.M)
@@ -132,18 +78,23 @@ def run(self):
13278
self.content[-1] = self.content[-1] + '`'
13379
return super(MathdefDirective, self).run()
13480

81+
class WebAssemblyHTML5Translator(HTML5Translator):
82+
"""
83+
Customize HTML5Translator.
84+
Convert xref in math and math block nodes to hrefs.
85+
"""
86+
def visit_math(self, node, math_env = ''):
87+
html_transform_math_xref(node)
88+
super().visit_math(node, math_env)
89+
90+
def visit_math_block(self, node, math_env = ''):
91+
html_transform_math_xref(node)
92+
super().visit_math_block(node, math_env)
13593

13694
# Setup
13795

13896
def setup(app):
139-
app.add_node(math,
140-
override = True,
141-
html = (ext_html_visit_math, None),
142-
latex = (ext_latex_visit_math, None))
143-
app.add_node(displaymath,
144-
override = True,
145-
html = (ext_html_visit_displaymath, None),
146-
latex = (ext_latex_visit_displaymath, None))
97+
app.set_translator('singlehtml', WebAssemblyHTML5Translator)
14798
app.add_role('math', ext_math_role)
148-
app.add_directive('math', ExtMathDirective)
99+
app.add_directive('math', ExtMathDirective, override = True)
149100
app.add_directive('mathdef', MathdefDirective)

0 commit comments

Comments
 (0)