5 def process_file(filename, obj, clean = True):
6 doc = xml.dom.minidom.parse(filename)
7 process(doc, obj, clean)
10 def process(node, obj, clean = True):
11 if isinstance(obj, str): # overwrite
12 for child in node.childNodes:
13 node.removeChild(child)
14 doc = _get_document_element(node)
15 node.appendChild(doc.createTextNode(obj))
16 elif isinstance(obj, xml.dom.Node): # overwrite
18 elif isinstance(obj, dict): # substitute
19 for child in node.childNodes:
22 if child.nodeType == xml.dom.Node.ELEMENT_NODE:
25 attrs = child.attributes
27 for i in range(attrs.length):
29 if attr.namespaceURI == "http://template.sesse.net/" or attr.name == "id":
32 child.removeAttribute(attr.name)
34 # check all substitutions to see if we found anything
36 for key in obj.keys():
37 if key.startswith(child.tagName + "/"):
38 child.setAttribute(key.split("/")[1], obj[key])
39 elif (not id is None) and key.startswith("#" + id + "/"):
40 child.setAttribute(key.split("/")[1], obj[key])
43 if key == child.tagName or ((not id is None) and key == "#" + id):
44 process(child, obj[key], clean)
48 process(child, obj, clean)
49 elif isinstance(obj, list): # repeat
50 doc = _get_document_element(node)
51 frag = doc.createElement("temporary-fragment") # ugh
53 for child in node.childNodes:
54 frag.appendChild(child)
55 node.removeChild(child)
58 newnode = frag.clone(True)
59 node.appendChild(newnode)
60 process(newnode, instance, clean)
64 # remove all the <fragment> tags
66 for child in node.childNodes:
67 if child.name == 'temporary-fragment':
68 for child2 in child.childNodes:
69 node.appendChild(child2)
70 node.removeChild(child)
75 def alternate(tag, array, *elems):
82 def _get_document_element(node):
83 if node.parentNode is None:
86 return _get_document_element(node.parentNode)