/** Handle the creation of HTML links to documented symbols. @constructor */ function Link() { this.alias = ""; this.src = ""; this.file = ""; this.text = ""; this.innerName = ""; this.classLink = false; this.targetName = ""; this.target = function(targetName) { if (defined(targetName)) this.targetName = targetName; return this; } this.inner = function(inner) { if (defined(inner)) this.innerName = inner; return this; } this.withText = function(text) { if (defined(text)) this.text = text; return this; } this.toSrc = function(filename) { if (defined(filename)) this.src = filename; return this; } this.toSymbol = function(alias) { if (defined(alias)) this.alias = new String(alias); return this; } this.toClass = function(alias) { this.classLink = true; return this.toSymbol(alias); } this.toFile = function(file) { if (defined(file)) this.file = file; return this; } this.toString = function() { var linkString; var thisLink = this; if (this.alias) { linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i, function(match, prematch, symbolName, postmatch) { var symbolNames = symbolName.split("|"); var links = []; for (var i = 0, l = symbolNames.length; i < l; i++) { thisLink.alias = symbolNames[i]; links.push(thisLink._makeSymbolLink(symbolNames[i])); } return prematch+links.join("|")+postmatch; } ); } else if (this.src) { linkString = thisLink._makeSrcLink(this.src); } else if (this.file) { linkString = thisLink._makeFileLink(this.file); } return linkString; } } /** prefixed for hashes */ Link.hashPrefix = ""; /** Appended to the front of relative link paths. */ Link.base = ""; Link.symbolNameToLinkName = function(symbol) { var linker = "", ns = ""; if (symbol.isStatic) linker = "."; else if (symbol.isInner) linker = "-"; if (symbol.isEvent && !/^event:/.test(symbol.name)) { ns = "event:"; } return Link.hashPrefix+linker+ns+symbol.name; } Link.getSymbol= function(alias) { var symbol= Link.symbolSet.getSymbol(alias); if (symbol) return symbol; if ('#'!==alias.charAt(0) || !Link.currentSymbol) return null; // resolve relative name var container= Link.currentSymbol; while (container) { symbol= Link.symbolSet.getSymbol(container.alias + alias); if (symbol) return symbol; // No superclass if (!container.augments.length) return null; container= Link.symbolSet.getSymbol(container.augments[0].desc); } return null; } /** Create a link to another symbol. */ Link.prototype._makeSymbolLink = function(alias) { var linkBase = Link.base+publish.conf.symbolsDir; var linkTo = Link.getSymbol(alias); var linkPath; var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; // if there is no symbol by that name just return the name unaltered if (!linkTo) return this.text || alias; // it's a symbol in another file else { if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property linkPath= (Link.filemap) ? Link.filemap[linkTo.memberOf] : escape(linkTo.memberOf) || "_global_"; linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo); } else { linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias); linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor"); } linkPath = linkBase + linkPath } var linkText= this.text || alias; var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")}; if (typeof JSDOC.PluginManager != "undefined") { JSDOC.PluginManager.run("onSymbolLink", link); } return ""+link.linkText+""; } /** Create a link to a source file. */ Link.prototype._makeSrcLink = function(srcFilePath) { var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; // transform filepath into a filename var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_"); var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext; if (!this.text) this.text = FilePath.fileName(srcFilePath); return ""+this.text+""; } /** Create a link to a source file. */ Link.prototype._makeFileLink = function(filePath) { var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; var outFilePath = Link.base + filePath; if (!this.text) this.text = filePath; return ""+this.text+""; }