JSDOC/Collapse.js
[gnome.introspection-doc-generator] / JSDOC / Collapse.js
1 //<script type="text/javscript">
2 XObject = imports.XObject.XObject;
3
4  
5 console     = imports.console.console; 
6
7 // make sure parent is loaded..
8 TokenStream = imports.TokenStream.TokenStream;
9 /**
10  * 
11  * base class for parsing segments of token array..
12  * 
13  * 
14  * We want to make parsing the whole thing easy..
15  * 
16  * so we do various tricks:
17  * 
18  * 
19  * a) white space collased
20  *    wsPrefix 
21  * b)  toks
22  *     { } - collapse into first element.
23        ( ) - collapse into first element.
24        [ ] - collapse into first element.
25  * c) items = , seperation within the above..
26  * 
27  * usage: x = new Collapse(token_array)
28  * 
29  * 
30  * 
31  * 
32  */ 
33  
34 Collapse = XObject.define(
35     function (ar)
36     {
37          
38         Collapse.superclass.constructor.call(this, ar);
39         
40         this.spaces();
41         var ar = this.collapse(this.tokens);
42         
43         this.tokens = ar;
44         
45        // console.dump(ar);
46         
47     }, 
48     TokenStream, 
49     {
50     
51         spaces : function () {
52             var ar = [];
53             var pref = [];
54             
55             var tok;
56             
57             for (var i = 0; i < this.tokens.length; i ++) {
58                 tok = this.tokens[i];
59                 if (tok.is("COMM") || tok.is("WHIT")) {
60                     pref.push(tok);
61                     continue;
62                 }
63                 tok.prefix = '';
64                 if (pref.length) {
65                     pref.forEach( function(e) {
66                         if (!e) {
67                             return;
68                         }
69                         tok.prefix += e.data;
70                     })
71                 }
72                 
73                 ar.push(tok);
74                 pref=  [];
75                 
76             }
77             this.tokens = ar;
78             
79         },
80         collapse : function(ar) {
81             
82             var st = new  TokenStream(ar);
83             var ret = [];
84             
85             while (true) {
86                 var  tok = st.look(1,true);
87                 if (!tok || !tok.is) {
88                   //  Seed.print(TokenStream.toString(ret));
89                     return ret;
90                 }
91                  console.log(tok.data);
92                 switch(tok.type) {
93                     case "VOID": 
94                         return; //EOF
95                         
96                         
97                     case "KEYW": 
98                     case "TOKN":
99                     case "NAME":
100                     case "STRN":
101                     case "NUMB":
102                     case "REGX":
103                         ret.push(st.next(1));
104                         continue;
105                         
106                     case "PUNC":
107                         switch (tok.data) {
108                             case "[":
109                             case "{":
110                             case "(":
111                                 
112                                 var start = st.cursor;
113                                 st.next(1);
114                                 var add = st.balance(tok.data);
115                                 if (!add) {
116                                     console.dump(tok);
117                                     console.dump(start + '...' + st.cursor);
118                                     console.dump(st.tokens);
119                                  
120                                 }
121                                 if (add) {
122                                     add.shift();
123                                 }
124                                 Seed.print("ADD");
125                                 Seed.print(JSON.stringify(add, null,4));
126                                 
127                                 
128                                 
129                                 var toks = add ? this.collapse(add) : [];
130                                 tok.items = false;
131                                 tok.props = false;
132                                 
133                                 if (tok.data != '{') {
134                                     // paramters or array elements..
135                                     tok.items = this.toItems(toks, [',']);
136                                 } else {
137                                     // check for types.. it could be a list of statements.. or object
138                                     
139                                     var ost = new  TokenStream(toks);
140                                     //console.dump(ost.look(2,true) );
141                                     if (ost.look(2,true) && ost.look(2,true).data == ":") {
142                                         tok.props = this.toProps(toks);
143                                     } else {
144                                         // list of statemetns..
145                                         tok.items = this.toItems(toks,[ ';', '{'] );;
146                                     }
147                                     
148                                     
149                                 }
150                                  
151                                 
152                                 
153                                 
154                                 
155                                 
156                                 
157                                 //Seed.print(" ADD : " + add.length  +  " ITEMS: " + tok.items.length);
158                                 
159                                 ret.push(tok);
160                                 
161                                 continue;
162                    
163                             default:
164                                 ret.push(st.next(1));
165                                 continue;
166                         }
167                         Seed.print("OOPS");
168                         continue;
169                     default : 
170                         Seed.print("OOPS" + tok.type);
171                         continue;
172                 }
173             }
174                 
175                 
176             
177             
178             
179             
180             
181             
182             
183             
184         },
185         toItems : function(ar,sep)
186         {
187             var ret = [];
188             var g = [];
189               
190             for (var i = 0; i < ar.length; i ++) {
191                 if (sep.indexOf(ar[i].data) < 0) {
192                     g.push(ar[i]);
193                     continue;
194                 }
195                 g.push(ar[i]);
196                 ret.push(g);
197                 g = [];
198                 
199             }
200             // last..
201             if (g.length) {
202                 ret.push(g);
203             }
204             return ret;
205             
206         },
207         toProps : function(ar)
208         {
209             
210             var ret = { }
211                
212             var g = { key : '', val: [] }
213                
214             
215             var k = '';
216             var state = 0;
217             for (var i = 0; i < ar.length; i ++) {
218                 
219                 switch(state) {
220                     case 0:
221                         k = ar[i].data;
222                         g.key = ar[i];
223                         state = 1;
224                         continue;
225                     case 1:
226                         state =2; // should be ':'
227                         continue;
228                     case 2:
229                         g.val.push(ar[i]);
230                         if (ar[i].data != ',') {
231                             continue;
232                         }
233                         ret[k] = g;
234                         g = { key : '', val: [] }
235                         state = 0;
236                         continue;
237                    
238                 }
239             }
240              // last..
241             if (k.length) {
242                 ret[k] = g;
243             }
244             return ret;
245             
246             
247         }
248
249     
250     
251 });