Project

General

Profile

1 1341 aaronmk
# XPath "function" elements that transform their subpaths
2
3 1346 aaronmk
import util
4 1341 aaronmk
import xpath
5
6
##### Functions
7
8
funcs = {}
9
10
def process(path):
11
    if path == []: return path
12
13
    path[1:] = process(path[1:])
14
    name = path[0].name
15 1343 aaronmk
    if name.startswith('_') and name in funcs:
16
        return funcs[name](path.pop(0).attrs, path)
17 1341 aaronmk
    else: return path
18
19
#### XPath functions
20
21
# Function names must start with _ to avoid collisions with real tags
22 1343 aaronmk
# Functions take arguments (args, path)
23 1341 aaronmk
24 1346 aaronmk
for_repl_var = xpath.XpathElem('_val')
25
26
def _forEach(args, path):
27
    '''Replaces "_val" in `do` with each item in the `in_` list'''
28 1343 aaronmk
    in_, do = args
29
    list_ = [in_[1:]] + in_[0].other_branches
30
31
    for_path = []
32 1346 aaronmk
    for with_ in list_: for_path += util.list_replace(do, for_repl_var, with_)
33 1343 aaronmk
    return for_path + path
34 1346 aaronmk
funcs['_forEach'] = _forEach