diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-11-30 11:54:54 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-11-30 11:54:54 +0000 |
| commit | 888a3bd67f658e8a3894eb5e2ece3c14cd2e9179 (patch) | |
| tree | 3a0a1ee2a2f6a3d8fc37cc58740d0d82f28e7461 | |
| parent | ce471de77aa93bd2f6516c12f0b8e989382acf86 (diff) | |
Handle complex field checkboxes without separate field char
| -rw-r--r-- | lib/docx/body-reader.js | 19 | ||||
| -rw-r--r-- | test/docx/body-reader.tests.js | 54 |
2 files changed, 67 insertions, 6 deletions
diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js index 5a27d2d..3e97d3e 100644 --- a/lib/docx/body-reader.js +++ b/lib/docx/body-reader.js @@ -165,6 +165,9 @@ function BodyReader(options) { currentInstrText = []; } else if (type === "end") { var complexFieldEnd = complexFieldStack.pop(); + if (complexFieldEnd.type === "begin") { + complexFieldEnd = parseCurrentInstrText(complexFieldEnd); + } if (complexFieldEnd.type === "checkbox") { return elementResult(documents.checkbox({ checked: complexFieldEnd.checked @@ -172,12 +175,7 @@ function BodyReader(options) { } } else if (type === "separate") { var complexFieldSeparate = complexFieldStack.pop(); - var complexField = parseInstrText( - currentInstrText.join(''), - complexFieldSeparate.type === "begin" - ? complexFieldSeparate.fldChar - : xml.emptyElement - ); + var complexField = parseCurrentInstrText(complexFieldSeparate); complexFieldStack.push(complexField); } return emptyResult(); @@ -190,6 +188,15 @@ function BodyReader(options) { return topHyperlink ? topHyperlink.options : null; } + function parseCurrentInstrText(complexField) { + return parseInstrText( + currentInstrText.join(''), + complexField.type === "begin" + ? complexField.fldChar + : xml.emptyElement + ); + } + function parseInstrText(instrText, fldChar) { var externalLinkResult = /\s*HYPERLINK "(.*)"/.exec(instrText); if (externalLinkResult) { diff --git a/test/docx/body-reader.tests.js b/test/docx/body-reader.tests.js index 70b0057..ece3af8 100644 --- a/test/docx/body-reader.tests.js +++ b/test/docx/body-reader.tests.js @@ -532,6 +532,60 @@ test("complex fields", (function() { })()); test("checkboxes", { + "complex field checkbox without separate is read": function() { + var paragraphXml = xml.element("w:p", {}, [ + xml.element("w:r", {}, [ + xml.element("w:fldChar", {"w:fldCharType": "begin"}) + ]), + xml.element("w:instrText", {}, [ + xml.text(' FORMCHECKBOX ') + ]), + xml.element("w:r", {}, [ + xml.element("w:fldChar", {"w:fldCharType": "end"}) + ]) + ]); + + var paragraph = readXmlElementValue(paragraphXml); + + assertThat(paragraph.children, contains( + isEmptyRun, + isRun({ + children: contains( + isCheckbox() + ) + }) + )); + }, + + "complex field checkbox with separate is read": function() { + var paragraphXml = xml.element("w:p", {}, [ + xml.element("w:r", {}, [ + xml.element("w:fldChar", {"w:fldCharType": "begin"}) + ]), + xml.element("w:instrText", {}, [ + xml.text(' FORMCHECKBOX ') + ]), + xml.element("w:r", {}, [ + xml.element("w:fldChar", {"w:fldCharType": "separate"}) + ]), + xml.element("w:r", {}, [ + xml.element("w:fldChar", {"w:fldCharType": "end"}) + ]) + ]); + + var paragraph = readXmlElementValue(paragraphXml); + + assertThat(paragraph.children, contains( + isEmptyRun, + isEmptyRun, + isRun({ + children: contains( + isCheckbox() + ) + }) + )); + }, + "complex field checkbox without w:default nor w:checked is unchecked": function() { var paragraphXml = complexFieldCheckboxParagraph([ xml.element("w:checkBox") |
