2 // valac --pkg libxml-2.0 --pkg gee-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");
12 public class GirObject: Object {
15 public string nodetype;
16 public GirObject paramset;
17 public string package;
18 public GirObject return_value = null;
19 public bool is_instance;
21 public bool is_varargs;
25 public Gee.HashMap<string,GirObject> params;
26 public GLib.List<string> implements;
27 public GLib.List<GirObject> ctors;
28 public Gee.HashMap<string,GirObject> methods;
29 public Gee.HashMap<string,string> includes;
30 public Gee.HashMap<string,GirObject> classes;
31 public Gee.HashMap<string,GirObject> props;
32 public Gee.HashMap<string,GirObject> consts;
33 public Gee.HashMap<string,GirObject> signals;
35 public GirObject(string nodetype, string n) {
36 this.nodetype = nodetype;
40 this.is_array = false;
41 this.is_instance = false;
42 this.is_varargs = false;
43 this.implements = new GLib.List<string>();
44 this.includes = new Gee.HashMap<string,string>();
46 this.params = new Gee.HashMap<string,GirObject>();
47 this.ctors = new Gee.HashMap<string,GirObject>();
48 this.methods =new Gee.HashMap<string,GirObject>();
50 this.classes = new Gee.HashMap<string,GirObject>();
51 this.props = new Gee.HashMap<string,GirObject>();
52 this.consts = new Gee.HashMap<string,GirObject>();
53 this.signals = new Gee.HashMap<string,GirObject>();
55 public JSON.Object toJSON()
57 var r = new JSON.Object();
58 r.set_string_member("nodetype", this.nodetype);
59 r.set_string_member("name", this.name);
60 // is_arary / is_instance / is_varargs..
62 if (this.implements.length() > 0) {
63 r.set_object_member("length", this.toJSONArrayString(this.implements));
66 if (this.params.size > 0) {
67 r.set_object_member("params", this.toJSONObject(this.params));
69 if (this.ctors.size > 0) {
70 r.set_object_member("ctors", this.toJSONObject(this.ctors));
72 if (this.methods.size > 0) {
73 r.set_object_member("methods", this.toJSONObject(this.methods));
75 if (this.includes.size > 0) {
76 r.set_object_member("includes", this.toJSONObjectString(this.includes));
78 if (this.classes.size > 0) {
79 r.set_object_member("classes", this.toJSONObject(this.classes));
81 if (this.props.size > 0) {
82 r.set_object_member("props", this.toJSONObject(this.props));
84 if (this.consts.size > 0) {
85 r.set_object_member("consts", this.toJSONObject(this.consts));
87 if (this.signals.size > 0) {
88 r.set_object_member("cosignalsnsts", this.toJSONObject(this.signals));
92 public JSONObject(Gee.HashMap<string,GirObject> map)
94 var r = new JSON.Object();
95 var iter = map.map_iterator();
97 r.set_object_member(iter.get_key(), iter.get_value().toJSON());
109 public class Gir : GirObject {
111 public string package;
114 //Gee.Hashmap<string,what> nodes;
116 public Gir (string file)
118 base("Package",file);
119 //this.nodes = new Gee.Hashmap<string,what>();
121 var doc = Xml.Parser.parse_file (file);
122 var root = doc->get_root_element();
123 this.walk( root, (GirObject) this );
127 public void walk(Xml.Node* element, GirObject? parent)
129 var n = element->get_prop("name");
133 print(element->name + " (" + parent.name + "==>" + n +")\n");
134 switch (element->name) {
139 parent.includes.set(n, element->get_prop("version"));
155 //break; // not handled..
158 var c = new GirObject("Class", parent.name + "." + n);
159 parent.classes.set(parent.name + "." + n, c);
160 c.parent = element->get_prop("parent");
165 var c = new GirObject("Interface", parent.name + "." + n);
166 parent.classes.set(parent.name + "." + n, c);
167 c.parent = element->get_prop("parent");
173 parent.doc = element->get_content();
177 parent.implements.append(n);
181 var c = new GirObject("Ctor",n);
182 parent.ctors.set(n,c);
187 var c = new GirObject("Return", "return-value");
188 parent.return_value = c;
192 case "virtual-method": // not sure...
195 var c = new GirObject("Signal",n);
196 parent.signals.set(n,c);
200 case "signal": // Glib:signal
201 var c = new GirObject("Signal",n);
202 parent.signals.set(n,c);
208 case "callback": // not sure...
214 return; // no children?
218 var c = new GirObject("Method",n);
219 parent.methods.set(n,c);
224 var c = new GirObject("Paramset",n);
229 case "instance-parameter":
230 var c = new GirObject("Param",n);
231 c.is_instance = true;
232 parent.params.set(n,c);
237 var c = new GirObject("Param",n);
238 parent.params.set(n,c);
244 var c = new GirObject("Prop",n);
245 parent.props.set(n,c);
250 var c = new GirObject("Function",n);
251 parent.methods.set(n,c);
256 parent.is_array = true;
257 break; // type is added soon..
260 parent.is_varargs= true;
264 var c = new GirObject("Const",n);
265 c.value = element->get_prop("value");
266 parent.consts.set(n,c);
272 var c = new GirObject("Enum",n);
273 parent.consts.set(n,c);
278 var c = new GirObject("EnumMember",n);
279 c.value = element->get_prop("value");
280 parent.consts.set(n,c);
285 case "doc-deprecated":
288 case "record": // struct?
290 case "bitfield": // ignore?
292 case "prerequisite": // ignore?
295 print("UNHANDLED" + element->name +"\n");
299 if (element->name == "signal") {
304 if (element->name == "return-value") {
305 path += ".return-value";
307 print(path + ":" + element->name + "\n");
309 //var d = getAttribute(element,'doc');
311 // Seed.print(path + ':' + d);
314 for (Xml.Node* iter = element->children; iter != null; iter = iter->next) {
315 if (iter->type == Xml.ElementType.TEXT_NODE) {
318 this.walk(iter, parent);