Partial Fix #5654 - roojspacker - get it working as a doc tool...
[roojs1] / docs2 / Roo.docs.template.js
1
2
3 Roo.docs.template  = {
4
5     augments : function(data)
6     {
7         if (!data.augments.length) {
8             return '';
9         }
10         var linkSymbol  = this.linkSymbol;
11         var output = '<div class="inheritance res-block"> <pre class="res-block-inner">';
12         
13         var iblock_indent = 0;
14          data.augments.reverse().map(
15             function($) {  
16                 output += iblock_indent ? ('<img src="../images/default/s.gif" height="1" width="' + 
17                     iblock_indent + '"/><img src="../images/default/tree/elbow-end.gif" class="elbow"/>') : '';
18                 output += linkSymbol($) + "\n"; 
19                 iblock_indent += 20;
20             }
21         )
22          
23         return output +  '<img src="../images/default/s.gif" height="1"  width="' +  iblock_indent +'"/>' +
24             '<img class="elbow" src="../images/default/tree/elbow-end.gif"/>'+data.name+
25     
26                '</pre></div>'
27        
28     },
29     
30     config : function(dtag)
31     {
32        
33         var output = '<a name="'+dtag.memberOf+'-cfg-'+dtag.name+'"></a>';
34         output += '<div class="fixedFont"><b  class="itemname"> ' + dtag.name + '</b> : ' +
35             (dtag.type.length ? this.linkSymbol(dtag.type) : "" ) + '</div>';
36               
37         output += '<div class="mdesc"><div class="short">'+this.resolveLinks(this.summarize(dtag.desc))+'</div></div>';
38                 
39         output += '<div class="mdesc"><div class="long">' + this.resolveLinks(dtag.desc)+ ' ' + 
40                         (dtag.values.length ? ("<BR/>Possible Values: " +
41                     dtag.values.map(function(v) {
42                         return v.length ? v : "<B>Empty</B>";
43                     }).join(", ")) : ''
44                 ) + '</div>';
45         return output;
46     },
47     
48     methodsSort : function(data)
49     {
50     
51       
52         var ownMethods = [];
53     
54         if (data.name.length && 
55             !data.isBuiltin && 
56             !data.isSingleton &&
57             !data.isStatic
58             ) {
59             data.isInherited = false;
60             ownMethods.push(data);   // should push ctor???
61         }
62         
63         var msorted = data.methods.sort(this.makeSortby("name"));
64         
65         // static first?
66         
67         msorted.filter(
68             function($){
69                 
70             //if (/@hide/.test($.desc)) { == not needed - done in the backend
71             //    return false;
72             //}
73                 
74             //if (!$.isEvent && (data.comment.getTag("instanceOf").length || data.comment.getTag("singleton").length)) {
75             
76             // not sure if we should just ignore signletons???
77             //if (!data.isSingleton) {
78             //    return true; 
79             //}
80             
81             
82             
83             if (data.isSingleton) {
84              
85                 if ($.isStatic && $.memberOf != data.name) { // it's a singleton - can not inherit static methods.
86                 return true;
87                 }
88             
89                 $.isInherited = ($.memberOf != data.name);
90                 ownMethods.push($);
91                 return true;
92             }
93             
94                 
95             if ($.isNamespace || (($.memberOf != data.name) && $.isStatic)){
96                 return true;
97             }
98             if ($.isStatic) {
99                 $.isInherited = ($.memberOf != data.name);
100                 ownMethods.push($);
101             }
102                 
103             return true;
104             }
105             );
106     
107         // then dynamics..
108     
109         msorted.filter(
110             function($){
111                 //if (/@hide/.test($.desc)) {
112                 //        return false;
113                 //}
114                 // it's a signleton class - can not have dynamic methods..
115                 if (data.isSingleton) {
116                     return true;
117                 }
118                 if ($.isNamespace || (($.memberOf != data.name) && $.isStatic)){
119                     return true;
120                 }
121                 if (!$.isStatic) {
122                 $.isInherited = ($.memberOf != data.alias);
123                 ownMethods.push($);
124                 }
125                 
126                 return true;
127             }
128     );
129     return msorted;
130     
131     },
132
133     
134     method : function(member) {
135       
136         var output = '<a name="' + member.memberOf +'.' + member.name + '"></a>' +
137         '<div class="fixedFont"> <span class="attributes">';
138
139         if (member.isConstructor) {
140                 output += "new <B>" + member.memberOf + (member.memberOf.length ? "." : "") +"</B>";
141         } else {
142                 
143         if (member.isPrivate) output += "&lt;private&gt; ";
144         if (member.isInner) output += "&lt;inner&gt; ";
145         if (member.isStatic || member.isSingleton) { //|| data.comment.getTag("instanceOf").length) {
146             output +=  member.memberOf + ".";    
147         }
148         }
149         output += '</span><b class="itemname">' + member.name + '</b>';
150                 
151         output += this.makeSignature(member.params);
152         if (member.returns.length) {
153             output += ': ';
154         for(var i = 0;i< member.returns.length;i++) {
155         var item = member.returns[i];
156         output += (i > 0 ? ' or ' : '') +
157             this.linkSymbol(item.type);
158         }
159         }
160             
161             
162     output += '</div> <div class="mdesc">';
163         if (!member.isConstructor) {
164             output+= '<div class="short">'+this.resolveLinks(this.summarize(member.desc)) +'</div>';
165         } else  {
166             //ctor
167         output+= '<div class="short">Create a new '+member.memberOf +'</div>';
168         }
169     output +='<div class="long">';
170         if (!member.isConstructor) {
171             output+= this.resolveLinks(member.desc) ;
172             if (member.example.length) {
173                 output +'<pre class="code">'+member.example+'</pre>';
174             }
175         } else {
176             //ctor
177             output+= 'Create a new '+member.memberOf;
178         // example and desc.. are normally on the 'top'...
179         }
180         if (member.params.length) {
181         
182      
183             output+= '<dl class="detailList"> <dt class="heading">Parameters:</dt>';
184             for(var  i = 0; i <  member.params.length ; i++) {
185                 var item = member.params[i];
186                     output += '<dt>' +
187                        ( item.type.length ?
188                             '<span class="fixedFont">' + this.linkSymbol(item.type) + '</span> ' :
189                             ""
190                         )+  '<b>'+item.name+'</b>';
191                     if (item.isOptional) {
192                         output+='<i>Optional ';
193                         if (item.defaultValue.length) {
194                             output+='Default: '+item.defaultValue;
195                         }
196                         output+='</i>';
197                     }
198                     output +='</dt><dd>'+this.resolveLinks(item.desc)+'</dd>';
199             }
200             output+= '</dl>';
201         }    
202         if (member.deprecated.length) {
203             output+= '<dl class="detailList"><dt class="heading">Deprecated:</dt><dt>' +
204                         +member.deprecated+'</dt></dl>';
205         }
206         
207         
208         if (member.since.length) {
209             output+= '<dl class="detailList"><dt class="heading">Since:</dt><dt>' +
210                         +member.since+'</dt></dl>';
211         }
212          /*
213                 <if test="member.exceptions.length">
214                         <dl class="detailList">
215                         <dt class="heading">Throws:</dt>
216                         <for each="item" in="member.exceptions">
217                                 <dt>
218                                         {+((item.type)?"<span class=\"fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
219                                 </dt>
220                                 <dd>{+resolveLinks(item.desc)+}</dd>
221                         </for>
222                         </dl>
223                 </if>
224                 */
225         if (member.returns.length) {
226             output += '<dl class="detailList"><dt class="heading">Returns:</dt>';
227         for (var i =0; i < member.returns.length; i++) {
228         var item = member.returns[i];
229         output+= '<dd>' + this.linkSymbol( item.type ) + ' ' + this.resolveLinks(item.desc) + '</dd></dl>';
230         }
231                     
232         }
233         
234         /*
235                 <if test="member.requires.length">
236                         <dl class="detailList">
237                         <dt class="heading">Requires:</dt>
238                         <for each="item" in="member.requires">
239                                 <dd>{+ resolveLinks(item) +}</dd>
240                         </for>
241                         </dl>
242                 </if>
243         */
244         if (member.see.length) {
245             output+= '<dl class="detailList"><dt class="heading">See:</dt><dt>' +
246                         '<dd>' + this.linkSymbol( member.see ) +'</dd></dl>';
247         }
248         output +='</div></div>';
249         return output;
250     },
251     
252     
253     
254     event  : function(member)
255     {
256      
257   
258         var output = '<a name="' + member.memberOf +'-event-' + member.name + '"></a>' +
259         '<div class="fixedFont"> ';
260
261         
262         output += '<b class="itemname">'+member.name+'</b>' +this.makeSignature(member.params) + '</div>';
263               
264         output += '<div class="mdesc">';
265     output += '<div class="short">' +this.resolveLinks(this.summarize(member.desc))+   '</div>';
266            
267             
268         output += '<div class="long">' + this.resolveLinks(member.desc);
269     
270     if (member.example.length) {
271         output +'<pre class="code">'+member.example+'</pre>';
272     }
273     if (member.params.length) {
274         
275      
276             output+= '<dl class="detailList"> <dt class="heading">Parameters:</dt>';
277             for(var  i = 0; i <  member.params.length ; i++) {
278                 var item = member.params[i];
279                     output += '<dt>' +
280                        ( item.type.length ?
281                             '<span class="fixedFont">' + this.linkSymbol(item.type) + '</span> ' :
282                             ""
283                         )+  '<b>'+item.name+'</b>';
284                     if (item.isOptional) {
285                         output+='<i>Optional ';
286                         if (item.defaultValue.length) {
287                             output+='Default: '+item.defaultValue;
288                         }
289                         output+='</i>';
290                     }
291                     output +='</dt><dd>'+this.resolveLinks(item.desc)+'</dd>';
292             }
293             output+= '</dl>';
294         }            
295       if (member.deprecated.length) {
296             output+= '<dl class="detailList"><dt class="heading">Deprecated:</dt><dt>' +
297                         +member.deprecated+'</dt></dl>';
298         }
299         
300         
301         if (member.since.length) {
302             output+= '<dl class="detailList"><dt class="heading">Since:</dt><dt>' +
303                         +member.since+'</dt></dl>';
304         }
305          /*
306                 <if test="member.exceptions.length">
307                         <dl class="detailList">
308                         <dt class="heading">Throws:</dt>
309                         <for each="item" in="member.exceptions">
310                                 <dt>
311                                         {+((item.type)?"<span class=\"fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
312                                 </dt>
313                                 <dd>{+resolveLinks(item.desc)+}</dd>
314                         </for>
315                         </dl>
316                 </if>
317                 */    
318       if (member.returns.length) {
319             output += '<dl class="detailList"><dt class="heading">Returns:</dt>';
320         for (var i =0; i < member.returns.length; i++) {
321         var item = member.returns[i];
322         output+= '<dd>' + this.linkSymbol( item.type ) + ' ' + this.resolveLinks(item.desc) + '</dd></dl>';
323         }
324                     
325         }
326         
327         /*
328                 <if test="member.requires.length">
329                         <dl class="detailList">
330                         <dt class="heading">Requires:</dt>
331                         <for each="item" in="member.requires">
332                                 <dd>{+ resolveLinks(item) +}</dd>
333                         </for>
334                         </dl>
335                 </if>
336         */
337         if (member.see.length) {
338             output+= '<dl class="detailList"><dt class="heading">See:</dt><dt>' +
339                         '<dd>' + this.linkSymbol( member.see ) +'</dd></dl>';
340         }
341         output +='</div></div>';         
342           
343     return output;
344     },
345     
346     
347     
348     
349     
350     
351     
352     
353     
354     
355     makeSignature : function(params)
356     {
357         
358             if (!params.length) return "()";
359         var linkSymbol = this.linkSymbol;
360         var signature = "("    +
361             params.filter(
362                 function($) {
363                     return $.name.indexOf(".") == -1; // don't show config params in signature
364                 }
365             ).map(
366                 function($) {
367                     $.defaultValue = typeof($.defaultValue) == 'undefined' ? false : $.defaultValue;
368                     
369                     return "" +
370                         ($.isOptional ? "[" : "") +
371                         (($.type) ? 
372                             linkSymbol(
373                                 (typeof($.type) == 'object' ) ? 'Function' : $.type
374                             ) + " " :  ""
375                         )   + 
376                         "<B><i>" +$.name + "</i></B>" +
377                         ($.defaultValue ? "=" +item.defaultValue : "") +
378                         ($.isOptional ? "]" : "");
379                     
380                      
381                 }
382             ).join(", ")
383         +
384         ")";
385         return signature;
386         
387     },
388     resolveLinks : function(str)
389     {
390         if (!str || typeof(str) == 'undefined') {
391             return '';
392         }
393         
394         // gtk specific. now..
395         // @ -> bold.. - they are arguments..
396         /*
397         str = str.replace(/@([a-z_]+)/gi,
398             function(match, symbolName) {
399                 return '<b>' + symbolName + '</b>';
400             }
401         );
402         // constants.
403         str = str.replace(/%([a-z_]+)/gi,
404             function(match, symbolName) {
405                 return '<b>' + symbolName + '</b>';
406             }
407         );
408         
409         str = str.replace(/#([a-z_]+)/gi,
410             function(match, symbolName) {
411                 return '<b>' + symbolName + '</b>';
412                 // this should do a lookup!!!!
413                 /// it could use data in the signature to find out..
414                 //return new Link().toSymbol(Template.data.ns + '.' + symbolName);
415             }
416         );
417         */
418         str = str.replace(/\n/gi, '<br/>');
419         var linkSymbol = this.linkSymbol;
420         str = str.replace(/\{@link ([^} ]+) ?\}/gi,
421             function(match, symbolName) {
422                 return linkSymbol(symbolName);
423             }
424         );
425          
426         return str;
427     },
428     summarize : function(desc)
429     {
430         if (typeof desc != "undefined") {
431         // finds the first fulls stop...
432             return desc.match(/([\w\W]+?\.)[^a-z0-9]/i)? RegExp.$1.replace("\n", " ") : desc.split("\n")[0];
433         }
434         return '';
435     },
436     linkSymbol : function(str)
437     {
438         return '<span class=\"fixedFont\"><a href="#' + str + '">' + str + '</a></span>';
439     },
440     makeSortby : function(attribute) {
441         return function(a, b) {
442             if (a[attribute] != undefined && b[attribute] != undefined) {
443                 a = a[attribute]; //.toLowerCase();
444                 b = b[attribute];//.toLowerCase();
445                 if (a < b) return -1;
446                 if (a > b) return 1;
447                 return 0;
448             }
449             return 0;
450         }
451     }
452 }