diff options
Diffstat (limited to 'lib/docx/body-reader.js')
| -rw-r--r-- | lib/docx/body-reader.js | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js index a4a6c0c..2726b76 100644 --- a/lib/docx/body-reader.js +++ b/lib/docx/body-reader.js @@ -7,6 +7,7 @@ var _ = require("underscore"); var documents = require("../documents"); var Result = require("../results").Result; var warning = require("../results").warning; +var xml = require("../xml"); var uris = require("./uris"); function createBodyReader(options) { @@ -157,21 +158,26 @@ function BodyReader(options) { return elementResultWithMessages({styleId: styleId, name: name}, messages); } - var unknownComplexField = {type: "unknown"}; - function readFldChar(element) { var type = element.attributes["w:fldCharType"]; if (type === "begin") { - complexFieldStack.push(unknownComplexField); + complexFieldStack.push({type: "begin", fldChar: element}); currentInstrText = []; } else if (type === "end") { var complexFieldEnd = complexFieldStack.pop(); if (complexFieldEnd.type === "checkbox") { - return elementResult(documents.checkbox({checked: false})); + return elementResult(documents.checkbox({ + checked: complexFieldEnd.checked + })); } } else if (type === "separate") { - var complexField = parseInstrText(currentInstrText.join('')); - complexFieldStack.pop(); + var complexFieldSeparate = complexFieldStack.pop(); + var complexField = parseInstrText( + currentInstrText.join(''), + complexFieldSeparate.type === "begin" + ? complexFieldSeparate.fldChar + : xml.emptyElement + ); complexFieldStack.push(complexField); } return emptyResult(); @@ -184,7 +190,7 @@ function BodyReader(options) { return topHyperlink ? topHyperlink.options : null; } - function parseInstrText(instrText) { + function parseInstrText(instrText, fldChar) { var externalLinkResult = /\s*HYPERLINK "(.*)"/.exec(instrText); if (externalLinkResult) { return {type: "hyperlink", options: {href: externalLinkResult[1]}}; @@ -197,10 +203,17 @@ function BodyReader(options) { var checkboxResult = /\s*FORMCHECKBOX\s*/.exec(instrText); if (checkboxResult) { - return {type: "checkbox"}; + var checkboxElement = fldChar + .firstOrEmpty("w:ffData") + .firstOrEmpty("w:checkBox"); + var defaultValue = readBooleanElement( + checkboxElement.first("w:default") + ); + var checked = defaultValue; + return {type: "checkbox", checked: checked}; } - return unknownComplexField; + return {type: "unknown"}; } function readInstrText(element) { |
