[Docstring-checkins] CVS: dps/dps nodes.py,1.29,1.30
Status: Pre-Alpha
Brought to you by:
goodger
From: David G. <go...@us...> - 2002-02-20 04:17:38
|
Update of /cvsroot/docstring/dps/dps In directory usw-pr-cvs1:/tmp/cvs-serv14709/dps/dps Modified Files: nodes.py Log Message: - Added flow controls to ``Node.walk()`` & ``Node.walkabout()``. - Added 'id' attribute support to ``document``. Index: nodes.py =================================================================== RCS file: /cvsroot/docstring/dps/dps/nodes.py,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** nodes.py 15 Feb 2002 22:42:44 -0000 1.29 --- nodes.py 20 Feb 2002 04:17:36 -0000 1.30 *************** *** 56,63 **** method = getattr(visitor, 'visit_' + self.__class__.__name__, visitor.unknown_visit) ! method(self) ! children = self.getchildren() ! for i in range(len(children)): ! children[i].walk(visitor) def walkabout(self, visitor): --- 56,69 ---- method = getattr(visitor, 'visit_' + self.__class__.__name__, visitor.unknown_visit) ! try: ! method(self) ! children = self.getchildren() ! try: ! for i in range(len(children)): ! children[i].walk(visitor) ! except SkipSiblings: ! pass ! except (SkipChildren, SkipDeparture): ! pass def walkabout(self, visitor): *************** *** 73,80 **** method = getattr(visitor, 'visit_' + self.__class__.__name__, visitor.unknown_visit) ! method(self) ! children = self.getchildren() ! for i in range(len(children)): ! children[i].walkabout(visitor) method = getattr(visitor, 'depart_' + self.__class__.__name__, visitor.unknown_departure) --- 79,94 ---- method = getattr(visitor, 'visit_' + self.__class__.__name__, visitor.unknown_visit) ! try: ! method(self) ! children = self.getchildren() ! try: ! for i in range(len(children)): ! children[i].walkabout(visitor) ! except SkipSiblings: ! pass ! except SkipChildren: ! pass ! except SkipDeparture: ! return method = getattr(visitor, 'depart_' + self.__class__.__name__, visitor.unknown_departure) *************** *** 489,492 **** --- 503,512 ---- """Mapping of reference names to lists of reference nodes.""" + self.nameids = {} + """Mapping of names to unique id's.""" + + self.ids = {} + """Mapping of ids to nodes.""" + self.substitution_refs = {} """Mapping of substitution names to lists of substitution_reference *************** *** 514,517 **** --- 534,540 ---- """Initial auto-numbered footnote number.""" + self.id_start = 1 + """Initial ID number.""" + def asdom(self, dom=xml.dom.minidom): domroot = dom.Document() *************** *** 519,525 **** return domroot ! def note_implicit_target(self, targetnode, innode=None): if innode == None: innode = self name = targetnode['name'] if self.explicit_targets.has_key(name) \ --- 542,572 ---- return domroot ! def set_id(self, node, innode=None): if innode == None: innode = self + if node.has_key('id'): + id = node['id'] + if self.ids.has_key(id) and self.ids[id] is not node: + msg = self.reporter.error('Duplicate ID: "%s"' % id) + innode += msg + else: + while 1: + id = 'id%s' % self.id_start + self.id_start += 1 + if not self.ids.has_key(id): + break + node['id'] = id + self.ids[id] = node + if node.has_key('name'): + name = node['name'] + if self.nameids.has_key(name) \ + and self.ids[self.nameids[name]].has_key('name'): + msg = self.reporter.info( + 'Multiple IDs for name "%s": "%s", "%s"' + % (name, self.nameids[name], id)) + innode += msg + self.nameids[name] = id + + def note_implicit_target(self, targetnode, innode=None): name = targetnode['name'] if self.explicit_targets.has_key(name) \ *************** *** 528,531 **** --- 575,580 ---- sw = self.reporter.info( 'Duplicate implicit target name: "%s"' % name) + if innode == None: + innode = self innode += sw self.clear_target_names(name, self.implicit_targets) *************** *** 533,536 **** --- 582,586 ---- targetnode['dupname'] = name self.implicit_targets[name] = targetnode + self.set_id(targetnode) def note_explicit_target(self, targetnode, innode=None): *************** *** 560,563 **** --- 610,614 ---- self.clear_target_names(name, self.implicit_targets) self.explicit_targets[name] = targetnode + self.set_id(targetnode) def clear_target_names(self, name, *targetdicts): *************** *** 597,606 **** def note_substitution_def(self, substitutiondefnode, innode=None): - if innode == None: - innode = self name = substitutiondefnode['name'] if self.substitution_defs.has_key(name): sw = self.reporter.error( 'Duplicate substitution definition name: "%s"' % name) innode += sw oldnode = self.substitution_defs[name] --- 648,657 ---- def note_substitution_def(self, substitutiondefnode, innode=None): name = substitutiondefnode['name'] if self.substitution_defs.has_key(name): sw = self.reporter.error( 'Duplicate substitution definition name: "%s"' % name) + if innode == None: + innode = self innode += sw oldnode = self.substitution_defs[name] *************** *** 838,839 **** --- 889,896 ---- self.default_departure(node)\n""" % name del name + + + class VisitorException(Exception): pass + class SkipChildren(VisitorException): pass + class SkipSiblings(VisitorException): pass + class SkipDeparture(VisitorException): pass |