blob: 8d33cea2f0587ec5615f8f9b895670bc9c9168aa (
plain) (
blame)
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
|
def get_include_callback():
"""
.. function: get_include_callback returns function that processes each DOM element to get xsyn include from it, and it's aware of directory with all the xsyns.
:param xsyn_dir directory with xsyns.
"""
def get_include(element):
"""
.. function: get_include returns list of includes from this DOM element.
:param element DOM element.
"""
res = []
if element.nodeType == element.ELEMENT_NODE and element.nodeName == "parse:include":
attrs = element.attributes
for i in xrange(attrs.length):
attr = attrs.item(i)
if attr.nodeName == "path":
include_filename = attr.nodeValue
res.append(include_filename)
return res
return get_include
def traverse_xsyn(element, on_element):
"""
.. function: traverse_xsyn traverses element and returns concatenated lists of calling on_element of each element.
:param element element in DOM.
:param on_element callback on element that returns list of values.
"""
res = on_element(element)
for child in element.childNodes:
child_results = traverse_xsyn(child, on_element)
res += child_results
return res
def process_xsyn(filepath, on_element):
"""
.. function: process_xsyn processes xsyn file and return concatenated list of calling on_element on each DOM element.
:param filepath path to xsyn file
:param on_element callback called on each element in xsyn that returns list of values.
"""
# keep a stack of filepathes if on_element calls process_xsyn recursively
with open(filepath) as xsyn_file:
from xml.dom.minidom import parse
tree = parse(xsyn_file)
tree.normalize()
res = traverse_xsyn(tree, on_element)
return res
def get_all_includes(filepath):
callback = get_include_callback()
return process_xsyn(filepath, callback)
|