fix broken hrefs in output files (#264)

This commit is contained in:
Jeff Williams 2012-12-02 08:03:54 -08:00
parent 43a50ac01a
commit 2de416da7d
3 changed files with 48 additions and 22 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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() {