summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-05-24 15:32:30 +0200
committerSamy Pessé <samypesse@gmail.com>2016-05-24 15:32:30 +0200
commitfb930d889fcb0c630e7ee51ecec4bf4350e29ce4 (patch)
tree7cd65d007df4ea19a2002abb6e151b1d6ee91067
parent721a75309bf3d796d5569d1d06473724c4445a88 (diff)
downloadgitbook-fb930d889fcb0c630e7ee51ecec4bf4350e29ce4.zip
gitbook-fb930d889fcb0c630e7ee51ecec4bf4350e29ce4.tar.gz
gitbook-fb930d889fcb0c630e7ee51ecec4bf4350e29ce4.tar.bz2
Fix anchor breaking links resolution
-rw-r--r--lib/output/generatePage.js1
-rw-r--r--lib/output/modifiers/__tests__/resolveLinks.js20
-rw-r--r--lib/output/modifiers/resolveLinks.js8
3 files changed, 25 insertions, 4 deletions
diff --git a/lib/output/generatePage.js b/lib/output/generatePage.js
index 44c98b9..fa6fc0e 100644
--- a/lib/output/generatePage.js
+++ b/lib/output/generatePage.js
@@ -4,7 +4,6 @@ var Promise = require('../utils/promise');
var error = require('../utils/error');
var timing = require('../utils/timing');
-var Parse = require('../parse');
var Templating = require('../templating');
var JSONUtils = require('../json');
var createTemplateEngine = require('./createTemplateEngine');
diff --git a/lib/output/modifiers/__tests__/resolveLinks.js b/lib/output/modifiers/__tests__/resolveLinks.js
index 9b7621b..e42b619 100644
--- a/lib/output/modifiers/__tests__/resolveLinks.js
+++ b/lib/output/modifiers/__tests__/resolveLinks.js
@@ -4,7 +4,7 @@ var resolveLinks = require('../resolveLinks');
describe('resolveLinks', function() {
function resolveFileBasic(href) {
- return href;
+ return 'fakeDir/' + href;
}
function resolveFileCustom(href) {
@@ -24,7 +24,7 @@ describe('resolveLinks', function() {
return resolveLinks('hello.md', resolveFileBasic, $)
.then(function() {
var link = $('a');
- expect(link.attr('href')).toBe('test/cool.md');
+ expect(link.attr('href')).toBe('fakeDir/test/cool.md');
});
});
@@ -34,7 +34,21 @@ describe('resolveLinks', function() {
return resolveLinks('afolder/hello.md', resolveFileBasic, $)
.then(function() {
var link = $('a');
- expect(link.attr('href')).toBe('../test/cool.md');
+ expect(link.attr('href')).toBe('../fakeDir/test/cool.md');
+ });
+ });
+ });
+
+ describe('Anchor', function() {
+ var TEST = '<p>This is a <a href="test/cool.md#an-anchor"></a></p>';
+
+ it('should prevent anchors in resolution', function() {
+ var $ = cheerio.load(TEST);
+
+ return resolveLinks('hello.md', resolveFileCustom, $)
+ .then(function() {
+ var link = $('a');
+ expect(link.attr('href')).toBe('test/cool.html#an-anchor');
});
});
});
diff --git a/lib/output/modifiers/resolveLinks.js b/lib/output/modifiers/resolveLinks.js
index 116ce8b..907a667 100644
--- a/lib/output/modifiers/resolveLinks.js
+++ b/lib/output/modifiers/resolveLinks.js
@@ -1,4 +1,5 @@
var path = require('path');
+var url = require('url');
var LocationUtils = require('../../utils/location');
var editHTMLElement = require('./editHTMLElement');
@@ -27,6 +28,10 @@ function resolveLinks(currentFile, resolveFile, $) {
return;
}
+ // Split anchor
+ var parsed = url.parse(href);
+ href = parsed.pathname;
+
// Calcul absolute path for this
href = LocationUtils.toAbsolute(href, currentDirectory, '.');
@@ -36,6 +41,9 @@ function resolveLinks(currentFile, resolveFile, $) {
// Convert back to relative
href = LocationUtils.relative(currentDirectory, href);
+ // Add back anchor
+ href = href + (parsed.hash || '');
+
$a.attr('href', href);
});
}