| Index: third_party/twisted_8_1/twisted/words/xish/xpath.py
|
| diff --git a/third_party/twisted_8_1/twisted/words/xish/xpath.py b/third_party/twisted_8_1/twisted/words/xish/xpath.py
|
| deleted file mode 100644
|
| index 9505c38d932b30e82ee587f71c28006dd0bc0286..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/words/xish/xpath.py
|
| +++ /dev/null
|
| @@ -1,333 +0,0 @@
|
| -# -*- test-case-name: twisted.words.test.test_xpath -*-
|
| -#
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -XPath query support.
|
| -
|
| -This module provides L{XPathQuery} to match
|
| -L{domish.Element<twisted.words.xish.domish.Element>} instances against
|
| -XPath-like expressions.
|
| -"""
|
| -
|
| -try:
|
| - import cStringIO as StringIO
|
| -except ImportError:
|
| - import StringIO
|
| -
|
| -class LiteralValue(str):
|
| - def value(self, elem):
|
| - return self
|
| -
|
| -
|
| -class IndexValue:
|
| - def __init__(self, index):
|
| - self.index = int(index) - 1
|
| -
|
| - def value(self, elem):
|
| - return elem.children[self.index]
|
| -
|
| -
|
| -class AttribValue:
|
| - def __init__(self, attribname):
|
| - self.attribname = attribname
|
| - if self.attribname == "xmlns":
|
| - self.value = self.value_ns
|
| -
|
| - def value_ns(self, elem):
|
| - return elem.uri
|
| -
|
| - def value(self, elem):
|
| - if self.attribname in elem.attributes:
|
| - return elem.attributes[self.attribname]
|
| - else:
|
| - return None
|
| -
|
| -
|
| -class CompareValue:
|
| - def __init__(self, lhs, op, rhs):
|
| - self.lhs = lhs
|
| - self.rhs = rhs
|
| - if op == "=":
|
| - self.value = self._compareEqual
|
| - else:
|
| - self.value = self._compareNotEqual
|
| -
|
| - def _compareEqual(self, elem):
|
| - return self.lhs.value(elem) == self.rhs.value(elem)
|
| -
|
| - def _compareNotEqual(self, elem):
|
| - return self.lhs.value(elem) != self.rhs.value(elem)
|
| -
|
| -
|
| -class BooleanValue:
|
| - """
|
| - Provide boolean XPath expression operators.
|
| -
|
| - @ivar lhs: Left hand side expression of the operator.
|
| - @ivar op: The operator. One of C{'and'}, C{'or'}.
|
| - @ivar rhs: Right hand side expression of the operator.
|
| - @ivar value: Reference to the method that will calculate the value of
|
| - this expression given an element.
|
| - """
|
| - def __init__(self, lhs, op, rhs):
|
| - self.lhs = lhs
|
| - self.rhs = rhs
|
| - if op == "and":
|
| - self.value = self._booleanAnd
|
| - else:
|
| - self.value = self._booleanOr
|
| -
|
| - def _booleanAnd(self, elem):
|
| - """
|
| - Calculate boolean and of the given expressions given an element.
|
| -
|
| - @param elem: The element to calculate the value of the expression from.
|
| - """
|
| - return self.lhs.value(elem) and self.rhs.value(elem)
|
| -
|
| - def _booleanOr(self, elem):
|
| - """
|
| - Calculate boolean or of the given expressions given an element.
|
| -
|
| - @param elem: The element to calculate the value of the expression from.
|
| - """
|
| - return self.lhs.value(elem) or self.rhs.value(elem)
|
| -
|
| -
|
| -def Function(fname):
|
| - """
|
| - Internal method which selects the function object
|
| - """
|
| - klassname = "_%s_Function" % fname
|
| - c = globals()[klassname]()
|
| - return c
|
| -
|
| -
|
| -class _not_Function:
|
| - def __init__(self):
|
| - self.baseValue = None
|
| -
|
| - def setParams(self, baseValue):
|
| - self.baseValue = baseValue
|
| -
|
| - def value(self, elem):
|
| - return not self.baseValue.value(elem)
|
| -
|
| -
|
| -class _text_Function:
|
| - def setParams(self):
|
| - pass
|
| -
|
| - def value(self, elem):
|
| - return str(elem)
|
| -
|
| -
|
| -class _Location:
|
| - def __init__(self):
|
| - self.predicates = []
|
| - self.elementName = None
|
| - self.childLocation = None
|
| -
|
| - def matchesPredicates(self, elem):
|
| - if self.elementName != None and self.elementName != elem.name:
|
| - return 0
|
| -
|
| - for p in self.predicates:
|
| - if not p.value(elem):
|
| - return 0
|
| -
|
| - return 1
|
| -
|
| - def matches(self, elem):
|
| - if not self.matchesPredicates(elem):
|
| - return 0
|
| -
|
| - if self.childLocation != None:
|
| - for c in elem.elements():
|
| - if self.childLocation.matches(c):
|
| - return 1
|
| - else:
|
| - return 1
|
| -
|
| - return 0
|
| -
|
| - def queryForString(self, elem, resultbuf):
|
| - if not self.matchesPredicates(elem):
|
| - return
|
| -
|
| - if self.childLocation != None:
|
| - for c in elem.elements():
|
| - self.childLocation.queryForString(c, resultbuf)
|
| - else:
|
| - resultbuf.write(str(elem))
|
| -
|
| - def queryForNodes(self, elem, resultlist):
|
| - if not self.matchesPredicates(elem):
|
| - return
|
| -
|
| - if self.childLocation != None:
|
| - for c in elem.elements():
|
| - self.childLocation.queryForNodes(c, resultlist)
|
| - else:
|
| - resultlist.append(elem)
|
| -
|
| - def queryForStringList(self, elem, resultlist):
|
| - if not self.matchesPredicates(elem):
|
| - return
|
| -
|
| - if self.childLocation != None:
|
| - for c in elem.elements():
|
| - self.childLocation.queryForStringList(c, resultlist)
|
| - else:
|
| - for c in elem.children:
|
| - if isinstance(c, (str, unicode)):
|
| - resultlist.append(c)
|
| -
|
| -
|
| -class _AnyLocation:
|
| - def __init__(self):
|
| - self.predicates = []
|
| - self.elementName = None
|
| - self.childLocation = None
|
| -
|
| - def matchesPredicates(self, elem):
|
| - for p in self.predicates:
|
| - if not p.value(elem):
|
| - return 0
|
| - return 1
|
| -
|
| - def listParents(self, elem, parentlist):
|
| - if elem.parent != None:
|
| - self.listParents(elem.parent, parentlist)
|
| - parentlist.append(elem.name)
|
| -
|
| - def isRootMatch(self, elem):
|
| - if (self.elementName == None or self.elementName == elem.name) and \
|
| - self.matchesPredicates(elem):
|
| - if self.childLocation != None:
|
| - for c in elem.elements():
|
| - if self.childLocation.matches(c):
|
| - return True
|
| - else:
|
| - return True
|
| - return False
|
| -
|
| - def findFirstRootMatch(self, elem):
|
| - if (self.elementName == None or self.elementName == elem.name) and \
|
| - self.matchesPredicates(elem):
|
| - # Thus far, the name matches and the predicates match,
|
| - # now check into the children and find the first one
|
| - # that matches the rest of the structure
|
| - # the rest of the structure
|
| - if self.childLocation != None:
|
| - for c in elem.elements():
|
| - if self.childLocation.matches(c):
|
| - return c
|
| - return None
|
| - else:
|
| - # No children locations; this is a match!
|
| - return elem
|
| - else:
|
| - # Ok, predicates or name didn't match, so we need to start
|
| - # down each child and treat it as the root and try
|
| - # again
|
| - for c in elem.elements():
|
| - if self.matches(c):
|
| - return c
|
| - # No children matched...
|
| - return None
|
| -
|
| - def matches(self, elem):
|
| - if self.isRootMatch(elem):
|
| - return True
|
| - else:
|
| - # Ok, initial element isn't an exact match, walk
|
| - # down each child and treat it as the root and try
|
| - # again
|
| - for c in elem.elements():
|
| - if self.matches(c):
|
| - return True
|
| - # No children matched...
|
| - return False
|
| -
|
| - def queryForString(self, elem, resultbuf):
|
| - raise NotImplementedError(
|
| - "queryForString is not implemented for any location")
|
| -
|
| - def queryForNodes(self, elem, resultlist):
|
| - # First check to see if _this_ element is a root
|
| - if self.isRootMatch(elem):
|
| - resultlist.append(elem)
|
| -
|
| - # Now check each child
|
| - for c in elem.elements():
|
| - self.queryForNodes(c, resultlist)
|
| -
|
| -
|
| - def queryForStringList(self, elem, resultlist):
|
| - if self.isRootMatch(elem):
|
| - for c in elem.children:
|
| - if isinstance(c, (str, unicode)):
|
| - resultlist.append(c)
|
| - for c in elem.elements():
|
| - self.queryForStringList(c, resultlist)
|
| -
|
| -
|
| -class XPathQuery:
|
| - def __init__(self, queryStr):
|
| - self.queryStr = queryStr
|
| - from twisted.words.xish.xpathparser import parse
|
| - self.baseLocation = parse('XPATH', queryStr)
|
| -
|
| - def __hash__(self):
|
| - return self.queryStr.__hash__()
|
| -
|
| - def matches(self, elem):
|
| - return self.baseLocation.matches(elem)
|
| -
|
| - def queryForString(self, elem):
|
| - result = StringIO.StringIO()
|
| - self.baseLocation.queryForString(elem, result)
|
| - return result.getvalue()
|
| -
|
| - def queryForNodes(self, elem):
|
| - result = []
|
| - self.baseLocation.queryForNodes(elem, result)
|
| - if len(result) == 0:
|
| - return None
|
| - else:
|
| - return result
|
| -
|
| - def queryForStringList(self, elem):
|
| - result = []
|
| - self.baseLocation.queryForStringList(elem, result)
|
| - if len(result) == 0:
|
| - return None
|
| - else:
|
| - return result
|
| -
|
| -
|
| -__internedQueries = {}
|
| -
|
| -def internQuery(queryString):
|
| - if queryString not in __internedQueries:
|
| - __internedQueries[queryString] = XPathQuery(queryString)
|
| - return __internedQueries[queryString]
|
| -
|
| -
|
| -def matches(xpathstr, elem):
|
| - return internQuery(xpathstr).matches(elem)
|
| -
|
| -
|
| -def queryForStringList(xpathstr, elem):
|
| - return internQuery(xpathstr).queryForStringList(elem)
|
| -
|
| -
|
| -def queryForString(xpathstr, elem):
|
| - return internQuery(xpathstr).queryForString(elem)
|
| -
|
| -
|
| -def queryForNodes(xpathstr, elem):
|
| - return internQuery(xpathstr).queryForNodes(elem)
|
|
|