summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-03-06 10:25:06 +0100
committerSamy Pessé <samypesse@gmail.com>2015-03-06 10:25:06 +0100
commit145b00f590944cc60812be90560721ebeb7eecda (patch)
tree634daace664bbc98517cf1ab7cfd9bc711fc4f88 /lib
parent5f2785f0a8a6a752a7de8a7c6332574ada4875aa (diff)
downloadgitbook-145b00f590944cc60812be90560721ebeb7eecda.zip
gitbook-145b00f590944cc60812be90560721ebeb7eecda.tar.gz
gitbook-145b00f590944cc60812be90560721ebeb7eecda.tar.bz2
Fix #628: preserve pure anchor links and hash in relative links
Diffstat (limited to 'lib')
-rw-r--r--lib/utils/links.js13
-rw-r--r--lib/utils/page.js12
2 files changed, 21 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");
}