2 // valac --pkg libxml-2.0 --pkg gee-1.0 --pkg json-glib-1.0 Gir.vala -o /tmp/Gir
3 public static int main (string[] args) {
5 var g = new Palete.Gir("/usr/share/gir-1.0/Gtk-3.0.gir");
6 var generator = new Json.Generator ();
7 generator.set_root(g.toJSON());
9 generator.pretty = true;
11 print(generator.to_data(null));
17 public class GirObject: Object {
20 public string nodetype;
21 public GirObject paramset;
22 public string package;
23 public GirObject return_value = null;
24 public bool is_instance;
26 public bool is_varargs;
30 public Gee.HashMap<string,GirObject> params;
31 public GLib.List<string> implements;
32 public Gee.HashMap<string,GirObject> ctors;
33 public Gee.HashMap<string,GirObject> methods;
34 public Gee.HashMap<string,string> includes;
35 public Gee.HashMap<string,GirObject> classes;
36 public Gee.HashMap<string,GirObject> props;
37 public Gee.HashMap<string,GirObject> consts;
38 public Gee.HashMap<string,GirObject> signals;
40 public GirObject(string nodetype, string n) {
41 this.nodetype = nodetype;
45 this.is_array = false;
46 this.is_instance = false;
47 this.is_varargs = false;
48 this.implements = new GLib.List<string>();
49 this.includes = new Gee.HashMap<string,string>();
51 this.params = new Gee.HashMap<string,GirObject>();
52 this.ctors = new Gee.HashMap<string,GirObject>();
53 this.methods =new Gee.HashMap<string,GirObject>();
55 this.classes = new Gee.HashMap<string,GirObject>();
56 this.props = new Gee.HashMap<string,GirObject>();
57 this.consts = new Gee.HashMap<string,GirObject>();
58 this.signals = new Gee.HashMap<string,GirObject>();
60 public Json.Object toJSON()
62 var r = new Json.Object();
63 r.set_string_member("nodetype", this.nodetype);
64 r.set_string_member("name", this.name);
65 // is_arary / is_instance / is_varargs..
67 if (this.implements.length() > 0) {
68 r.set_array_member("length", this.toJSONArrayString(this.implements));
71 if (this.params.size > 0) {
72 r.set_object_member("params", this.toJSONObject(this.params));
74 if (this.ctors.size > 0) {
75 r.set_object_member("ctors", this.toJSONObject(this.ctors));
77 if (this.methods.size > 0) {
78 r.set_object_member("methods", this.toJSONObject(this.methods));
80 if (this.includes.size > 0) {
81 r.set_object_member("includes", this.toJSONObjectString(this.includes));
83 if (this.classes.size > 0) {
84 r.set_object_member("classes", this.toJSONObject(this.classes));
86 if (this.props.size > 0) {
87 r.set_object_member("props", this.toJSONObject(this.props));
89 if (this.consts.size > 0) {
90 r.set_object_member("consts", this.toJSONObject(this.consts));
92 if (this.signals.size > 0) {
93 r.set_object_member("cosignalsnsts", this.toJSONObject(this.signals));
97 public Json.Object toJSONObject(Gee.HashMap<string,GirObject> map)
99 var r = new Json.Object();
100 var iter = map.map_iterator();
102 r.set_object_member(iter.get_key(), iter.get_value().toJSON());
106 public Json.Object toJSONObjectString(Gee.HashMap<string,string> map)
108 var r = new Json.Object();
109 var iter = map.map_iterator();
111 r.set_string_member(iter.get_key(), iter.get_value());
115 public Json.Array toJSONArrayString(GLib.List<string> map)
117 var r = new Json.Array();
118 for(var i =0;i< map.length();i++) {
120 r.add_string_element(map.nth_data(i));
130 public class Gir : GirObject {
132 public string package;
135 //Gee.Hashmap<string,what> nodes;
137 public Gir (string file)
139 base("Package",file);
140 //this.nodes = new Gee.Hashmap<string,what>();
142 var doc = Xml.Parser.parse_file (file);
143 var root = doc->get_root_element();
144 this.walk( root, (GirObject) this );
148 public void walk(Xml.Node* element, GirObject? parent)
150 var n = element->get_prop("name");
154 print(element->name + " (" + parent.name + "==>" + n +")\n");
155 switch (element->name) {
160 parent.includes.set(n, element->get_prop("version"));
176 //break; // not handled..
179 var c = new GirObject("Class", parent.name + "." + n);
180 parent.classes.set(parent.name + "." + n, c);
181 c.parent = element->get_prop("parent");
186 var c = new GirObject("Interface", parent.name + "." + n);
187 parent.classes.set(parent.name + "." + n, c);
188 c.parent = element->get_prop("parent");
194 parent.doc = element->get_content();
198 parent.implements.append(n);
202 var c = new GirObject("Ctor",n);
203 parent.ctors.set(n,c);
208 var c = new GirObject("Return", "return-value");
209 parent.return_value = c;
213 case "virtual-method": // not sure...
216 var c = new GirObject("Signal",n);
217 parent.signals.set(n,c);
221 case "signal": // Glib:signal
222 var c = new GirObject("Signal",n);
223 parent.signals.set(n,c);
229 case "callback": // not sure...
235 return; // no children?
239 var c = new GirObject("Method",n);
240 parent.methods.set(n,c);
245 var c = new GirObject("Paramset",n);
250 case "instance-parameter":
251 var c = new GirObject("Param",n);
252 c.is_instance = true;
253 parent.params.set(n,c);
258 var c = new GirObject("Param",n);
259 parent.params.set(n,c);
265 var c = new GirObject("Prop",n);
266 parent.props.set(n,c);
271 var c = new GirObject("Function",n);
272 parent.methods.set(n,c);
277 parent.is_array = true;
278 break; // type is added soon..
281 parent.is_varargs= true;
285 var c = new GirObject("Const",n);
286 c.value = element->get_prop("value");
287 parent.consts.set(n,c);
293 var c = new GirObject("Enum",n);
294 parent.consts.set(n,c);
299 var c = new GirObject("EnumMember",n);
300 c.value = element->get_prop("value");
301 parent.consts.set(n,c);
306 case "doc-deprecated":
309 case "record": // struct?
311 case "bitfield": // ignore?
313 case "prerequisite": // ignore?
316 print("UNHANDLED" + element->name +"\n");
320 if (element->name == "signal") {
325 if (element->name == "return-value") {
326 path += ".return-value";
328 print(path + ":" + element->name + "\n");
330 //var d = getAttribute(element,'doc');
332 // Seed.print(path + ':' + d);
335 for (Xml.Node* iter = element->children; iter != null; iter = iter->next) {
336 if (iter->type == Xml.ElementType.TEXT_NODE) {
339 this.walk(iter, parent);