#! /usr/bin/python
+import re
import xml.dom.minidom
-def process_file(filename, obj, clean = False):
+def process_file(filename, obj, clean = True):
doc = xml.dom.minidom.parse(filename)
process(doc, obj, clean)
return doc
-def process(node, obj, clean):
+def process(node, obj, clean = True):
+ if isinstance(obj, str): # overwrite
+ for child in node.childNodes:
+ node.removeChild(child)
+ doc = _get_document_element(node)
+ node.appendChild(doc.createTextNode(obj))
+ elif isinstance(obj, xml.dom.Node): # overwrite
+ pass
+ elif isinstance(obj, dict): # substitute
+ for child in node.childNodes:
+ processed = False
+
+ if child.nodeType == xml.dom.Node.ELEMENT_NODE:
+ id = None
+
+ attrs = child.attributes
+ if not attrs is None:
+ for i in range(attrs.length):
+ attr = attrs.item(0)
+ if attr.namespaceURI == "http://template.sesse.net/" or attr.name == "id":
+ id = attr.value
+ if clean:
+ child.removeAttribute(attr.name)
+
+ # check all substitutions to see if we found anything
+ # appropriate
+ for key in obj.keys():
+ if key.startswith(child.tagName + "/"):
+ child.setAttribute(key.split("/")[1], obj[key])
+ elif (not id is None) and key.startswith("#" + id + "/"):
+ child.setAttribute(key.split("/")[1], obj[key])
+
+ if not processed:
+ if key == child.tagName or ((not id is None) and key == "#" + id):
+ process(child, obj[key], clean)
+ processed = True
+
+ if not processed:
+ process(child, obj, clean)
+ elif isinstance(obj, list): # repeat
+ doc = _get_document_element(node)
+ frag = doc.createElement("temporary-fragment") # ugh
+
+ for child in node.childNodes:
+ frag.appendChild(child)
+ node.removeChild(child)
+
+ for instance in obj:
+ newnode = frag.clone(True)
+ node.appendChild(newnode)
+ process(newnode, instance, clean)
+ if clean:
+ _clean(newnode)
+
+ # remove all the <fragment> tags
+
+ for child in node.childNodes:
+ if child.name == 'temporary-fragment':
+ for child2 in child.childNodes:
+ node.appendChild(child2)
+ node.removeChild(child)
+
+ if clean:
+ _clean(node)
+
+def alternate(tag, array, *elems):
+ return array
+
+def _clean(node):
pass
+
+# ugh
+def _get_document_element(node):
+ if node.parentNode is None:
+ return node
+ else:
+ return _get_document_element(node.parentNode)