diff options
| author | Jonathan Lehman <jonathan.lehman91@gmail.com> | 2017-02-06 15:35:05 -0500 |
|---|---|---|
| committer | Jonathan Lehman <jonathan.lehman91@gmail.com> | 2017-02-06 15:35:05 -0500 |
| commit | 66e054e0f686dad8cd282dd01660e17b156b58e3 (patch) | |
| tree | b404d433dcd05bb1b48b17b807344c700bad526c | |
| parent | ee0baa36779e3ae2f2da9abe7e1c1c83fdcdf8fb (diff) | |
Refactor creating hyperlinks from complex fields
| -rw-r--r-- | lib/docx/body-reader.js | 21 | ||||
| -rw-r--r-- | test/docx/body-reader.tests.js | 51 |
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) { |
