1 //<Script type="text/javascript">
4 GIRepository = imports.gi.GIRepository;
6 console = imports.console;
7 XObject = imports.XObject.XObject;
9 Base = imports.Builder.Provider.Palete.Base.Base;
10 File = imports.File.File;
11 //----------------------- our roo verison
20 // various loader methods..
35 var data = File.read(__script_path__ +'/../GtkUsage.txt');
37 data = data.split(/\n/g);
43 data.forEach( function(d) {
44 if (!d.length || d.match(/^\s+$/) || d.match(/^\//)) { //empty
47 if (d.match(/^left:/)) {
60 if (d.match(/^right:/)) {
65 left.push(d.replace(/\s+/g, ''));
68 right.push(d.replace(/\s+/g, ''));
84 commentLoad : function(ns)
87 if (typeof(this.comments[ns]) != 'undefined') {
91 console.log("LOAD DOCS: " + ns);
92 var gi = GIRepository.IRepository.get_default();
93 var ver = gi.get_version(ns);
95 this.comments[ns] = {};
100 // no idea why this is broken on my build system.
101 function getAttribute(n, name){
102 var properties = n.properties;
104 if (properties.name == name)
105 return properties.children.content;
106 properties = properties.next
112 function walk(element, path) {
119 var n = getAttribute(element, 'name') ;
120 //console.log("WALK" + n);
122 path += path.length ? '.' : '';
125 if (element.name == 'return-value') {
126 path += '.return-value';
129 if (element.name == 'signal') {
133 var d = getAttribute(element,'doc');
135 // Seed.print(path + ':' + d);
139 var child = element.children;
142 //console.log(child.tag);
143 if (child.type == "element"){
150 var pth = GIRepository.IRepository.get_search_path ();
153 var gir_path = pth[0].replace(/lib\/girepository-1.0/, 'share\/gir-1.0');
157 var fn = gir_path + '/'+ ns + '-' + ver + '.gir';
160 if (!File.exists(fn)) {
161 console.log('missing docc file ' + fn);
162 this.comments[ns] = {};
166 var doc = xml.parseFile(fn);
167 //console.log("xmldoc?" + doc);
170 this.comments[ns] = ret;
175 doc : function(what) {
176 var ns = what.split('.').shift();
177 this.commentLoad(ns);
178 return typeof(this.comments[ns][what]) == 'undefined' ? '' : this.comments[ns][what];
181 getPropertiesFor: function(ename, type)
183 print("Loading for " + ename);
185 if (typeof(this.proplist[ename]) != 'undefined') {
186 return this.proplist[ename][type];
188 // use introspection to get lists..
189 var gi = GIRepository.IRepository.get_default();
190 var es = ename.split('.');
191 var bi = gi.find_by_name(es[0], es[1]);
194 print("COULND NOT FIND BY NAME");
197 var etype = GIRepository.base_info_get_type(bi);
198 var meth = etype == GIRepository.IInfoType.INTERFACE ?
200 'interface_info_get_n_properties',
201 'interface_info_get_property',
202 'interface_info_get_n_signals',
203 'interface_info_get_signal'
205 'object_info_get_n_properties',
206 'object_info_get_property',
207 'object_info_get_n_signals',
208 'object_info_get_signal'
212 this.proplist[ename] = {}
213 this.proplist[ename]['props'] = [];
214 this.proplist[ename]['events'] = [];
215 this.proplist[ename]['inherits']= [];
216 var plist = this.proplist[ename]['props'] ;
217 var elist = this.proplist[ename]['events'];
218 var ilist = this.proplist[ename]['inherits'];
225 function typeToName (type_info) {
226 var ty = GIRepository.type_tag_to_string( GIRepository.type_info_get_tag(type_info));
228 if ((ty == 'void') && GIRepository.type_info_is_pointer(type_info)) {
232 return false; // unspported
234 if (ty != 'interface') {
238 // we can accept enum types here..
239 var interface_info = GIRepository.type_info_get_interface (type_info);
240 var interface_type = GIRepository.base_info_get_type (interface_info);
241 if (interface_type != GIRepository.IInfoType.ENUM) {
244 return GIRepository.base_info_get_namespace(interface_info) + '.' +
245 GIRepository.base_info_get_name(interface_info);
248 // properties.. -- and parent ones...!!!
249 for (var i =0;i < GIRepository[meth[0]](bi); i++) {
250 var prop = GIRepository[meth[1]](bi, i);
251 var n_original = GIRepository.base_info_get_name(prop);
253 var flags = GIRepository.property_info_get_flags(prop); // check for readonly..
256 var ty = typeToName(GIRepository.property_info_get_type(prop));
257 print (n_original +":"+ ty);
262 name : n_original.replace(/\-/g, '_'),
264 desc : this.doc(ename + '.' + n_original),
272 for (var i =0;i < GIRepository[meth[2]](bi); i++) {
273 var prop = GIRepository[meth[3]](bi, i);
274 var n_original = GIRepository.base_info_get_name(prop);
275 print ('signal: ' + n_original);
277 name : n_original.replace(/\-/g, '_'),
278 type : 'function', //???
279 desc : this.doc(ename + '.' + n_original),
285 if (etype == GIRepository.IInfoType.INTERFACE ) {
290 var pi = GIRepository.object_info_get_parent(bi);
295 var pname = GIRepository.base_info_get_namespace(pi) + '.' +
296 GIRepository.base_info_get_name(pi);
297 this.getPropertiesFor(pname, 'props');
299 elist.push.apply(elist,this.proplist[pname]['events']);
300 plist.push.apply(plist,this.proplist[pname]['props']);
301 ilist.push.apply(ilist,this.proplist[pname]['inherits']);
304 // implements needs to be more carefull as it could add dupes..
305 // use the parent implements list to ensure no dupes..
306 for(var i =0; i < GIRepository.object_info_get_n_interfaces(bi); i++) {
308 var prop = GIRepository.object_info_get_interface(bi,i);
309 var iface = GIRepository.base_info_get_namespace(prop) +'.'+
310 GIRepository.base_info_get_name(prop);
311 if ( ilist.indexOf(iface) > -1) {
314 this.getPropertiesFor(iface, 'props');
316 elist.push.apply(elist,this.proplist[iface]['events']);
317 plist.push.apply(plist,this.proplist[iface]['props']);
320 return this.proplist[ename][type];