From 37912b8a5ce04a9d1563e934cd1c264c3ddfbe35 Mon Sep 17 00:00:00 2001 From: "sgunderson@bigfoot.com" <> Date: Wed, 6 Sep 2006 17:28:49 +0200 Subject: [PATCH] Write enough of the Python version to make it pass simple. --- python/xmltemplate.py | 53 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/python/xmltemplate.py b/python/xmltemplate.py index 5922ba6..83a9e0e 100644 --- a/python/xmltemplate.py +++ b/python/xmltemplate.py @@ -1,13 +1,60 @@ #! /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): - pass +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) + + def alternate(tag, array, *elems): return array + +# ugh +def _get_document_element(node): + if node.parentNode is None: + return node + else: + return _get_document_element(node.parentNode) -- 2.39.2