From 2de416da7dd24a4e4771f4826f4f2fbc90948376 Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Sun, 2 Dec 2012 08:03:54 -0800 Subject: [PATCH] fix broken hrefs in output files (#264) --- rhino_modules/jsdoc/util/templateHelper.js | 30 +++++++++++++++++----- templates/default/publish.js | 11 +++++--- test/specs/jsdoc/util/templateHelper.js | 29 ++++++++++++--------- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/rhino_modules/jsdoc/util/templateHelper.js b/rhino_modules/jsdoc/util/templateHelper.js index a8c95e21..fda2d89e 100644 --- a/rhino_modules/jsdoc/util/templateHelper.js +++ b/rhino_modules/jsdoc/util/templateHelper.js @@ -420,7 +420,7 @@ exports.prune = function(data) { return data; }; -exports.registerLink = function(longname, url) { +var registerLink = exports.registerLink = function(longname, url) { linkMap.longnameToUrl[longname] = url; linkMap.urlToLongname[url] = longname; }; @@ -535,21 +535,39 @@ exports.resolveLinks = function(str) { return str; }; +/** + * Get a longname's filename if one has been registered; otherwise, generate a unique filename, then + * register the filename. + * @private + */ +function getFilename(longname) { + var url; + + if ( longnameToUrl[longname] && hasOwnProp.call(longnameToUrl, longname) ) { + url = longnameToUrl[longname]; + } else { + url = getUniqueFilename(longname); + registerLink(longname, url); + } + + return url; +} + /** Turn a doclet into a URL. */ exports.createLink = function(doclet) { - var url = '', - longname, - filename; + var url = ''; + var longname; + var filename; if (containers.indexOf(doclet.kind) < 0) { longname = doclet.longname; - filename = getUniqueFilename(doclet.memberof || exports.globalName); + filename = getFilename(doclet.memberof || exports.globalName); url = filename + '#' + getNamespace(doclet.kind) + doclet.name; } else { longname = doclet.longname; - url = getUniqueFilename(longname); + url = getFilename(longname); } return url; diff --git a/templates/default/publish.js b/templates/default/publish.js index 7aebbb1b..17e566d1 100644 --- a/templates/default/publish.js +++ b/templates/default/publish.js @@ -196,8 +196,11 @@ exports.publish = function(taffyData, opts, tutorials) { // claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness // doesn't try to hand them out later - helper.getUniqueFilename('index'); - helper.getUniqueFilename('global'); + var indexUrl = helper.getUniqueFilename('index'); + // don't call registerLink() on this one! 'index' is also a valid longname + + var globalUrl = helper.getUniqueFilename('global'); + helper.registerLink('global', globalUrl); // set up templating view.layout = 'layout.tmpl'; @@ -300,7 +303,7 @@ exports.publish = function(taffyData, opts, tutorials) { // once for all view.nav = buildNav(members); - if (members.globals.length) { generate('Global', members.globals, 'global' + helper.fileExtension); } + if (members.globals.length) { generate('Global', members.globals, globalUrl); } // index page displays information from package.json and lists files var files = find({kind: 'file'}), @@ -310,7 +313,7 @@ exports.publish = function(taffyData, opts, tutorials) { packages.concat( [{kind: 'mainpage', readme: opts.readme, longname: (opts.mainpagetitle) ? opts.mainpagetitle : 'Main Page'}] ).concat(files), - 'index' + helper.fileExtension); + indexUrl); // set up the lists that we'll use to generate pages var classes = taffy(members.classes); diff --git a/test/specs/jsdoc/util/templateHelper.js b/test/specs/jsdoc/util/templateHelper.js index 812b4c4d..691f3568 100644 --- a/test/specs/jsdoc/util/templateHelper.js +++ b/test/specs/jsdoc/util/templateHelper.js @@ -427,9 +427,7 @@ describe("jsdoc/util/templateHelper", function() { }); }); - // disabled because Jasmine appears to execute this code twice, which causes createLink to - // return an unexpected variation on the name the second time - xdescribe("createLink", function() { + describe("createLink", function() { it('should create a url for a simple global.', function() { var mockDoclet = { kind: 'function', @@ -464,16 +462,23 @@ describe("jsdoc/util/templateHelper", function() { expect(url).toEqual('ns.html#foo'); }); - it('should create a url for a member of a nested namespace.', function() { - var mockDoclet = { - kind: 'function', - longname: 'ns1.ns2.foo', - name: 'foo', - memberof: 'ns1.ns2' - }, - url = helper.createLink(mockDoclet); + var nestedNamespaceDoclet = { + kind: 'function', + longname: 'ns1.ns2.foo', + name: 'foo', + memberof: 'ns1.ns2' + }; + var nestedNamespaceUrl; - expect(url).toEqual('ns1.ns2.html#foo'); + it('should create a url for a member of a nested namespace.', function() { + nestedNamespaceUrl = helper.createLink(nestedNamespaceDoclet); + + expect(nestedNamespaceUrl).toEqual('ns1.ns2.html#foo'); + }); + + it('should return the same value when called twice with the same doclet.', function() { + var newUrl = helper.createLink(nestedNamespaceDoclet); + expect(newUrl).toEqual(nestedNamespaceUrl); }); it('should create a url for a name with invalid characters using a digest.', function() {