summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2017-05-18 19:38:58 +0100
committerMichael Williamson <mike@zwobble.org>2017-05-18 19:39:32 +0100
commit9aae75f64568055ef1c04a6a5f2bfb29cf7cf736 (patch)
treed0e6756979d871b5a9a22f8e886a8dcce0cb66de
parent327b99803151111bcec37af0d2bc5df5baa3506b (diff)
Add anchor on hyperlinks as fragment if present
-rw-r--r--NEWS2
-rw-r--r--lib/docx/body-reader.js5
-rw-r--r--test/docx/body-reader.tests.js15
3 files changed, 20 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 3d30193..36ca660 100644
--- a/NEWS
+++ b/NEWS
@@ -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);