diff options
author | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-01-19 23:12:25 +0900 |
---|---|---|
committer | Takeshi KOMIYA <i.tkomiya@gmail.com> | 2018-01-19 23:13:21 +0900 |
commit | f91c7327494a8dab1e1bcc985fcadb0cc6cb5ebf (patch) | |
tree | e3e6c4930d6e29fea6583278b6016cee7f8aeffc | |
parent | f9a53f50c6cc9034a0fa7fb171b4c7a8553f7821 (diff) | |
download | sphinx-git-f91c7327494a8dab1e1bcc985fcadb0cc6cb5ebf.tar.gz |
Fix #4438: math: math with labels with whitespace cause html error
-rw-r--r-- | CHANGES | 1 | ||||
-rw-r--r-- | sphinx/ext/mathbase.py | 15 | ||||
-rw-r--r-- | tests/test_ext_math.py | 6 |
3 files changed, 13 insertions, 9 deletions
@@ -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 < 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) |