mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Merged in knzm/sphinx-fix-backlink-fork (pull request #97: fix #1058 Footnote backlinks do not work)
This commit is contained in:
@@ -183,7 +183,8 @@ class CitationReferences(Transform):
|
||||
for citnode in self.document.traverse(nodes.citation_reference):
|
||||
cittext = citnode.astext()
|
||||
refnode = addnodes.pending_xref(cittext, reftype='citation',
|
||||
reftarget=cittext, refwarn=True)
|
||||
reftarget=cittext, refwarn=True,
|
||||
ids=citnode["ids"])
|
||||
refnode.line = citnode.line or citnode.parent.line
|
||||
refnode += nodes.Text('[' + cittext + ']')
|
||||
citnode.parent.replace(citnode, refnode)
|
||||
@@ -236,9 +237,9 @@ class Locale(Transform):
|
||||
continue # skip for now
|
||||
|
||||
# auto-numbered foot note reference should use original 'ids'.
|
||||
is_autonumber_footnote_ref = lambda node: \
|
||||
isinstance(node, nodes.footnote_reference) \
|
||||
and node.get('auto') == 1
|
||||
def is_autonumber_footnote_ref(node):
|
||||
return isinstance(node, nodes.footnote_reference) and \
|
||||
node.get('auto') == 1
|
||||
old_foot_refs = node.traverse(is_autonumber_footnote_ref)
|
||||
new_foot_refs = patch.traverse(is_autonumber_footnote_ref)
|
||||
if len(old_foot_refs) != len(new_foot_refs):
|
||||
@@ -253,9 +254,9 @@ class Locale(Transform):
|
||||
# * reference target ".. _Python: ..." is not translatable.
|
||||
# * section refname is not translatable.
|
||||
# * inline reference "`Python <...>`_" has no 'refname'.
|
||||
is_refnamed_ref = lambda node: \
|
||||
isinstance(node, nodes.reference) \
|
||||
and 'refname' in node
|
||||
def is_refnamed_ref(node):
|
||||
return isinstance(node, nodes.reference) and \
|
||||
'refname' in node
|
||||
old_refs = node.traverse(is_refnamed_ref)
|
||||
new_refs = patch.traverse(is_refnamed_ref)
|
||||
applied_refname_map = {}
|
||||
@@ -278,6 +279,25 @@ class Locale(Transform):
|
||||
|
||||
self.document.note_refname(new)
|
||||
|
||||
# refnamed footnote and citation should use original 'ids'.
|
||||
def is_refnamed_footnote_ref(node):
|
||||
footnote_ref_classes = (nodes.footnote_reference,
|
||||
nodes.citation_reference)
|
||||
return isinstance(node, footnote_ref_classes) and \
|
||||
'refname' in node
|
||||
old_refs = node.traverse(is_refnamed_footnote_ref)
|
||||
new_refs = patch.traverse(is_refnamed_footnote_ref)
|
||||
refname_ids_map = {}
|
||||
if len(old_refs) != len(new_refs):
|
||||
env.warn_node('inconsistent references in '
|
||||
'translated message', node)
|
||||
for old in old_refs:
|
||||
refname_ids_map[old["refname"]] = old["ids"]
|
||||
for new in new_refs:
|
||||
refname = new["refname"]
|
||||
if refname in refname_ids_map:
|
||||
new["ids"] = refname_ids_map[refname]
|
||||
|
||||
# update leaves
|
||||
for child in patch.children:
|
||||
child.parent = node
|
||||
|
||||
@@ -28,6 +28,7 @@ Contents:
|
||||
extensions
|
||||
versioning/index
|
||||
only
|
||||
footnote
|
||||
i18n/index
|
||||
|
||||
Python <http://python.org/>
|
||||
|
||||
40
tests/root/footnote.txt
Normal file
40
tests/root/footnote.txt
Normal file
@@ -0,0 +1,40 @@
|
||||
:tocdepth: 2
|
||||
|
||||
Testing footnote and citation
|
||||
================================
|
||||
.. #1058 footnote-backlinks-do-not-work
|
||||
|
||||
numbered footnote
|
||||
--------------------
|
||||
|
||||
[1]_
|
||||
|
||||
auto-numbered footnote
|
||||
------------------------------
|
||||
|
||||
[#]_
|
||||
|
||||
named footnote
|
||||
--------------------
|
||||
|
||||
[#foo]_
|
||||
|
||||
citation
|
||||
--------------------
|
||||
|
||||
[bar]_
|
||||
|
||||
footenotes
|
||||
--------------------
|
||||
|
||||
.. rubric:: Footnotes
|
||||
|
||||
.. [1] numbered
|
||||
|
||||
.. [#] auto numbered
|
||||
|
||||
.. [#foo] named
|
||||
|
||||
.. rubric:: Citations
|
||||
|
||||
.. [bar] cite
|
||||
37
tests/test_footnote.py
Normal file
37
tests/test_footnote.py
Normal file
@@ -0,0 +1,37 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
test_footnote
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Test for footnote and citation.
|
||||
|
||||
:copyright: Copyright 2010 by the Sphinx team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
from util import *
|
||||
|
||||
|
||||
def teardown_module():
|
||||
(test_root / '_build').rmtree(True)
|
||||
|
||||
|
||||
@with_app(buildername='html')
|
||||
def test_html(app):
|
||||
app.builder.build(['footnote'])
|
||||
result = (app.outdir / 'footnote.html').text(encoding='utf-8')
|
||||
expects = [
|
||||
'<a class="footnote-reference" href="#id5" id="id1">[1]</a>',
|
||||
'<a class="footnote-reference" href="#id6" id="id2">[2]</a>',
|
||||
'<a class="footnote-reference" href="#foo" id="id3">[3]</a>',
|
||||
'<a class="reference internal" href="#bar" id="id4">[bar]</a>',
|
||||
'<a class="fn-backref" href="#id1">[1]</a>',
|
||||
'<a class="fn-backref" href="#id2">[2]</a>',
|
||||
'<a class="fn-backref" href="#id3">[3]</a>',
|
||||
'<a class="fn-backref" href="#id4">[bar]</a>',
|
||||
]
|
||||
for expect in expects:
|
||||
matches = re.findall(re.escape(expect), result)
|
||||
assert len(matches) == 1
|
||||
@@ -101,6 +101,26 @@ def test_i18n_footnote_regression(app):
|
||||
assert result == expect
|
||||
|
||||
|
||||
@with_app(buildername='html', cleanenv=True,
|
||||
confoverrides={'language': 'xx', 'locale_dirs': ['.'],
|
||||
'gettext_compact': False})
|
||||
def test_i18n_footnote_backlink(app):
|
||||
"""i18n test for #1058"""
|
||||
app.builder.build(['i18n/footnote'])
|
||||
result = (app.outdir / 'i18n' / 'footnote.html').text(encoding='utf-8')
|
||||
expects = [
|
||||
'<a class="footnote-reference" href="#id5" id="id1">[100]</a>',
|
||||
'<a class="footnote-reference" href="#id4" id="id2">[1]</a>',
|
||||
'<a class="reference internal" href="#ref" id="id3">[ref]</a>',
|
||||
'<a class="fn-backref" href="#id2">[1]</a>',
|
||||
'<a class="fn-backref" href="#id3">[ref]</a>',
|
||||
'<a class="fn-backref" href="#id1">[100]</a>',
|
||||
]
|
||||
for expect in expects:
|
||||
matches = re.findall(re.escape(expect), result)
|
||||
assert len(matches) == 1
|
||||
|
||||
|
||||
@with_app(buildername='text', warning=warnfile, cleanenv=True,
|
||||
confoverrides={'language': 'xx', 'locale_dirs': ['.'],
|
||||
'gettext_compact': False})
|
||||
|
||||
Reference in New Issue
Block a user