-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwebdomxml.py
More file actions
82 lines (67 loc) · 3.27 KB
/
webdomxml.py
File metadata and controls
82 lines (67 loc) · 3.27 KB
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
import html5lib
import xml.dom
import webdombase
class NodeProxy(webdombase.EventTarget):
def __init__(self, manager, node):
self.manager = manager
self.node = node
self.checkattrs( ['nodeName', 'nodeType', 'documentElement', 'lastChild', 'childNodes', 'implementation'] )
if hasattr(self, 'nodeType') and self.nodeType == xml.dom.Node.DOCUMENT_NODE:
self.body = self.selectfirst('body')
self.title = self.selectfirst(['head','title'])
if self.title != None:
self.title = self.title.gettext()
if hasattr(self, 'nodeType') and self.nodeType == xml.dom.Node.ELEMENT_NODE:
self.attributes = {}
for i in range(node.attributes.length):
a = node.attributes.item(i)
self.attributes[a.name] = self.manager.get(a)
self.attributes[a.name].name = a.name
self.attributes[a.name].value = a.value
def checkattrs(self, names):
for name in names:
if hasattr(self.node, name):
setattr(self, name, self.manager.get(getattr(self.node, name)))
def selectfirst(self, selector):
if isinstance(selector, list):
head = self.selectfirst(selector[0])
if head == None:
return None
if len(selector) > 1:
return head.selectfirst( selector[1:] )
return head
nodes = self.node.getElementsByTagName(selector)
if len(nodes) > 0:
return self.manager.get(nodes[0])
return None
def gettext(self):
return "".join(t.nodeValue for t in self.node.childNodes if t.nodeType == t.TEXT_NODE)
def appendChild(self, node):
node = self.manager.restore(node)
return self.manager.get(self.node.appendChild(node))
def createElement(self, tagname):
if self.node.__class__.__name__ == 'DocumentFragment':
return self.manager.get(self.node.ownerDocument.createElement(tagname))
return self.manager.get(self.node.createElement(tagname))
def createDocumentFragment(self):
return self.manager.get(self.node.createDocumentFragment())
def createHTMLDocument(self, title):
return self.manager.get(webhtml.parse('<html><head><title>' + title + '</title></head><body></body></html>'))
def getElementsByTagName(self, tagname):
return self.manager.get(self.node.getElementsByTagName(tagname) )
def querySelector(self, selectors):
return self.manager.get(self.node.querySelector(selectors) )
def setAttribute(self, name, value):
self.node.setAttribute(name, value)
def cloneNode(self, deep):
return self.manager.get(self.node.cloneNode(deep))
def createEvent(self, jstype):
return DomEvent(jstype)
def parse(content):
pm = webdombase.ProxyManager({ NodeProxy :
['Node', 'DocumentFragment', 'Attr', 'Element', 'CharacterData', 'Comment',
'Text', 'CDATASection', 'DocumentType', 'Entity', 'Notation', 'ElementInfo', 'Document',
'DOMImplementation'] },
{ webdombase.ContainerProxy : [ 'EmptyNodeList', 'NodeList' ] },
['str','int'] )
return pm.get(html5lib.parse(content, treebuilder='dom'))