Spaces:
Sleeping
Sleeping
| /** 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 "<a href=\""+link.linkPath+link.linkInner+"\""+target+">"+link.linkText+"</a>"; | |
| } | |
| /** 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 "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>"; | |
| } | |
| /** 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 "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>"; | |
| } |