PageRenderTime 132ms CodeModel.GetById 117ms app.highlight 12ms RepoModel.GetById 1ms app.codeStats 0ms

/tags/jsdoc_toolkit-2.3.2/jsdoc-toolkit/app/frame/Link.js

http://jsdoc-toolkit.googlecode.com/
JavaScript | 153 lines | 119 code | 22 blank | 12 comment | 33 complexity | d8943a603c06a65d285de7883bd2d289 MD5 | raw file
  1/** Handle the creation of HTML links to documented symbols.
  2	@constructor
  3*/
  4function Link() {
  5	this.alias = "";
  6	this.src = "";
  7	this.file = "";
  8	this.text = "";
  9	this.innerName = "";
 10	this.classLink = false;
 11	this.targetName = "";
 12	
 13	this.target = function(targetName) {
 14		if (defined(targetName)) this.targetName = targetName;
 15		return this;
 16	}
 17	this.inner = function(inner) {
 18		if (defined(inner)) this.innerName = inner;
 19		return this;
 20	}
 21	this.withText = function(text) {
 22		if (defined(text)) this.text = text;
 23		return this;
 24	}
 25	this.toSrc = function(filename) {
 26		if (defined(filename)) this.src = filename;
 27		return this;
 28	}
 29	this.toSymbol = function(alias) {
 30		if (defined(alias)) this.alias = new String(alias);
 31		return this;
 32	}
 33	this.toClass = function(alias) {
 34		this.classLink = true;
 35		return this.toSymbol(alias);
 36	}
 37	this.toFile = function(file) {
 38		if (defined(file)) this.file = file;
 39		return this;
 40	}
 41	
 42	this.toString = function() {
 43		var linkString;
 44		var thisLink = this;
 45
 46		if (this.alias) {
 47			linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i,
 48				function(match, prematch, symbolName, postmatch) {
 49					var symbolNames = symbolName.split("|");
 50					var links = [];
 51					for (var i = 0, l = symbolNames.length; i < l; i++) {
 52						thisLink.alias = symbolNames[i];
 53						links.push(thisLink._makeSymbolLink(symbolNames[i]));
 54					}
 55					return prematch+links.join("|")+postmatch;
 56				}
 57			);
 58		}
 59		else if (this.src) {
 60			linkString = thisLink._makeSrcLink(this.src);
 61		}
 62		else if (this.file) {
 63			linkString = thisLink._makeFileLink(this.file);
 64		}
 65
 66		return linkString;
 67	}
 68}
 69
 70/** prefixed for hashes */
 71Link.hashPrefix = "";
 72
 73/** Appended to the front of relative link paths. */
 74Link.base = "";
 75
 76Link.symbolNameToLinkName = function(symbol) {
 77	var linker = "";
 78	if (symbol.isStatic) linker = ".";
 79	else if (symbol.isInner) linker = "-";
 80	
 81	return Link.hashPrefix+linker+symbol.name;
 82}
 83
 84/** Create a link to another symbol. */
 85Link.prototype._makeSymbolLink = function(alias) {
 86	var linkBase = Link.base+publish.conf.symbolsDir;
 87	var linkTo = Link.symbolSet.getSymbol(alias);
 88	var linkPath;
 89	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
 90
 91	// is it an internal link?
 92	if (alias.charAt(0) == "#") var linkPath = alias;
 93	
 94	// if there is no symbol by that name just return the name unaltered
 95	else if (!linkTo) return this.text || alias;
 96	
 97	// it's a symbol in another file
 98	else {
 99		if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property
100			if (linkTo.isEvent) {
101				linkPath = 
102					(Link.filemap)? Link.filemap[linkTo.memberOf] 
103					:
104					escape(linkTo.memberOf) || "_global_";
105				linkPath += publish.conf.ext + "#event:" + Link.symbolNameToLinkName(linkTo);
106			}
107			else {
108				linkPath = 
109					(Link.filemap)? Link.filemap[linkTo.memberOf] 
110					:
111					escape(linkTo.memberOf) || "_global_";
112				linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo);
113			}
114		}
115		else {
116			linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias);
117			linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor");
118		}
119		linkPath = linkBase + linkPath
120	}
121	
122	var linkText = this.text || alias;
123	
124	var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")};
125	
126	if (typeof JSDOC.PluginManager != "undefined") {
127		JSDOC.PluginManager.run("onSymbolLink", link);
128	}
129	
130	return "<a href=\""+link.linkPath+link.linkInner+"\""+target+">"+link.linkText+"</a>";
131}
132
133/** Create a link to a source file. */
134Link.prototype._makeSrcLink = function(srcFilePath) {
135	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
136		
137	// transform filepath into a filename
138	var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_");
139	var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext;
140
141	if (!this.text) this.text = FilePath.fileName(srcFilePath);
142	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
143}
144
145/** Create a link to a source file. */
146Link.prototype._makeFileLink = function(filePath) {
147	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
148		
149	var outFilePath =  Link.base + filePath;
150
151	if (!this.text) this.text = filePath;
152	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
153}