Logo Search packages:      
Sourcecode: caribou version File versions  Download package

fix_gir.py

#!/usr/bin/python

from xml.dom import minidom

def purge_white_space_and_fix_namespace(node, indent=0):
    if getattr(node, "tagName", None) == "namespace":
        name = node.getAttribute("name")
        node.setAttribute("name", name.lstrip('_'))
    for child in [c for c in node.childNodes]:
        if child.nodeType == node.TEXT_NODE or \
                getattr(child, "tagName", None) == "annotation":
            node.removeChild(child)
            continue
        purge_white_space_and_fix_namespace(child, indent+1)

def find_ancestor(node, name):
    if getattr(node, "tagName", None) == name:
        return node
    parent = getattr(node, "parentNode", None)
    if not parent:
        return None
    return find_ancestor(parent, name)

def fix_vfuncs(dom):
    for f in dom.getElementsByTagName("field"):
        callbacks = f.getElementsByTagName("callback")

        record = find_ancestor(f, "record")
        if not record:
            continue

        name = record.getAttribute("name")
        cname = record.getAttribute("c:type")

        assert(name.endswith("Class") or name.endswith("Iface"))
        assert(cname.endswith("Class") or name.endswith("Iface"))

        if len(callbacks) == 2:
            callbacks[-1].parentNode.removeChild(callbacks[-1])

if __name__ == "__main__":
    import sys

    if len(sys.argv) != 2:
        print "supply a gir file"
        sys.exit(1)

    dom = minidom.parse(sys.argv[-1])

    purge_white_space_and_fix_namespace(dom)
    fix_vfuncs(dom)

    print dom.toprettyxml(indent=" ", newl="\n")

Generated by  Doxygen 1.6.0   Back to index