aboutsummaryrefslogtreecommitdiffstats
path: root/build/plugins/_xsyn_includes.py
blob: 61d34bea3e0bc5f89f065e085b84bf6f576a3ab5 (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)