aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Lehman <jonathan.lehman91@gmail.com>2017-02-06 15:35:05 -0500
committerJonathan Lehman <jonathan.lehman91@gmail.com>2017-02-06 15:35:05 -0500
commit66e054e0f686dad8cd282dd01660e17b156b58e3 (patch)
treeb404d433dcd05bb1b48b17b807344c700bad526c
parentee0baa36779e3ae2f2da9abe7e1c1c83fdcdf8fb (diff)
Refactor creating hyperlinks from complex fields
-rw-r--r--lib/docx/body-reader.js21
-rw-r--r--test/docx/body-reader.tests.js51
2 files changed, 45 insertions, 27 deletions
diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js
index 8e71aa6..a247e93 100644
--- a/lib/docx/body-reader.js
+++ b/lib/docx/body-reader.js
@@ -6,10 +6,10 @@ var documents = require("../documents");
var Result = require("../results").Result;
var warning = require("../results").warning;
var uriToZipEntryName = require("./uris").uriToZipEntryName;
-var lastInstrText = null;
function BodyReader(options) {
+ var complexFieldData = [];
var relationships = options.relationships;
var contentTypes = options.contentTypes;
var docxFile = options.docxFile;
@@ -136,8 +136,11 @@ function BodyReader(options) {
var properties = _.find(children, isRunProperties);
var filteredChildren = children.filter(negate(isRunProperties));
- if (properties && properties.styleName === 'Hyperlink' && lastInstrText) {
- return new documents.Hyperlink(filteredChildren, {href: parseHyperlink(lastInstrText)});
+ if (properties && properties.styleId === 'Hyperlink' && complexFieldData.length === 1) {
+ return new documents.Run(
+ [new documents.Hyperlink(filteredChildren, {href: parseHyperlinkFieldCode(complexFieldData)})],
+ properties
+ );
}
return new documents.Run(filteredChildren, properties);
@@ -147,12 +150,12 @@ function BodyReader(options) {
"w:fldChar": function(element) {
var type = element.attributes["w:fldCharType"];
if (type === 'end') {
- clearState();
+ complexFieldData = [];
}
return emptyResult();
},
"w:instrText": function(element) {
- lastInstrText = (element.children[0] || {}).value || '';
+ complexFieldData.push(element.children[0].value);
return emptyResult();
},
"w:t": function(element) {
@@ -506,10 +509,6 @@ function identity(value) {
return value;
}
-function clearState() {
- lastInstrText = null;
-}
-
-function parseHyperlink(instrText) {
- return (instrText.match(/HYPERLINK "(.*)"/) || [])[1];
+function parseHyperlinkFieldCode(complexFieldData) {
+ return (complexFieldData[0].match(/HYPERLINK "(.*)"/) || [])[1];
}
diff --git a/test/docx/body-reader.tests.js b/test/docx/body-reader.tests.js
index d1f0311..e0878a6 100644
--- a/test/docx/body-reader.tests.js
+++ b/test/docx/body-reader.tests.js
@@ -148,9 +148,39 @@ test("stores instrText returns empty result", function() {
});
test("run is wrapped in a hyperlink if the runStyle is Hyperlink", function() {
- var hyperlink = createHyperlink("http://example.com");
+ var uri = "http://example.com";
+ var beginXml = new XmlElement("w:r", {}, [
+ new XmlElement("w:fldChar", {"w:fldCharType": "begin"})
+ ]);
+ var endXml = new XmlElement("w:r", {}, [
+ new XmlElement("w:fldChar", {"w:fldCharType": "end"})
+ ]);
+ var instrTextXml = new XmlElement("w:instrText", {}, [xml.text(' HYPERLINK "' + uri + '"')]);
+ var hyperlinkRunXml = createHyperlinkRunXml('this is a hyperlink');
+ var afterEndXml = createHyperlinkRunXml('this will not be a hyperlink');
+ var parXml = new XmlElement("w:p", {}, [
+ beginXml,
+ instrTextXml,
+ hyperlinkRunXml,
+ endXml,
+ afterEndXml
+ ]);
+ var styles = new Styles({}, {"Hyperlink": {name: "Hyperlink"}});
+ var paragraph = readXmlElementValue(parXml, {styles: styles});
+
+ var hyperlinkRun = paragraph.children[1];
+ var hyperlink = hyperlinkRun.children[0];
assert.equal(hyperlink.type, 'hyperlink');
- assert.equal(hyperlink.href, 'http://example.com');
+ assert.equal(hyperlink.href, uri);
+ var hyperlinkText = hyperlink.children[0];
+ assert.equal(hyperlinkText.type, 'text');
+ assert.equal(hyperlinkText.value, 'this is a hyperlink');
+
+ // runs after fldCharType "end" do not become hyperlinks
+ var run = paragraph.children[3];
+ var text = run.children[0];
+ assert.equal(text.type, 'text');
+ assert.equal(text.value, 'this will not be a hyperlink');
});
test("run has no style if it has no properties", function() {
@@ -873,21 +903,10 @@ function createLinkedBlip(relationshipId) {
return new XmlElement("a:blip", {"r:link": relationshipId});
}
-function createHyperlink(link) {
- var beginXml = new XmlElement("w:r", {}, [
- new XmlElement("w:fldChar", {"w:fldCharType": "begin"})
- ]);
- var endXml = new XmlElement("w:r", {}, [
- new XmlElement("w:fldChar", {"w:fldCharType": "end"})
- ]);
- var instrTextXml = new XmlElement("w:instrText", {}, [xml.text(' HYPERLINK "' + link + '"')]);
- var instrRunXml = new XmlElement("w:r", {}, [instrTextXml]);
+function createHyperlinkRunXml(text) {
var styleXml = new XmlElement("w:rStyle", {"w:val": "Hyperlink"});
- var runStyleXml = runWithProperties([styleXml]);
- var parXml = new XmlElement("w:p", {}, [beginXml, instrRunXml, runStyleXml, endXml]);
- var styles = new Styles({}, {"Hyperlink": {name: "Hyperlink"}});
- var par = readXmlElementValue(parXml, {styles: styles});
- return par.children[2];
+ var textXml = new XmlElement("w:t", {}, [xml.text(text)]);
+ return new XmlElement("w:r", {}, [createRunPropertiesXml([styleXml]), textXml]);
}
function assertImageBuffer(element, expectedImageBuffer) {