diff options
Diffstat (limited to 'lib/page')
-rw-r--r-- | lib/page/html.js | 13 | ||||
-rw-r--r-- | lib/page/index.js | 22 |
2 files changed, 25 insertions, 10 deletions
diff --git a/lib/page/html.js b/lib/page/html.js index 45fae0d..bd9ec91 100644 --- a/lib/page/html.js +++ b/lib/page/html.js @@ -1,4 +1,5 @@ var _ = require('lodash'); +var url = require('url'); var cheerio = require('cheerio'); var domSerializer = require('dom-serializer'); var slug = require('github-slugid'); @@ -63,7 +64,11 @@ HTMLPipeline.prototype.transformLinks = function() { if (location.isAnchor(href)) { // Don't "change" anchor links } else if (location.isRelative(href)) { - $a.attr('href', this.opts.onRelativeLink(href)); + // Preserve anchor + var parsed = url.parse(href); + var filename = this.opts.onRelativeLink(parsed.pathname); + + $a.attr('href', filename + (parsed.hash || '')); } else { // External links $a.attr('target', '_blank'); @@ -178,12 +183,16 @@ HTMLPipeline.prototype.output = function() { var that = this; return Promise() - .then(this.transformLinks) .then(this.transformImages) .then(this.transformHeadings) .then(this.transformCodeBlocks) .then(this.transformSvgs) .then(this.applyAnnotations) + + // Transform of links should be applied after annotations + // because annotations are created as links + .then(this.transformLinks) + .then(function() { return renderDOM(that.$); }); diff --git a/lib/page/index.js b/lib/page/index.js index bdf3c81..bc12529 100644 --- a/lib/page/index.js +++ b/lib/page/index.js @@ -60,14 +60,23 @@ Page.prototype.resolve = function() { return this.book.resolve(this.resolveLocal.apply(this, arguments)); }; -// Convert an absolite path to a relative path from this page +// Convert an absolute path (in the book) to a relative path from this page Page.prototype.relative = function(name) { + // Convert /test.png -> test.png + name = location.toAbsolute(name, '', ''); + return location.relative( - this.resolve('.'), - this.resolve(name) + this.resolve('.') + '/', + this.book.resolve(name) ); }; +// Return a page result of a relative page from this page +Page.prototype.followPage = function(filename) { + var absPath = this.resolveLocal(filename); + return this.book.getPage(absPath); +}; + // Update content of the page Page.prototype.update = function(content) { this.content = content; @@ -148,10 +157,7 @@ Page.prototype.toHTML = function(output) { // Normalize HTML output .then(function() { var pipelineOpts = { - onRelativeLink: function (href) { - href = that.relative(href); - return output.onRelativeLink(that, href); - }, + onRelativeLink: _.partial(output.onRelativeLink, that), onImage: _.partial(output.onOutputImage, that), onOutputSVG: _.partial(output.onOutputSVG, that), @@ -166,7 +172,7 @@ Page.prototype.toHTML = function(output) { }, // Convert glossary entries to annotations - annotations: that.book.glosary.annotations() + annotations: that.book.glossary.annotations() }; var pipeline = new HTMLPipeline(that.content, pipelineOpts); |