f69c444d45fb6926c78506fcfed887ba3d226490
[gnome.introspection-doc-generator] / JSDOC / RooFile.js
1 //<script type="text/javscript">
2
3 XObject = imports.XObject.XObject;
4 console     = imports.console.console;
5 Collapse = imports.Collapse.Collapse;
6 /**
7  * 
8  * this takes our collased file, and turns it into the config array..
9  * 
10  * @see rconv.js (our tester file)
11  * 
12  * STATUS:
13  *
14  *  - Pman.Tab.* appears to work.
15  * .. next up ..Dialog...
16  * 
17  */
18
19 RooFile  =  XObject.define(
20     function (ar)
21     {
22         RooFile.superclass.constructor.call(this, ar);
23        // console.log("STARTING OUTPUT");
24         
25          
26
27     },
28     Collapse, 
29     {
30         
31         cfg : { },
32
33         parse: function()
34         {
35             // standard pman dialog
36             if (this.tokens[0].data == 'Pman.on') {
37                 this.parsePmanLayout();
38                 return;
39             }
40          
41             
42             // Standard Pman Dialog - 
43             if (this.tokens[2].props && typeof(this.tokens[2].props.create) != 'undefined') {
44                 this.parsePmanDialog();
45                 return;
46             }
47             
48             
49             // Seed Gtk XObject application. 
50             if (this.tokens.length > 2 && this.tokens[2].data.match(/^imports\./)) {
51                 this.parseXObject();
52                 return;
53             }
54             
55             Seed.print("Unknown format");
56             Seed.print(JSON.stringify(this.tokens,null,4));
57             Seed.quit();
58             
59             
60             
61             // perfect for dialogs...
62             
63             
64             var pos = this.lookFor( 'function');
65             
66             // XXXXX = function(
67             var cfg = {};
68             
69             if (pos > -1 && (this.tokens[pos-1].data == '=') && (this.tokens[pos-2].type == 'NAME')) {
70                 
71                 this.cfg = {
72                     '*class' : this.tokens[pos-2].data,
73                     '*extends' : '',
74                     '//constructor' :  this.tokens[pos-2].prefix,
75                     '|constructor' : 'function ' + this.tokens[pos+1].toRaw() + 
76                             this.tokens[pos+2].toRaw()
77                     
78                 };
79                 this.cursor = pos+2;
80                 
81             }
82             
83             if (pos < 0) {
84                 // no function - we have a static one...
85                 pos = this.lookFor( '=');
86                 if (pos > 1 && 
87                     (this.tokens[pos-1].type == 'NAME') &&
88                     (this.tokens[pos+1].data == '{')
89                 ) {
90                     this.cfg = {
91                         '*class' : this.tokens[pos-1].data,
92                         '//*class' :  this.tokens[pos-1].prefix
93                         
94                         
95                     };
96                     XObject.extend(this.cfg, this.parseProps(this.tokens[pos+1].props));
97                     return;
98                     
99                 }
100                 
101                 
102                 
103             }
104             
105             
106               // Roo.apply (l
107             var pos = this.lookFor( 'Roo.apply');
108             //console.dump(this.tokens);
109             
110             
111             if (
112                 (pos > -1) &&
113                 (this.tokens[pos+1].items[0][0].data  == this.cfg['*class'] + '.prototype')
114             ) {
115                 // XXXXXx.prototype = {
116                 
117                 
118                     
119                 XObject.extend(this.cfg, this.parseProps(this.tokens[pos+1].items[1][0].props));
120                 return;
121                 
122             }
123             
124             
125             var pos = this.lookFor('new');
126             
127             if (pos > -1 && 
128                 (this.tokens[pos-2].type == 'NAME') &&
129                 (this.tokens[pos-1].data == '=') && 
130                 (this.tokens[pos+1].type == 'NAME') &&
131                 (this.tokens[pos+2].data == '(') 
132             ) {
133                 
134                 this.cfg = {
135                     '//*class' : this.tokens[pos-2].prefix,
136                     '*class' : this.tokens[pos-2].data,
137                     '*extends' : this.tokens[pos+1].data
138                 };
139                     
140                 XObject.extend(this.cfg, this.parseProps(this.tokens[pos+2].items[0][0].props));
141                 
142                 return;
143                 
144             }
145             
146             ///Builder.Provider.ProjectManager = new Roo.Observable({
147                 
148             
149             
150             var pos = this.lookFor( 'Roo.extend');
151             if (pos > -1) {
152                 
153                 this.cfg['*extends'] = this.tokens[pos+1].items[1][0].data;
154                 XObject.extend(this.cfg, this.parseProps(this.tokens[pos+1].items[2][0].props));
155                 
156                 // no more..
157                 return;
158             }
159             
160              
161                 
162             var pos = this.lookFor( 'Roo.extend');
163             if (pos > -1) {
164                 
165                 this.cfg['*extends'] = this.tokens[pos+1].items[1][0].data;
166                 XObject.extend(this.cfg, this.parseProps(this.tokens[pos+1].items[2][0].props));
167                 
168                 // no more..
169                 return;
170             }
171             
172             
173             
174             //console.dump(cfg);
175             //Seed.quit();
176             
177             
178             
179             // other type of layout
180           //  console.dump(this.tokens);
181             
182             // this type of file..
183             // xxxx.xxx = function
184             // -> into |constructor..
185             // -> extend + prototype
186              
187             
188             
189                 
190         },
191         
192         
193         parsePmanLayout : function()
194         {
195                 // then it's a layout style..
196             
197             //Seed.quit();
198             
199             
200             //console.dump(this.tokens);
201             //              the list of statements inside of function..?
202             
203             
204             var stmts =  this.tokens[1].items[1][2].items;
205             
206             // look for register..
207             var topp = false;
208             stmts.map( function(s, i) {
209                 if (s[0].data == 'Pman.register') {
210                     topp = brace = s[1].items[0][0].props;
211                 }
212             });
213             if (!topp) {
214                 console.dump(this.tokens);
215                 throw "could not find top props...";
216                 
217             }
218             
219             this.cfg = this.parseProps(topp);
220             this.cfg.name = this.tokens[3].data;
221             
222             
223             //                  (            {          add    { this.panel (  {
224             var cfg = this.tokens[7].items[0][0].props.add.val[2].items[2][3].items[0][0].props;
225             this.cfg.items = [ this.parseProps(cfg) ];
226             //console.dump(this.cfg); 
227         },
228         
229         
230         parsePmanDialog : function() {
231             
232             //console.dump(this.tokens);
233             this.cfg.name = this.tokens[0].data;
234             
235             
236             
237             var cfg = this.tokens[2].props.create.val[2].items[1][3].items[0][0].props;
238             //console.dump(this.tokens);
239             //print(JSON.stringify(cfg,null,4)); Seed.quit();
240             
241            // print("Trying standard dialog");Seed.quit();;
242             
243             this.cfg.items = [ this.parseProps(cfg) ];
244             return;
245             
246         },
247         
248         // Seed xobject file.
249         parseXObject : function() {
250             
251             this.parseImports();
252             print(JSON.stringify(this.imports,null,4));
253             print(JSON.stringify(this.giImports,null,4));
254              
255             var pos = this.lookFor('XObject');
256             if (pos < 0)  {
257                 throw "Can not find XObject";
258             }
259             this.cfg.name = this.tokens[pos-3].data;
260             
261             var cfg = this.tokens[pos+1].items[0][0].props;
262             this.cfg.items = [ this.parseProps(cfg) ];
263             
264             //print(JSON.stringify(this.tokens[pos]));
265             
266             //print(JSON.stringify(this.tokens,null,4)); Seed.quit();
267             //Seed.quit();
268             
269         },
270         
271         
272         
273         /**
274          *  parse Imports lines.
275          *
276          */
277         
278         parseImports : function()
279         {
280            // console.dump(this.tokens);
281             this.giImports = [];
282             this.imports= [];
283             while (true) {
284                 var pos = this.lookFor('=');
285                 if (pos < 0)  {
286                     break;
287                 }
288                 this.cursor = pos;
289                 var k = this.look(-1, true);
290                 var v = this.look(1, true);
291                // Seed.print(k.data + " => " + v.data);
292                
293                 /// finish!!! - not an import ...
294                
295                 if (!v.data.match(/^imports/)) {
296                     return; ///
297                     
298                     this.cursor++;
299                     continue;
300                 }
301                 if (v.data.match(/^imports\.gi/)) {
302                     // gi import..
303                     this.giImports.push(v.data.replace(/imports\.gi\./, ''));
304                     
305                     this.cursor++;
306                     continue;
307                 }
308                   
309                 // two types of import left
310                 // imports.xnew
311                 if (v.data.match(/^imports\./)) {
312                     this.imports[k.data] = v.data.replace(/imports\./, '') + '.js';
313                     this.cursor++;
314                     continue;
315                 }
316                 // imports[.....]
317                 this.cursor++;
318                 if (this.lookFor('[') > this.lookFor('=')) {
319                     continue;
320                 }
321                 var bpos = this.lookFor('[');
322                // console.dump(this.tokens[bpos]);
323                 
324                 this.imports[k.data] = this.tokens[bpos].items[0][0].toJS();
325                 
326                 this.cursor++;
327                 
328             }
329         //    console.dump(this.giImports);
330           //  console.dump(this.imports);
331             //Seed.quit();
332             
333         },
334         
335         ///------------------- GENERIC PARSING ------------------
336         
337         
338         
339         
340         
341         
342         parseProps:  function(o)
343         {
344             //print(JSON.stringify(o,null,4));
345             
346             var ret = { };
347             var fakeItems =  [];
348             for(var k in o) {
349                 
350                 //print( "parsing prop: " + k);
351                 if (o[k].key.data == '}') {
352                     // typo trailing comma in object def.
353                     continue;
354                 }
355                 
356                 var kv = k;
357                 if (o[k].key.type == 'STRN') {
358                     kv = o[k].key.toJS();
359                 }
360                 if (!o[k].val.length) {
361                     console.dump(o[k]);
362                 }
363                 
364                 //console.dump(o[k]);
365                 if (o[k].val[0].data == "function") {
366                     // add comments..
367                   //   console.dump(o[k].key.prefix); 
368                     var pr = typeof(o[k].key.prefix) == 'undefined' ? '' : o[k].key.prefix ;
369                     pr = this.clean_prefix( pr) ;
370                     if (pr.length) {
371                         ret['//' +kv ] =  pr;
372                     }
373                     //print("running expand");
374                     ret['|' +kv ] =  this.clean_body( this.expand(o[k].val));
375                     continue;
376                 }
377                 
378                 
379                 if (o[k].val[0].data == "[") {
380                     
381                     if (o[k].val[0].items[0][0].data == '{') {
382                         // array of objects..
383                         
384                         // this works for items..
385                         
386                         // used elsewhere for buttons: -> in which case we have a fake xtype
387                         
388                         
389                         
390                         // if K is not ITEMS - we need to add '*prop' -> and add it to the items array..
391                         var add = this.parseArray(o[k].val[0].items);
392                         if (kv == 'items') {
393                             ret[kv] = add;
394                             continue;
395                         }
396                         var fake_array = {
397                             xtype : 'Array.' + kv,
398                             '*prop' : kv,
399                             items : add
400                         }
401                         fakeItems.push(fake_array);
402                         continue;
403                     } 
404                     // raw array 
405                     
406                     
407                     ret['|' +kv ] =  this.clean_body(this.expand(o[k].val)); // remove ','...
408                     continue;
409                 }
410                 if (o[k].val[0].data == "(") {
411                     ret['|' +kv ] =  this.expand(o[k].val);
412                     continue;
413                 }
414                 // value is an object..
415                 
416                 if (o[k].val[0].data == "{") {
417                     
418                     // things that can be property of object type:
419                     // listeners, set, 
420                     var add = this.parseProps(o[k].val[0].props);
421                     
422                     
423                     
424                     if (kv == 'set' || kv =='listeners') {
425                         ret[kv ] = add;
426                         continue;
427                     }
428                     if ((typeof(add.xtype) != 'undefined') ||  ['sortInfo', 'center', 'east', 'west', 'north', 'south'].indexOf(kv) > -1) {
429                         add['*prop'] =  kv;
430                         fakeItems.push(add);
431                         continue;
432                     }
433                     
434                     
435                     ret[ '|' + kv ] =  this.expand(o[k].val);
436                     
437                     
438                     // this hsould be added to 'items', with a *prop element..
439                     continue;
440                 }
441                 //console.dump(o[k].val);
442                 
443                 if (o[k].val[1].data == ',' || o[k].val[1].data == '}') {
444                     // single item piece of data...
445                     var t1= o[k].val[0];
446                     switch(o[k].val[0].type) {
447                         case 'STRN':
448                         case 'NUMB':
449                         case 'KEYW':
450                             ret[  kv ]  = t1.toJS();
451                             continue;
452                         case 'NAME':
453                             ret[ '|' + kv ] =  t1.data;
454                             continue;
455                         
456                     }
457                 }
458                
459                 ret[ '|' + kv ] =  this.expand(o[k].val);
460                 
461             }
462             if (!ret.items && fakeItems.length) {
463                 ret.items = [];
464             }
465             fakeItems.forEach(  function(e) {
466                 ret.items.push(e);
467             });
468             // merge fakeItems;
469             //console.dump(ret);
470             
471             return ret;
472         },
473         parseArray: function(ar) {
474           // console.dump(ar);
475            // Seed.quit();
476             var ret = [];
477             ar.map(function (e) {
478                 // has no props...
479                 if (typeof(e[0].props) == 'undefined') {
480                     return;
481                 }
482                
483                 
484                 ret.push( this.parseProps(e[0].props));
485                      
486             },this);
487              
488             return ret;
489           
490         },
491         
492         
493         expand: function(ar)
494         {
495             var ret = '';
496             //print(JSON.stringify(ar,null,4));
497             
498             for(var i =0 ; i < ar.length -1; i++) {
499                 ret += ar[i].toRaw();
500             }
501             
502             return ret;
503             
504             
505         },
506         clean_body : function(str)
507         {
508             var lns = str.split("\n");
509             var mindent = -1;
510             lns.map( function(l, i) {
511                 if (!i || !l.length || l.match(/^\s+$/)) {
512                     return;
513                 }
514                 
515                 var spc = l.match(/\s+/);
516                 if (!spc || !spc[0].length) {
517                     return;
518                 }
519                 mindent = mindent < 0 ? spc[0].length : Math.min(spc[0].length, mindent);
520                 
521             });
522             //console.log(mindent + ":" + lns[0]);
523             var ar = [];
524             if (mindent < 0) {
525                 return str;
526             }
527             lns.map( function(l,i) {
528                 if (!i) {
529                     ar.push(l.replace(/^\s+/, ''));
530                     return;
531                 }
532                 ar.push(l.substring(mindent));
533             });
534             return ar.join("\n");
535         },
536         clean_prefix: function(str) {
537             
538             
539             
540             if (!str.length) {
541                 return '';
542             }
543             var ret = str.replace(/^\s+/gm, "\n").replace(/\n+/gm, "\n");
544             return ret == "\n" ? '' : ret;
545             
546         }    
547              
548     
549 });