summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2017-05-18 20:08:38 +0100
committerMichael Williamson <mike@zwobble.org>2017-05-18 20:08:38 +0100
commitc2d5d7043644cbd3e0a8bfe3d9251cc5eca811d4 (patch)
tree92bd77fd3448f52f1de28239a37e354cc63feb44
parent1c007ffd3b0d736f99306d448341868e35eee187 (diff)
Avoid parsing URI when replacing fragment
-rw-r--r--lib/docx/body-reader.js8
-rw-r--r--lib/docx/uris.js10
-rw-r--r--test/docx/body-reader.tests.js11
3 files changed, 24 insertions, 5 deletions
diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js
index fa2ac83..05a564a 100644
--- a/lib/docx/body-reader.js
+++ b/lib/docx/body-reader.js
@@ -1,14 +1,12 @@
exports.createBodyReader = createBodyReader;
exports._readNumberingProperties = readNumberingProperties;
-var url = require("url");
-
var _ = require("underscore");
var documents = require("../documents");
var Result = require("../results").Result;
var warning = require("../results").warning;
-var uriToZipEntryName = require("./uris").uriToZipEntryName;
+var uris = require("./uris");
function createBodyReader(options) {
return {
@@ -213,7 +211,7 @@ function BodyReader(options) {
if (relationshipId) {
var href = relationships[relationshipId].target;
if (anchor) {
- href = url.resolve(href, "#" + anchor);
+ href = uris.replaceFragment(href, anchor);
}
return new documents.Hyperlink(children, {href: href});
} else if (anchor) {
@@ -408,7 +406,7 @@ function BodyReader(options) {
}
function findEmbeddedImageFile(relationshipId) {
- var path = uriToZipEntryName("word", relationships[relationshipId].target);
+ var path = uris.uriToZipEntryName("word", relationships[relationshipId].target);
return {
path: path,
read: docxFile.read.bind(docxFile, path)
diff --git a/lib/docx/uris.js b/lib/docx/uris.js
index 0179e5b..89d5be1 100644
--- a/lib/docx/uris.js
+++ b/lib/docx/uris.js
@@ -1,4 +1,5 @@
exports.uriToZipEntryName = uriToZipEntryName;
+exports.replaceFragment = replaceFragment;
function uriToZipEntryName(base, uri) {
if (uri.charAt(0) === "/") {
@@ -9,3 +10,12 @@ function uriToZipEntryName(base, uri) {
return base + "/" + uri;
}
}
+
+
+function replaceFragment(uri, fragment) {
+ var hashIndex = uri.indexOf("#");
+ if (hashIndex !== -1) {
+ uri = uri.substring(0, hashIndex);
+ }
+ return uri + "#" + fragment;
+}
diff --git a/test/docx/body-reader.tests.js b/test/docx/body-reader.tests.js
index 01a147b..14fbba9 100644
--- a/test/docx/body-reader.tests.js
+++ b/test/docx/body-reader.tests.js
@@ -901,6 +901,17 @@ test("w:hyperlink", {
assert.deepEqual(result.value.children[0].type, "run");
},
+ "existing fragment is replaced when anchor is set on external link": 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/#previous"}
+ };
+ var result = readXmlElement(hyperlinkXml, {relationships: relationships});
+ assert.deepEqual(result.value.href, "http://example.com/#fragment");
+ assert.deepEqual(result.value.children[0].type, "run");
+ },
+
"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]);