diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-03-06 10:25:06 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-03-06 10:25:06 +0100 |
commit | 145b00f590944cc60812be90560721ebeb7eecda (patch) | |
tree | 634daace664bbc98517cf1ab7cfd9bc711fc4f88 | |
parent | 5f2785f0a8a6a752a7de8a7c6332574ada4875aa (diff) | |
download | gitbook-145b00f590944cc60812be90560721ebeb7eecda.zip gitbook-145b00f590944cc60812be90560721ebeb7eecda.tar.gz gitbook-145b00f590944cc60812be90560721ebeb7eecda.tar.bz2 |
Fix #628: preserve pure anchor links and hash in relative links
-rw-r--r-- | lib/utils/links.js | 13 | ||||
-rw-r--r-- | lib/utils/page.js | 12 | ||||
-rw-r--r-- | test/links.js | 7 |
3 files changed, 28 insertions, 4 deletions
diff --git a/lib/utils/links.js b/lib/utils/links.js index 9a95824..aa7c241 100644 --- a/lib/utils/links.js +++ b/lib/utils/links.js @@ -15,12 +15,22 @@ var isRelative = function(href) { try { var parsed = url.parse(href); - return !!(!parsed.protocol && parsed.path);// && parsed.path[0] != '/'; + return !!(!parsed.protocol && parsed.path); } catch(err) {} return true; }; +// Return true if the link is an achor +var isAnchor = function(href) { + try { + var parsed = url.parse(href); + return !!(!parsed.protocol && !parsed.path && parsed.hash); + } catch(err) {} + + return false; +}; + // Relative to absolute path // dir: directory parent of the file currently in rendering process // outdir: directory parent from the html output @@ -61,6 +71,7 @@ var changeExtension = function(filename, newext) { }; module.exports = { + isAnchor: isAnchor, isRelative: isRelative, isExternal: isExternal, toAbsolute: toAbsolute, diff --git a/lib/utils/page.js b/lib/utils/page.js index cdc7d1a..effa24f 100644 --- a/lib/utils/page.js +++ b/lib/utils/page.js @@ -1,5 +1,6 @@ var Q = require('q'); var _ = require('lodash'); +var url = require('url'); var path = require('path'); var cheerio = require('cheerio'); var domSerializer = require('dom-serializer'); @@ -186,8 +187,12 @@ function normalizeHtml(src, options) { var href = $(this).attr("href"); if (!href) return; - if (links.isRelative(href)) { - var absolutePath = path.join(options.base, href); + if (links.isAnchor(href)) { + // Keep it as it is + } else if (links.isRelative(href)) { + var parts = url.parse(path.join(options.base, href)); + var absolutePath = parts.pathname; + var anchor = parts.hash; // If is in navigation relative: transform as content if (options.navigation[absolutePath]) { @@ -195,8 +200,9 @@ function normalizeHtml(src, options) { } // Transform as absolute - href = links.toAbsolute(href, options.base, options.output); + href = links.toAbsolute(href, options.base, options.output)+anchor; } else { + // External links $(this).attr("target", "_blank"); } diff --git a/test/links.js b/test/links.js index 4dad4d4..2c68a23 100644 --- a/test/links.js +++ b/test/links.js @@ -13,6 +13,13 @@ describe('Links', function () { assert(!links.isExternal("/folder/test.md")); }); + it('should correctly test anchor links', function() { + assert(links.isAnchor("#test")); + assert(links.isAnchor(" #test")); + assert(!links.isAnchor("https://google.fr#test")); + assert(!links.isAnchor("test.md#test")); + }); + describe('toAbsolute', function() { it('should correctly transform as absolute', function() { assert.equal(links.toAbsolute("http://google.fr"), "http://google.fr"); |