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