More commits to sync working copy
[gnome.introspection-doc-generator] / JSDOC / Template / Link.js
1 //<script type="text/javascript">
2 JSDOC   = imports['JSDOC.js'].JSDOC;
3
4 console = imports['console.js'].console;
5
6 imports['Object.js'].load(Object);
7
8 Template = imports['JSDOC/Template.js'];
9
10 /** Handle the creation of HTML links to documented symbols.
11         @constructor
12     * 
13     * // JSDOC.Template.Link.base = "";
14     * JSDOC.Template.Link.symbolsDir
15     * 
16 */
17
18  
19 Link = function() {
20         this.alias = "";
21         this.src = "";
22         this.file = "";
23         this.text = "";
24         this.innerName = "";
25         this.classLink = false;
26         this.targetName = "";
27     
28     Link.symbolsDir = Link.symbolsDir || '';
29     Link.base = Link.base || '';
30     Link.ext= Link.ext || '';
31     Link.srcDir= Link.srcDir || '';
32         
33     
34 }
35
36
37
38 Object.extend(Link.prototype, {
39     
40     alias : "",
41         src : "",
42         file : "",
43         text : "",
44         innerName : "",
45         classLink : false,
46         targetName : "",
47     
48     
49     
50     toString : function() {
51                 var linkString;
52                 var thisLink = this;
53         
54         if (this.none) {
55             return 'none';
56         }
57                 if (this.alias) {
58             
59             if (typeof(this.builtins[this.alias]) != 'undefined') {
60                 this.text = this.alias;
61                 return thisLink._makeExternLink(this.builtins[this.alias]);
62             }
63             
64             
65             return thisLink._makeSymbolLink(this.alias);
66             
67             /*
68             
69                         linkString = this.alias.replace(/(^|[^a-z$0-9_#.:-])([|a-z$0-9_#.:-]+)($|[^a-z$0-9_#.:-])/i,
70                                 function(match, prematch, symbolName, postmatch) {
71                                         var symbolNames = symbolName.split("|");
72                                         var links = [];
73                                         for (var i = 0, l = symbolNames.length; i < l; i++) {
74                                                 thisLink.alias = symbolNames[i];
75                                                 links.push(thisLink._makeSymbolLink(symbolNames[i]));
76                                         }
77                                         return prematch+links.join("|")+postmatch;
78                                 }
79                         );
80             */
81                 }
82                 else if (this.extern) {
83                         linkString = thisLink._makeExternLink(this.extern);
84                 }
85                 else if (this.src) {
86                         linkString = thisLink._makeSrcLink(this.src);
87                 }
88                 else if (this.file) {
89                         linkString = thisLink._makeFileLink(this.file);
90                 }
91
92                 return linkString;
93         },
94     
95     builtins : {
96         'Object' : 'https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Object',
97         //'Object...' : 'http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Object',
98         'Array' : 'https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array',
99         'Function' : 'https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Function',
100         'String' : 'https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/String',
101         'Number' : 'https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Number',
102         'Boolean' : 'https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Boolean',
103         'HTMLElement' : 'http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-58190037'
104     },
105     
106     
107     toGnome: function(alias) 
108     {
109         this.file = "#";
110         var pr = alias.split('.');
111         var aa = alias;
112         var site = 'library.gnome.org';
113         var extra = '';
114         switch(pr[0]) {
115             case 'GIRepository':
116                this.extern = 'http://live.gnome.org/GObjectIntrospection';
117                aa = pr[0];
118                break;
119             case 'Gio':   
120             case 'GLib':   
121             case 'GObject':   
122                 aa = pr.length > 1 ? 'G' + pr[1] : pr[0];
123                 break;
124             case 'GdkPixbuf':   
125                 aa = pr.length > 1 ? 'Gdk' + pr[1] : pr[0];
126                 break;
127             case 'GtkSource':   
128                 aa = pr.length > 1 ? pr[0] + pr[1] : 'GtkSourceView';
129                 break;
130                 
131             case 'Gst': 
132                 aa = pr.length > 1 ? pr[0] + pr[1] : 'GStreamer';
133                 break;
134             
135             case 'Pango':
136                 extra = ' GTK-Doc';
137                 break;
138             case 'GstController': 
139             case 'GstApp': 
140             case 'GstAudio': 
141             case 'GstBase': 
142             case 'GstCheck': 
143             case 'GstFft': 
144             case 'GstInterfaces': 
145             case 'GstNet': 
146             case 'GstNetbuffer': 
147             case 'GstPbutils': 
148             case 'GstRiff': 
149             case 'GstRtp': 
150             case 'GstRtsp': 
151             case 'GstSdp': 
152             case 'GstTag': 
153             case 'GstVideo': 
154             
155                 aa = pr.length > 1 ? 'Gst' + pr[1] : pr[0];
156                 break;
157                 
158             case 'Epiphany':     
159                 aa = pr.length > 1 ?  pr[1] : pr[0];
160                 break;
161             case 'WebKit':
162                 site = 'webkitgtk.org';
163             
164             default:
165                 
166                 aa = alias.replace('.', '');
167                 
168                 break;
169          
170         }
171         if (!this.extern) {
172             this.extern = 'http://www.google.com/search?hl=en&amp;' + 
173                     'q=site%3A' + site  + '+' + aa + extra +
174                     '&amp;btnI=I%27m+Feeling+Lucky&amp;meta=&amp;aq=f&amp;oq=';
175         }
176         
177         this.text =  aa;
178         return this;
179     },
180     
181         target : function(targetName) {
182                 if (typeof(targetName) != 'undefined') this.targetName = targetName;
183                 return this;
184         },
185         inner : function(inner) {
186                 if (typeof(inner) != 'undefined') this.innerName = inner;
187                 return this;
188         },
189         withText:  function(text) {
190                 if (typeof(text) != 'undefined') this.text = text;
191                 return this;
192         },
193         toSrc :function(filename) {
194                 if (typeof(filename) != 'undefined') this.src = filename;
195                 return this;
196         },
197     
198     toSymbolLong : function(alias)
199     {
200         this.show_full = true;
201         return this.toSymbol(alias)
202     },
203         toSymbol : function(alias) {
204         
205         
206         switch(alias) {
207             case 'boolean' : this.alias = 'Boolean'; return this;
208             case 'int' : this.alias = 'Number'; return this;
209             case 'uint' : this.alias = 'Number'; return this;
210             
211             case 'long' : this.alias = 'Number'; return this;
212             case 'ulong' : this.alias = 'Number'; return this;
213             
214             
215             case 'uint8' : this.alias = 'Number'; return this;
216             case 'int8' : this.alias = 'Number'; return this;
217             
218             case 'uint16' : this.alias = 'Number'; return this;
219             case 'uint16' : this.alias = 'Number'; return this;
220             
221             case 'int32' : this.alias = 'Number'; return this;
222             case 'uint32' : this.alias = 'Number'; return this;
223             
224             case 'uint64' : this.alias = 'Number'; return this;
225             case 'int64' : this.alias = 'Number'; return this;
226             
227             
228             case 'GType' : this.alias = 'Number'; return this;
229             case 'size' : this.alias = 'Number'; return this;
230             case 'ssize' : this.alias = 'Number'; return this;
231             
232             case 'float' : this.alias = 'Number'; return this;
233             case 'double' : this.alias = 'Number'; return this;
234             case 'time_t' : this.alias = 'Number'; return this;
235             // fixme - should find out more details..
236             case 'array' : this.alias = 'Array'; return this;
237             case 'gslist' : this.alias = 'Array'; return this;
238             case 'glist' : this.alias = 'Array'; return this; // homefully.
239             case 'ghash' : this.alias = 'Object'; return this; // homefully.
240             
241             
242             case 'error' : this.alias = 'Object'; return this; // homefully.
243             case 'filename' : this.alias = 'String'; return this; // hopefully..
244             case 'utf8' : this.alias = 'String'; return this;
245             
246             case 'void' : this.none = true; return this;
247             
248             
249         }
250         
251         
252                 if (typeof(alias) != 'undefined') {
253             this.alias = new String(alias);
254         }
255                 return this;
256         },
257         toClass : function(alias) {
258                 this.classLink = true;
259                 return this.toSymbol(alias);
260         },
261         toFile : function(file) {
262                 if (typeof(file) != 'undefined') this.file = file;
263                 return this;
264         },
265         
266         
267   
268
269     /** prefixed for hashes */
270
271
272     /** Appended to the front of relative link paths. */
273
274
275     symbolNameToLinkName : function(symbol) {
276         var linker = "";
277         if (symbol.isStatic) linker = ".";
278         else if (symbol.isInner) linker = "-";
279         
280         return linker+symbol.name;
281     },
282
283     
284
285
286     /** Create a link to a snother symbol. */
287     _makeSymbolLink :  function(alias) 
288     {
289         var target = '';
290         var txt = this.show_full ? alias : alias.split('.').pop();
291          return "<a href=\"./"+alias+".html\""+target+">"+txt+"</a>";    
292         
293         /*
294         // look for '/' in alias..
295         if (/\//.test(alias)) {
296             var bits = alias.split('/');
297             var ret = "";
298             for(var i=0; i < bits.length; i++) {
299                 if (i > 0) {
300                     ret +="/";
301                 }
302                 ret += this._makeSymbolLink(bits[i]);
303             }
304             return ret;
305             
306         }
307         
308         
309         */
310         
311         var linkBase = Link.base + Link.symbolsDir;
312         //var linkTo = Link.symbolSet.getSymbol(alias);
313         linkTo = "FIXME";
314         var linkPath;
315         var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
316         
317         // is it an internal link?
318         if (alias.charAt(0) == "#") {
319             linkPath = alias;
320             fullLinkPath = alias;
321         
322         // if there is no symbol by that name just return the name unaltered
323         } else if (!linkTo) {
324             
325             if (typeof(this.builtins[alias]) != 'undefined') {
326                 return "<a href=\""+ this.builtins[alias]+"\""+target+">"+alias+"</a>";
327              }
328             
329             return this.text || alias;
330         
331         
332         // it's a symbol in another file
333         } else {
334
335             if (!linkTo.isConstructor && !linkTo.isNamespace) { // it's a method or property
336                 linkPath = escape(linkTo.memberOf) || "_global_";
337                 linkPath += Link.ext + "#" + this.symbolNameToLinkName(linkTo);
338             }
339             else {
340                 linkPath = escape(linkTo.alias);
341                 linkPath += Link.ext + (this.classLink? "":"#" +  "constructor");
342             }
343             //linkPath = linkBase + linkPath;
344             fullLinkPath = linkBase + linkPath;
345         }
346         
347         var linkText = this.text || alias;
348         
349         var link = {linkPath: linkPath, linkText: linkText, fullLinkPath: fullLinkPath};
350         
351         if (typeof PluginManager != "undefined") {
352             JSDOC.PluginManager.run("onSymbolLink", link);
353         }
354         
355         return "<a href=\""+link.fullLinkPath+"\""+target+">"+link.linkText+"</a>";
356     },
357
358
359     /** Create a link to a source file. */
360      _makeSrcLink : function(srcFilePath) {
361         var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
362             
363         // transform filepath into a filename
364         var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "."); // was _
365         var lsrcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, ".");
366         var outFilePath = Link.base + Link.srcDir + srcFile.replace(/.js$/, '') + Link.ext;
367         
368         if (!this.text) this.text = FilePath.fileName(srcFilePath);
369         return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
370     },
371
372     /** Create a link to a source file. */
373      _makeFileLink : function(filePath) {
374         var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
375             
376         var outFilePath =  Link.base + filePath;
377
378         if (!this.text) this.text = filePath;
379         return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
380     },
381     
382     /** Create a link to a source file. */
383      _makeExternLink : function(filePath) {
384         var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
385             
386         if (!this.text) this.text = filePath;
387         return "<a href=\""+filePath+"\""+target+">"+this.text+"</a>";
388     }
389     
390 });