Project

General

Profile

1
# XPath "function" elements that transform their subpaths
2

    
3
import util
4
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
    if name.startswith('_') and name in funcs:
16
        return funcs[name](path.pop(0).attrs, path)
17
    else: return path
18

    
19
#### XPath functions
20

    
21
# Function names must start with _ to avoid collisions with real tags
22
# Functions take arguments (args, path)
23

    
24
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
    in_, do = args
29
    list_ = [in_[1:]] + in_[0].other_branches
30
    
31
    for_path = []
32
    for with_ in list_: for_path += util.list_replace(do, for_repl_var, with_)
33
    return for_path + path
34
funcs['_forEach'] = _forEach
(17-17/17)