diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-05-18 19:38:58 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-05-18 19:39:32 +0100 |
| commit | 9aae75f64568055ef1c04a6a5f2bfb29cf7cf736 (patch) | |
| tree | d0e6756979d871b5a9a22f8e886a8dcce0cb66de | |
| parent | 327b99803151111bcec37af0d2bc5df5baa3506b (diff) | |
Add anchor on hyperlinks as fragment if present
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | lib/docx/body-reader.js | 5 | ||||
| -rw-r--r-- | test/docx/body-reader.tests.js | 15 |
3 files changed, 20 insertions, 2 deletions
@@ -2,6 +2,8 @@ * Extract the default data URI image converter to the images module. +* Add anchor on hyperlinks as fragment if present. + # 1.3.6 * Handle complex fields that do not have a "separate" fldChar. diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js index dd76c5c..fa2ac83 100644 --- a/lib/docx/body-reader.js +++ b/lib/docx/body-reader.js @@ -1,6 +1,8 @@ exports.createBodyReader = createBodyReader; exports._readNumberingProperties = readNumberingProperties; +var url = require("url"); + var _ = require("underscore"); var documents = require("../documents"); @@ -210,6 +212,9 @@ function BodyReader(options) { return readXmlElements(element.children).map(function(children) { if (relationshipId) { var href = relationships[relationshipId].target; + if (anchor) { + href = url.resolve(href, "#" + anchor); + } return new documents.Hyperlink(children, {href: href}); } else if (anchor) { return new documents.Hyperlink(children, {anchor: anchor}); diff --git a/test/docx/body-reader.tests.js b/test/docx/body-reader.tests.js index 7828cdb..351249a 100644 --- a/test/docx/body-reader.tests.js +++ b/test/docx/body-reader.tests.js @@ -878,7 +878,7 @@ function assertChildrenAreConvertedNormally(tagName) { assert.deepEqual(result.value[0].type, "run"); } -test("w:hyperlink is read as document hyperlink if it has a relationship ID", function() { +test("w:hyperlink is read as external hyperlink if it has a relationship ID", function() { var runXml = new XmlElement("w:r", {}, []); var hyperlinkXml = new XmlElement("w:hyperlink", {"r:id": "r42"}, [runXml]); var relationships = { @@ -889,7 +889,18 @@ test("w:hyperlink is read as document hyperlink if it has a relationship ID", fu assert.deepEqual(result.value.children[0].type, "run"); }); -test("w:hyperlink is read as document hyperlink if it has an anchor", function() { +test("w:hyperlink is read as external hyperlink if it has a relationship ID and an anchor", function() { + var runXml = new XmlElement("w:r", {}, []); + var hyperlinkXml = new XmlElement("w:hyperlink", {"r:id": "r42", "w:anchor": "fragment"}, [runXml]); + var relationships = { + "r42": {target: "http://example.com/"} + }; + var result = readXmlElement(hyperlinkXml, {relationships: relationships}); + assert.deepEqual(result.value.href, "http://example.com/#fragment"); + assert.deepEqual(result.value.children[0].type, "run"); +}); + +test("w:hyperlink is read as internal hyperlink if it has an anchor", function() { var runXml = new XmlElement("w:r", {}, []); var hyperlinkXml = new XmlElement("w:hyperlink", {"w:anchor": "_Peter"}, [runXml]); var result = readXmlElement(hyperlinkXml); |
