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