diff options
| author | wiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2005-10-11 19:34:52 +0000 |
|---|---|---|
| committer | wiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2005-10-11 19:34:52 +0000 |
| commit | 8ca484acd7f7fbc2990475a22fb1089b022e5571 (patch) | |
| tree | 66c5572a4ebf7b135e28d86006eae3e327293586 /docutils/transforms | |
| parent | 340274a5ac7f0f0212928245da73116fc5a0daf0 (diff) | |
| download | docutils-8ca484acd7f7fbc2990475a22fb1089b022e5571.tar.gz | |
added Node.deepcopy(); fixed bug with doubly-indirect substitutions
git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3935 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
Diffstat (limited to 'docutils/transforms')
| -rw-r--r-- | docutils/transforms/references.py | 79 |
1 files changed, 40 insertions, 39 deletions
diff --git a/docutils/transforms/references.py b/docutils/transforms/references.py index 2cc83be87..d7ad9376f 100644 --- a/docutils/transforms/references.py +++ b/docutils/transforms/references.py @@ -654,45 +654,46 @@ class Substitutions(Transform): def apply(self): defs = self.document.substitution_defs normed = self.document.substitution_names - subreflist = self.document.substitution_refs.items() - subreflist.sort() - for refname, refs in subreflist: - for ref in refs: - key = None - if defs.has_key(refname): - key = refname - else: - normed_name = refname.lower() - if normed.has_key(normed_name): - key = normed[normed_name] - if key is None: - msg = self.document.reporter.error( - 'Undefined substitution referenced: "%s".' - % refname, base_node=ref) - msgid = self.document.set_id(msg) - prb = nodes.problematic( - ref.rawsource, ref.rawsource, refid=msgid) - prbid = self.document.set_id(prb) - msg.add_backref(prbid) - ref.replace_self(prb) - else: - subdef = defs[key] - parent = ref.parent - index = parent.index(ref) - if (subdef.attributes.has_key('ltrim') - or subdef.attributes.has_key('trim')): - if index > 0 and isinstance(parent[index - 1], - nodes.Text): - parent.replace(parent[index - 1], - parent[index - 1].rstrip()) - if (subdef.attributes.has_key('rtrim') - or subdef.attributes.has_key('trim')): - if (len(parent) > index + 1 - and isinstance(parent[index + 1], nodes.Text)): - parent.replace(parent[index + 1], - parent[index + 1].lstrip()) - ref.replace_self(subdef.children) - self.document.substitution_refs = None # release replaced references + subreflist = self.document.traverse(nodes.substitution_reference) + for ref in subreflist: + refname = ref['refname'] + key = None + if defs.has_key(refname): + key = refname + else: + normed_name = refname.lower() + if normed.has_key(normed_name): + key = normed[normed_name] + if key is None: + msg = self.document.reporter.error( + 'Undefined substitution referenced: "%s".' + % refname, base_node=ref) + msgid = self.document.set_id(msg) + prb = nodes.problematic( + ref.rawsource, ref.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + ref.replace_self(prb) + else: + subdef = defs[key] + parent = ref.parent + index = parent.index(ref) + if (subdef.attributes.has_key('ltrim') + or subdef.attributes.has_key('trim')): + if index > 0 and isinstance(parent[index - 1], + nodes.Text): + parent.replace(parent[index - 1], + parent[index - 1].rstrip()) + if (subdef.attributes.has_key('rtrim') + or subdef.attributes.has_key('trim')): + if (len(parent) > index + 1 + and isinstance(parent[index + 1], nodes.Text)): + parent.replace(parent[index + 1], + parent[index + 1].lstrip()) + subdef_copy = subdef.deepcopy() + # Take care of nested substitution references. + subreflist.extend(subdef_copy.traverse(nodes.substitution_reference)) + ref.replace_self(subdef_copy.children) class TargetNotes(Transform): |
