######################################################################## # # File Name: XPointer.py # # Docs: http://docs.4suite.org/XPointer/XPointer.py.html # """ A Parsed Token that represents a list of XPointers WWW: http://4suite.org/XPointer e-mail: support@4suite.org Copyright (c) 2000-2001 Fourthought Inc, USA. All Rights Reserved. See http://4suite.org/COPYRIGHT for license and copyright information """ #import types, string from Ft.Xml.XPath import CoreFunctions from Ft.Xml.XPointer import XPtrContext, XPtrException from Ft.Xml.Domlette import GetAllNs class BareName: def __init__(self, name): self.name = name def select(self, context): doc = context.node.rootNode result = CoreFunctions._FindIds(doc, self.name, []) if len(result) > 1: raise Exception("ID must be unique") elif result: return result[0].ownerElement raise XPtrException(XPtrException.SUB_RESOURCE_ERROR) def pprint(self, indent=''): print indent + str(self) def __str__(self): return '' % (id(self), self.name) def __repr__(self): return self.name class ChildSequence: def __init__(self, sequence): if type(sequence[0]) != type(1): self.bareName = sequence[0] self.sequence = sequence[1:] else: self.bareName = None self.sequence = sequence def select(self, context): if self.bareName: node = self.bareName.select(context) else: node = context.node.rootNode for index in self.sequence: try: node = node.childNodes[index] except IndexError: raise XPtrException(XPtrException.SUB_RESOURCE_ERROR) return node def pprint(self, indent=''): print indent + str(self) def __str__(self): return '' % (id(self), repr(self)) def __repr__(self): result = self.bareName and repr(self.bareName) or '' for index in self.sequence: result = result + '/%d' % index return result class FullXPtr: def __init__(self, parts): self.parts = parts def select(self, document, contextNode, nss=None): nss = nss or {} nss.update(GetAllNs(document)) context = XPtrContext.XPtrContext(document, 1, 1, contextNode, nss) for part in self.parts: node_set = part.evaluate(context) if len(node_set) == 1: return node_set[0] elif node_set: # The scheme found more than 1 node raise XPtrException(XPtrException.SUB_RESOURCE_ERROR) # Nothing found, try the next one # No schemes found an node raise XPtrException(XPtrException.SUB_RESOURCE_ERROR) def pprint(self, indent=''): print indent + str(self) for part in self.parts: part.pprint(indent + ' ') def __str__(self): return '' % (id(self), repr(self)) def __repr__(self): return reduce(lambda result, part: result + ' ' + repr(part), self.parts, '')