aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-11-30 11:54:54 +0000
committerMichael Williamson <mike@zwobble.org>2024-11-30 11:54:54 +0000
commit888a3bd67f658e8a3894eb5e2ece3c14cd2e9179 (patch)
tree3a0a1ee2a2f6a3d8fc37cc58740d0d82f28e7461
parentce471de77aa93bd2f6516c12f0b8e989382acf86 (diff)
Handle complex field checkboxes without separate field char
-rw-r--r--lib/docx/body-reader.js19
-rw-r--r--test/docx/body-reader.tests.js54
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")