/usr/share/pyshared/swap/cwm_xml.py is in python-swap 1.2.1-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | """XML built-ins for cwm
"""
from diag import progress, verbosity
from term import LightBuiltIn, Function, ReverseFunction, MultipleFunction, \
HeavyBuiltIn
from llyn import loadToStore # for caching in store's experience
from sax2rdf import XMLtoDOM # for fn:doc
#from Ft.Xml.XPath import Evaluate as evalXPath
# http://packages.debian.org/unstable/python/python-xml
##
## The following code allows for the lazy importing of the
## evalXPath function. It is a hack
def evalXPath(*args, **keywords):
try:
from xml.xpath import Evaluate as localEvalXPath
except ImportError:
progress("Try getting python-xml from http://downloads.sourceforge.net/pyxml/PyXML-0.8.4.tar.gz")
localEvalXPath = progress
globals()['evalXPath'] = localEvalXPath
return localEvalXPath(*args, **keywords)
XMLBI_NS_URI = "http://www.w3.org/2007/ont/xml#"
__version__ = "0.1"
# Node properties
# see http://www.python.org/doc/current/lib/dom-node-objects.html
class BI_nodeType(LightBuiltIn, Function):
"""An integer representing the node type
"""
def evaluateObject(self, subj_py):
return subj_py.nodeType
class BI_parentNode(LightBuiltIn, Function):
"""The parent of the current node, or None for the document node.
The value is always a Node object or None. For Element nodes,
this will be the parent element, except for the root element,
in which case it will be the Document object. For Attr nodes, this is always None.
"""
def evaluateObject(self, subj_py):
return subj_py.parentNode
class BI_attributes(LightBuiltIn, Function):
"""A NamedNodeMap of attribute objects. Only elements have
actual values for this.
"""
def evaluateObject(self, subj_py):
return subj_py.attributes
class BI_previousSibling(LightBuiltIn, Function):
"""The node that immediately precedes this one with the same parent.
For instance the element with an end-tag that comes just before the
self element's start-tag. Of course, XML documents are made up of
more than just elements so the previous sibling could be text,
a comment, or something else.
If this node is the first child of the parent, this property will not exist.
"""
def evaluateObject(self, subj_py):
return subj_py.previousSibling
class BI_nextSibling(LightBuiltIn, Function):
"""The node that immediately follows this one with the same parent. See also previousSibling.
If this is the last child of the parent, this property will not exist.
"""
def evaluateObject(self, subj_py):
return subj_py.nextSibling
class BI_childNodes(LightBuiltIn, Function):
"""A list of nodes contained within this node.
"""
def evaluateObject(self, subj_py):
return subj_py.childNodes
class BI_firstChild(LightBuiltIn, Function):
"""The first child of the node, if there are any.
"""
def evaluateObject(self, subj_py):
return subj_py.firstChild
class BI_lastChild(LightBuiltIn, Function):
"""The last child of the node, if there are any.
"""
def evaluateObject(self, subj_py):
return subj_py.lastChild
class BI_localName(LightBuiltIn, Function):
"""The part of the tagName following the colon if there is one, else the entire tagName
"""
def evaluateObject(self, subj_py):
return subj_py.localName
class BI_prefix(LightBuiltIn, Function):
"""The part of the tagName preceding the colon if there is one, else the empty string
"""
def evaluateObject(self, subj_py):
return subj_py.prefix
class BI_namespaceURI(LightBuiltIn, Function):
"""The namespace associated with the element name.
"""
def evaluateObject(self, subj_py):
return subj_py.namespaceURI
class BI_nodeName(LightBuiltIn, Function):
"""This has a different meaning for each node type; see the DOM
specification for details. You can always get the information you would
get here from another
property such as the tagName property for elements or
the name property for attributes.
"""
def evaluateObject(self, subj_py):
return subj_py.nodeName
class BI_nodeValue(LightBuiltIn, Function):
"""This has a different meaning for each node type;
see the DOM specification for details.
The situation is similar to that with nodeName
"""
def evaluateObject(self, subj_py):
return subj_py.nodeValue
class BI_hasAttributes(LightBuiltIn, Function):
"""True if the node has any attributes.
"""
def evaluateObject(self, subj_py):
return subj_py.hasAttributes()
class BI_hasChildNodes(LightBuiltIn, Function):
"""True if the node has any child nodes
"""
def evaluateObject(self, subj_py):
return subj_py.hasChildNodes()
class BI_isSameNode(LightBuiltIn):
"""Returns true if other refers to the same node as this node.
This is especially useful for DOM implementations which use
any sort of proxy architecture (because more than one object can refer to the same node).
"""
def evaluate(self, subj_py, obj_py):
return subj_py.sSameNode(obj_py)
class BI_xpath(LightBuiltIn, MultipleFunction):
"""Evaluate XPath expression and bind to each resulting node."""
def evaluateObject(self, subj_py):
node, expr = subj_py
out = evalXPath(expr, node)
return [self.store.newXMLLiteral(n) for n in out]
class BI_doc(HeavyBuiltIn, Function):
"""Load XML document from the web. subject is a string, per XQuery.
see test/xml-syntax/fn_doc1.n3
see also llyn.BI_xmlTree, which seems to be dead code
"""
def evalObj(self, subj, queue, bindings, proof, query):
progress("@@fn:doc", subj)
# fn:doc takes a string, but the llyn cache keys of symbols
sym = subj.store.newSymbol(subj.value())
try:
lit = loadToStore(sym, ["application/xml", "text/xml"])
except IOError, e:
progress("@@ioerror", e)
return None # hmm... is built-in API evolving to support exceptions?
dom = XMLtoDOM(lit.value())
# odd... why does BI_xmlTree use the pair API rather than newXMLLiteral?
progress("@@fn:doc returning")
return lit.store.newXMLLiteral(dom)
# Register the string built-ins with the store
def register(store):
str = store.symbol(XMLBI_NS_URI[:-1])
str.internFrag("nodeType", BI_nodeType)
str.internFrag("parentNode", BI_parentNode)
str.internFrag("attributes", BI_attributes)
str.internFrag("previousSibling", BI_previousSibling)
str.internFrag("nextSibling", BI_nextSibling)
str.internFrag("childNodes", BI_childNodes)
str.internFrag("firstChild", BI_firstChild)
str.internFrag("lastChild", BI_lastChild)
str.internFrag("localName", BI_localName)
str.internFrag("prefix", BI_prefix)
str.internFrag("namespaceURI", BI_namespaceURI)
str.internFrag("nodeName", BI_nodeName)
str.internFrag("nodeValue", BI_nodeValue)
str.internFrag("hasAttributes", BI_hasAttributes)
str.internFrag("hasChildNodes", BI_hasChildNodes)
str.internFrag("isSameNode", BI_isSameNode)
str.internFrag("xpath", BI_xpath) # needs test, docs
fn = store.symbol("http://www.w3.org/2006/xpath-functions")
fn.internFrag("string", BI_nodeValue) # probably not an exact match
fn.internFrag("doc", BI_doc)
# ends
|