summaryrefslogtreecommitdiff
path: root/docutils/transforms
diff options
context:
space:
mode:
authorwiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2005-10-11 19:34:52 +0000
committerwiemann <wiemann@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2005-10-11 19:34:52 +0000
commit8ca484acd7f7fbc2990475a22fb1089b022e5571 (patch)
tree66c5572a4ebf7b135e28d86006eae3e327293586 /docutils/transforms
parent340274a5ac7f0f0212928245da73116fc5a0daf0 (diff)
downloaddocutils-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.py79
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):