summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2005-10-11 21:36:06 +0000
committerwiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2005-10-11 21:36:06 +0000
commit3b2fc92d25dceeebb7d92a3de8771392cc0cf1e7 (patch)
tree8862db562b153ef5c2d4021eb6e2890ae6e0da7e
parent6e03ef782ab76d9e11cd003eb4759a0599cf8897 (diff)
downloaddocutils-3b2fc92d25dceeebb7d92a3de8771392cc0cf1e7.tar.gz
removed more internal state (`document.anonymous_refs` and
`document.anonymous_targets`) git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@3939 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-rw-r--r--docutils/HISTORY.txt2
-rw-r--r--docutils/docutils/nodes.py10
-rw-r--r--docutils/docutils/parsers/rst/states.py4
-rw-r--r--docutils/docutils/transforms/references.py44
-rwxr-xr-xdocutils/test/test_transforms/test_hyperlinks.py30
5 files changed, 57 insertions, 33 deletions
diff --git a/docutils/HISTORY.txt b/docutils/HISTORY.txt
index 57d7a2319..2a06087ea 100644
--- a/docutils/HISTORY.txt
+++ b/docutils/HISTORY.txt
@@ -41,6 +41,8 @@ Changes Since 0.3.9
writing (``Element._dom_node``) and pseudo-XML writing
(``Element.starttag``) to use ``serial_escape``.
- Added ``Node.deepcopy()`` method.
+ - Removed the internal lists ``document.substitution_refs``,
+ ``document.anonymous_refs``, and ``document.anonymous_targets``.
* docutils/parsers/null.py: Added to project; a do-nothing parser.
diff --git a/docutils/docutils/nodes.py b/docutils/docutils/nodes.py
index 17ef75e99..195293a9e 100644
--- a/docutils/docutils/nodes.py
+++ b/docutils/docutils/nodes.py
@@ -834,12 +834,6 @@ class document(Root, Structural, Element):
self.citation_refs = {}
"""Mapping of citation labels to lists of citation_reference nodes."""
- self.anonymous_targets = []
- """List of anonymous target nodes."""
-
- self.anonymous_refs = []
- """List of anonymous reference nodes."""
-
self.autofootnotes = []
"""List of auto-numbered footnote nodes."""
@@ -1017,10 +1011,6 @@ class document(Root, Structural, Element):
def note_anonymous_target(self, target):
self.set_id(target)
- self.anonymous_targets.append(target)
-
- def note_anonymous_ref(self, ref):
- self.anonymous_refs.append(ref)
def note_autofootnote(self, footnote):
self.set_id(footnote)
diff --git a/docutils/docutils/parsers/rst/states.py b/docutils/docutils/parsers/rst/states.py
index db19c34b6..be064db8a 100644
--- a/docutils/docutils/parsers/rst/states.py
+++ b/docutils/docutils/parsers/rst/states.py
@@ -783,7 +783,6 @@ class Inliner:
reference['refuri'] = uri
else:
reference['anonymous'] = 1
- self.document.note_anonymous_ref(reference)
else:
if target:
reference['refuri'] = uri
@@ -846,8 +845,6 @@ class Inliner:
'|%s%s' % (subref_text, endstring), '')
if endstring[-2:] == '__':
reference_node['anonymous'] = 1
- self.document.note_anonymous_ref(
- reference_node)
else:
reference_node['refname'] = normalize_name(subref_text)
self.document.note_refname(reference_node)
@@ -898,7 +895,6 @@ class Inliner:
name=whitespace_normalize_name(referencename))
if anonymous:
referencenode['anonymous'] = 1
- self.document.note_anonymous_ref(referencenode)
else:
referencenode['refname'] = refname
self.document.note_refname(referencenode)
diff --git a/docutils/docutils/transforms/references.py b/docutils/docutils/transforms/references.py
index d7ad9376f..bcf33dfe5 100644
--- a/docutils/docutils/transforms/references.py
+++ b/docutils/docutils/transforms/references.py
@@ -114,23 +114,29 @@ class AnonymousHyperlinks(Transform):
default_priority = 440
def apply(self):
- if len(self.document.anonymous_refs) \
- != len(self.document.anonymous_targets):
+ anonymous_refs = []
+ anonymous_targets = []
+ for node in self.document.traverse(nodes.reference):
+ if node.get('anonymous'):
+ anonymous_refs.append(node)
+ for node in self.document.traverse(nodes.target):
+ if node.get('anonymous'):
+ anonymous_targets.append(node)
+ if len(anonymous_refs) \
+ != len(anonymous_targets):
msg = self.document.reporter.error(
'Anonymous hyperlink mismatch: %s references but %s '
'targets.\nSee "backrefs" attribute for IDs.'
- % (len(self.document.anonymous_refs),
- len(self.document.anonymous_targets)))
+ % (len(anonymous_refs), len(anonymous_targets)))
msgid = self.document.set_id(msg)
- for ref in self.document.anonymous_refs:
+ for ref in anonymous_refs:
prb = nodes.problematic(
ref.rawsource, ref.rawsource, refid=msgid)
prbid = self.document.set_id(prb)
msg.add_backref(prbid)
ref.replace_self(prb)
return
- for ref, target in zip(self.document.anonymous_refs,
- self.document.anonymous_targets):
+ for ref, target in zip(anonymous_refs, anonymous_targets):
target.referenced = 1
while 1:
if target.hasattr('refuri'):
@@ -720,23 +726,23 @@ class TargetNotes(Transform):
refs.extend(self.document.refnames.get(name, []))
if not refs:
continue
- footnote = self.make_target_footnote(target, refs, notes)
+ footnote = self.make_target_footnote(target['refuri'], refs,
+ notes)
if not notes.has_key(target['refuri']):
notes[target['refuri']] = footnote
nodelist.append(footnote)
- if len(self.document.anonymous_targets) \
- == len(self.document.anonymous_refs):
- for target, ref in zip(self.document.anonymous_targets,
- self.document.anonymous_refs):
- if target.hasattr('refuri'):
- footnote = self.make_target_footnote(target, [ref], notes)
- if not notes.has_key(target['refuri']):
- notes[target['refuri']] = footnote
- nodelist.append(footnote)
+ # Take care of anonymous references.
+ for ref in self.document.traverse(nodes.reference):
+ if not ref.get('anonymous'):
+ continue
+ if ref.hasattr('refuri'):
+ footnote = self.make_target_footnote(ref['refuri'], [ref], notes)
+ if not notes.has_key(ref['refuri']):
+ notes[ref['refuri']] = footnote
+ nodelist.append(footnote)
self.startnode.replace_self(nodelist)
- def make_target_footnote(self, target, refs, notes):
- refuri = target['refuri']
+ def make_target_footnote(self, refuri, refs, notes):
if notes.has_key(refuri): # duplicate?
footnote = notes[refuri]
assert len(footnote['names']) == 1
diff --git a/docutils/test/test_transforms/test_hyperlinks.py b/docutils/test/test_transforms/test_hyperlinks.py
index 1b84a18c4..cef12a4f1 100755
--- a/docutils/test/test_transforms/test_hyperlinks.py
+++ b/docutils/test/test_transforms/test_hyperlinks.py
@@ -281,6 +281,36 @@ __ ztarget_
Indirect hyperlink target (id="id2") refers to target "ztarget", which is a duplicate, and cannot be used as a unique reference.
"""],
["""\
+The next anonymous hyperlink reference is parsed (and discarded) at
+some point, but nonetheless anonymous hyperlink references and targets
+match in this snippet.
+
+.. |invalid| replace:: anonymous__
+
+hyperlink__
+
+__ URL
+""",
+"""\
+<document source="test data">
+ <paragraph>
+ The next anonymous hyperlink reference is parsed (and discarded) at
+ some point, but nonetheless anonymous hyperlink references and targets
+ match in this snippet.
+ <system_message level="3" line="5" source="test data" type="ERROR">
+ <paragraph>
+ Substitution definition contains illegal element:
+ <literal_block xml:space="preserve">
+ <reference anonymous="1" name="anonymous">
+ anonymous
+ <literal_block xml:space="preserve">
+ .. |invalid| replace:: anonymous__
+ <paragraph>
+ <reference anonymous="1" name="hyperlink" refuri="URL">
+ hyperlink
+ <target anonymous="1" ids="id1" refuri="URL">
+"""],
+["""\
An `embedded uri <http://direct>`_.
Another reference to the same `embedded URI`_.