X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=python%2Fxmltemplate.py;h=b24d7642ccda30a0173ccd345fc413a313e19dbd;hb=83a41af3311ec494205205ec093ffff0aad56fd0;hp=4c1aa0d669a124198723041af8adf755ee33380e;hpb=c831cb6b6493072a4be2f88663824808dfc0fd15;p=xml-template diff --git a/python/xmltemplate.py b/python/xmltemplate.py index 4c1aa0d..b24d764 100644 --- a/python/xmltemplate.py +++ b/python/xmltemplate.py @@ -8,13 +8,22 @@ def process_file(filename, obj, clean = True): return doc def process(node, obj, clean = True): - if isinstance(obj, str): # overwrite - for child in node.childNodes: - node.removeChild(child) + if isinstance(obj, basestring): # overwrite + while not node.firstChild is None: + node.removeChild(node.firstChild) doc = _get_document_element(node) node.appendChild(doc.createTextNode(obj)) elif isinstance(obj, xml.dom.Node): # overwrite - pass + while not node.firstChild is None: + node.removeChild(node.firstChild) + + if isinstance(obj, xml.dom.minidom.Document): + obj = obj.documentElement + + newobj = obj.cloneNode(True) + node.appendChild(newobj) + + process(newobj, {}, clean) elif isinstance(obj, dict): # substitute for child in node.childNodes: processed = False @@ -23,13 +32,21 @@ def process(node, obj, clean = True): id = None attrs = child.attributes + attrs_to_remove = [] 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": + attr = attrs.item(i) + if attr.namespaceURI == "http://template.sesse.net/" and attr.localName == "id": id = attr.value if clean: - child.removeAttribute(attr.name) + attrs_to_remove.append(attr.name) + if attr.name.startswith("xmlns:") and attr.value == "http://template.sesse.net/" and clean: + attrs_to_remove.append(attr.name) + + for a in attrs_to_remove: + if child.hasAttribute(a): + child.removeAttribute(a) + # check all substitutions to see if we found anything # appropriate @@ -40,7 +57,7 @@ def process(node, obj, clean = True): child.setAttribute(key.split("/")[1], obj[key]) if not processed: - if key == child.tagName or ((not id is None) and key == "#" + id): + if key == child.localName or ((not id is None) and key == "#" + id): process(child, obj[key], clean) processed = True @@ -50,33 +67,58 @@ def process(node, obj, clean = True): doc = _get_document_element(node) frag = doc.createElement("temporary-fragment") # ugh - for child in node.childNodes: - frag.appendChild(child) + while not node.firstChild is None: + child = node.firstChild node.removeChild(child) + frag.appendChild(child) for instance in obj: - newnode = frag.clone(True) - node.appendChild(newnode) - process(newnode, instance, clean) - if clean: - _clean(newnode) + if instance is not None: + newnode = frag.cloneNode(True) + node.appendChild(newnode) + process(newnode, instance, clean) + if clean: + _clean(newnode) # remove all the tags + children_to_remove = [] for child in node.childNodes: - if child.name == 'temporary-fragment': - for child2 in child.childNodes: + if isinstance(child, xml.dom.minidom.Element) and child.tagName == 'temporary-fragment': + while not child.firstChild is None: + child2 = child.firstChild + child.removeChild(child2) node.appendChild(child2) - node.removeChild(child) + children_to_remove.append(child) + + for child in children_to_remove: + node.removeChild(child) if clean: _clean(node) def alternate(tag, array, *elems): + i = 0 + for ref in array: + if ref is not None: + ref[tag] = elems[i % len(elems)] + i = i + 1 + return array def _clean(node): - pass + if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.namespaceURI == "http://template.sesse.net/": + # as this is a dummy node, we want to remove it and move everything further up + # after we've done any required replacements + doc = _get_document_element(node) + parent = node.parentNode + + while not node.firstChild is None: + child = node.firstChild + node.removeChild(child) + parent.insertBefore(child, node) + + parent.removeChild(node) # ugh def _get_document_element(node):