Viewing file: ParsedXPointer.py (3.2 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
######################################################################## # # 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 '<BareName at %x: %s>' % (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 '<ChildSequence at %x: %s>' % (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 '<FullXPtr at %x: %s>' % (id(self), repr(self))
def __repr__(self): return reduce(lambda result, part: result + ' ' + repr(part), self.parts, '')
|