diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-05-18 20:08:38 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-05-18 20:08:38 +0100 |
| commit | c2d5d7043644cbd3e0a8bfe3d9251cc5eca811d4 (patch) | |
| tree | 92bd77fd3448f52f1de28239a37e354cc63feb44 | |
| parent | 1c007ffd3b0d736f99306d448341868e35eee187 (diff) | |
Avoid parsing URI when replacing fragment
| -rw-r--r-- | lib/docx/body-reader.js | 8 | ||||
| -rw-r--r-- | lib/docx/uris.js | 10 | ||||
| -rw-r--r-- | test/docx/body-reader.tests.js | 11 |
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]); |
