diff options
| -rw-r--r-- | docutils/HISTORY.txt | 2 | ||||
| -rw-r--r-- | docutils/docutils/nodes.py | 10 | ||||
| -rw-r--r-- | docutils/docutils/parsers/rst/states.py | 4 | ||||
| -rw-r--r-- | docutils/docutils/transforms/references.py | 44 | ||||
| -rwxr-xr-x | docutils/test/test_transforms/test_hyperlinks.py | 30 |
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`_. |
