summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2018-01-19 23:12:25 +0900
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2018-01-19 23:13:21 +0900
commitf91c7327494a8dab1e1bcc985fcadb0cc6cb5ebf (patch)
treee3e6c4930d6e29fea6583278b6016cee7f8aeffc
parentf9a53f50c6cc9034a0fa7fb171b4c7a8553f7821 (diff)
downloadsphinx-git-f91c7327494a8dab1e1bcc985fcadb0cc6cb5ebf.tar.gz
Fix #4438: math: math with labels with whitespace cause html error
-rw-r--r--CHANGES1
-rw-r--r--sphinx/ext/mathbase.py15
-rw-r--r--tests/test_ext_math.py6
3 files changed, 13 insertions, 9 deletions
diff --git a/CHANGES b/CHANGES
index 9e473bde1..ad1436925 100644
--- a/CHANGES
+++ b/CHANGES
@@ -18,6 +18,7 @@ Bugs fixed
* #1922: html search: Upper characters problem in French
* #4412: Updated jQuery version from 3.1.0 to 3.2.1
+* #4438: math: math with labels with whitespace cause html error
Testing
--------
diff --git a/sphinx/ext/mathbase.py b/sphinx/ext/mathbase.py
index 549ca30cd..8370c923e 100644
--- a/sphinx/ext/mathbase.py
+++ b/sphinx/ext/mathbase.py
@@ -10,6 +10,7 @@
"""
from docutils import nodes, utils
+from docutils.nodes import make_id
from docutils.parsers.rst import Directive, directives
from sphinx.roles import XRefRole
@@ -51,7 +52,8 @@ class MathDomain(Domain):
label = 'mathematics'
initial_data = {
- 'objects': {}, # labelid -> (docname, eqno)
+ 'nameids': {}, # label -> equation ID
+ 'objects': {}, # equation ID -> (docname, eqno)
} # type: Dict[unicode, Dict[unicode, Tuple[unicode, int]]]
dangling_warnings = {
'eq': 'equation not found: %(target)s',
@@ -59,9 +61,9 @@ class MathDomain(Domain):
def clear_doc(self, docname):
# type: (unicode) -> None
- for labelid, (doc, eqno) in list(self.data['objects'].items()):
+ for equation_id, (doc, eqno) in list(self.data['objects'].items()):
if doc == docname:
- del self.data['objects'][labelid]
+ del self.data['objects'][equation_id]
def merge_domaindata(self, docnames, otherdata):
# type: (Iterable[unicode], Dict) -> None
@@ -81,8 +83,8 @@ class MathDomain(Domain):
return newnode
else:
title = nodes.Text("(%d)" % number)
- return make_refnode(builder, fromdocname, docname,
- "equation-" + target, title)
+ node_id = make_id('equation-%s' % target)
+ return make_refnode(builder, fromdocname, docname, node_id, title)
else:
return None
@@ -226,7 +228,8 @@ class MathDirective(Directive):
node['number'] = eqno
# add target node
- target = nodes.target('', '', ids=['equation-' + node['label']])
+ node_id = make_id('equation-%s' % node['label'])
+ target = nodes.target('', '', ids=[node_id])
self.state.document.note_explicit_target(target)
ret.insert(0, target)
except UserWarning as exc:
diff --git a/tests/test_ext_math.py b/tests/test_ext_math.py
index 2b8a68f9c..8ecf7ca4d 100644
--- a/tests/test_ext_math.py
+++ b/tests/test_ext_math.py
@@ -27,9 +27,9 @@ def test_jsmath(app, status, warning):
assert (u'<span class="eqno">(1)<a class="headerlink" href="#equation-foo" '
u'title="Permalink to this equation">\xb6</a></span>'
u'<div class="math" id="equation-foo">\ne^{i\\pi} = 1</div>' in content)
- assert (u'<span class="eqno">(2)<a class="headerlink" href="#equation-math:0" '
+ assert (u'<span class="eqno">(2)<a class="headerlink" href="#equation-math-0" '
u'title="Permalink to this equation">\xb6</a></span>'
- u'<div class="math" id="equation-math:0">\n'
+ u'<div class="math" id="equation-math-0">\n'
u'e^{ix} = \\cos x + i\\sin x</div>' in content)
assert '<div class="math">\nn \\in \\mathbb N</div>' in content
assert '<div class="math">\na + 1 &lt; b</div>' in content
@@ -85,7 +85,7 @@ def test_math_number_all_mathjax(app, status, warning):
app.builder.build_all()
content = (app.outdir / 'index.html').text()
- html = (r'<div class="math" id="equation-index:0">\s*'
+ html = (r'<div class="math" id="equation-index-0">\s*'
r'<span class="eqno">\(1\)<a .*>\xb6</a></span>\\\[a\^2\+b\^2=c\^2\\\]</div>')
assert re.search(html, content, re.S)