Add a simplistic gidl writer, which can't do too much.
authorJohan Dahlin <jdahlin@async.com.br>
Fri, 18 Apr 2008 20:37:51 +0000 (20:37 +0000)
committerJohan Dahlin <johan@src.gnome.org>
Fri, 18 Apr 2008 20:37:51 +0000 (20:37 +0000)
2008-04-18  Johan Dahlin  <jdahlin@async.com.br>

    * giscanner/gidlwriter.py:
    * giscanner/xmlwriter.py:
    * tools/g-ir-scanner:
    Add a simplistic gidl writer, which can't do too much.

svn path=/trunk/; revision=175

ChangeLog
giscanner/gidlwriter.py [new file with mode: 0644]
giscanner/xmlwriter.py [new file with mode: 0644]
tools/g-ir-scanner

index 3717590..9b2606c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-04-18  Johan Dahlin  <jdahlin@async.com.br>
+
+       * giscanner/gidlwriter.py:
+       * giscanner/xmlwriter.py:
+       * tools/g-ir-scanner:
+       Add a simplistic gidl writer, which can't do too much.
+
 2008-04-18  Johan Dahlin  <johan@gnome.org>
 
        * giscanner/sourcescanner.py:
diff --git a/giscanner/gidlwriter.py b/giscanner/gidlwriter.py
new file mode 100644 (file)
index 0000000..42f2569
--- /dev/null
@@ -0,0 +1,48 @@
+from giscanner.treebuilder import Function
+from giscanner.xmlwriter import XMLWriter
+
+
+class GIDLWriter(XMLWriter):
+    def __init__(self, namespace, nodes):
+        super(GIDLWriter, self).__init__()
+        self._write_api(namespace, nodes)
+
+    def _write_api(self, namespace, nodes):
+        self.push_tag('api', [('version', '1.0')])
+        self._write_namespace(namespace, nodes)
+        self.pop_tag()
+
+    def _write_namespace(self, namespace, nodes):
+        self.push_tag('namespace')
+        for node in nodes:
+            self._write_node(node)
+        self.pop_tag()
+
+    def _write_node(self, node):
+        if isinstance(node, Function):
+            self._write_function(node)
+        else:
+            print 'Unhandled node', node
+
+    def _write_function(self, func):
+        self.push_tag('function')
+        self._write_return_type(func.retval)
+        self._write_parameters(func.parameters)
+        self.pop_tag()
+
+    def _write_return_type(self, return_):
+        if not return_:
+            return
+        self.write_tag('return-type', [('type', return_.type)])
+
+    def _write_parameters(self, parameters):
+        if not parameters:
+            return
+        self.push_tag('parameters')
+        for parameter in parameters:
+            self._write_parameter(parameter)
+        self.pop_tag()
+
+    def _write_parameter(self, parameter):
+        self.write_tag('parameter', [('name', parameter.name),
+                                     ('type', parameter.type)])
diff --git a/giscanner/xmlwriter.py b/giscanner/xmlwriter.py
new file mode 100644 (file)
index 0000000..2f80603
--- /dev/null
@@ -0,0 +1,55 @@
+from cStringIO import StringIO
+from xml.sax.saxutils import quoteattr
+
+
+class XMLWriter(object):
+    def __init__(self):
+        self._data = StringIO()
+        self._tag_stack = []
+        self._indent = 0
+
+    # Private
+
+    def _collect_attributes(self, attributes):
+        attrValue = ''
+        if attributes:
+            for attr, value in attributes:
+                assert value is not None, attr
+                attrValue += ' %s=%s' % (attr, quoteattr(value))
+        return attrValue
+
+    def _open_tag(self, tag_name, attributes=None):
+        attrs = self._collect_attributes(attributes)
+        self.write_line('<%s%s>' % (tag_name, attrs))
+
+    def _close_tag(self, tag_name):
+        self.write_line('</%s>' % (tag_name,))
+
+    # Public API
+
+    def get_xml(self):
+        return self._data.getvalue()
+
+    def write_line(self, line=''):
+        self._data.write('%s%s\n' % (' ' * self._indent, line))
+
+    def write_tag(self, tag_name, attributes):
+        attrs = self._collect_attributes(attributes)
+        self.write_line('<%s%s/>' % (tag_name, attrs))
+
+    def write_tag_with_data(self, tag_name, data, attributes=None):
+        if data is None:
+            self.write_tag(tag_name, attributes)
+        attrs = self._collect_attributes(attributes)
+        self.write_line('<%s%s>%s</%s>' % (tag_name, attrs, data, tag_name))
+
+    def push_tag(self, tag_name, attributes=None):
+        self._open_tag(tag_name, attributes)
+        self._tag_stack.append(tag_name)
+        self._indent += 2
+
+    def pop_tag(self):
+        self._indent -= 2
+        tag_name = self._tag_stack.pop()
+        self._close_tag(tag_name)
+        return tag_name
index 846b46a..8eb1ba2 100755 (executable)
@@ -4,6 +4,7 @@ import sys
 
 sys.path.insert(0, '.')
 
+from giscanner.gidlwriter import GIDLWriter
 from giscanner.sourcescanner import SourceScanner
 from giscanner.treebuilder import TreeBuilder
 
@@ -44,8 +45,8 @@ def main(args):
     ss.parse_macros()
 
     builder = TreeBuilder(ss)
-    import pprint
-    pprint.pprint(list(builder.get_nodes()))
+    writer = GIDLWriter('Foo', builder.get_nodes())
+    print writer.get_xml()
 
 
 sys.exit(main(sys.argv))