aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-12-20 20:40:31 +0000
committerMichael Williamson <mike@zwobble.org>2015-12-20 20:40:31 +0000
commit1c582ffacd0e18d6be385285e54495945d8ec400 (patch)
tree3edb8960563ffdf0bffbce7399f19dccc29c13ca
parentcdf41f916220977b758d681e1e96436ff13daca8 (diff)
Always use mc:Fallback when reading mc:AlternateContent elements
-rw-r--r--NEWS4
-rw-r--r--lib/docx/office-xml-reader.js23
-rw-r--r--tests/docx/office-xml-reader.tests.js26
3 files changed, 52 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index e8d925c..131bd7b 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+# 0.3.29
+
+* Always use mc:Fallback when reading mc:AlternateContent elements.
+
# 0.3.28
* Avoid inserting newlines around inline elements when pretty-printing HTML.
diff --git a/lib/docx/office-xml-reader.js b/lib/docx/office-xml-reader.js
index 93d1d34..f9e0b8b 100644
--- a/lib/docx/office-xml-reader.js
+++ b/lib/docx/office-xml-reader.js
@@ -1,7 +1,10 @@
+var _ = require("underscore");
+
var promises = require("../promises");
var xml = require("../xml");
+exports.read = read;
exports.readXmlFromZipFile = readXmlFromZipFile;
var xmlNamespaceMap = {
@@ -18,7 +21,11 @@ var xmlNamespaceMap = {
function read(xmlString) {
- return xml.readString(xmlString, xmlNamespaceMap);
+ return xml.readString(xmlString, xmlNamespaceMap)
+ .then(function(document) {
+ document.root = collapseAlternateContent(document.root)[0];
+ return document;
+ });
}
@@ -36,3 +43,17 @@ function readXmlFromZipFile(docxFile, path) {
function stripUtf8Bom(xmlString) {
return xmlString.replace(/^\uFEFF/g, '');
}
+
+
+function collapseAlternateContent(node) {
+ if (node.type === "element") {
+ if (node.name === "mc:AlternateContent") {
+ return node.first("mc:Fallback").children;
+ } else {
+ node.children = _.flatten(node.children.map(collapseAlternateContent, true));
+ return [node];
+ }
+ } else {
+ return [node];
+ }
+}
diff --git a/tests/docx/office-xml-reader.tests.js b/tests/docx/office-xml-reader.tests.js
new file mode 100644
index 0000000..9d202ba
--- /dev/null
+++ b/tests/docx/office-xml-reader.tests.js
@@ -0,0 +1,26 @@
+var assert = require("assert");
+
+var xml = require("../../lib/xml");
+var officeXmlReader = require("../../lib/docx/office-xml-reader");
+var test = require("../testing").test;
+
+
+describe("office-xml-reader", function() {
+ test("mc:AlternateContent is replaced by contents of mc:Fallback", function() {
+ var xmlString =
+ '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' +
+ '<numbering xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">' +
+ '<mc:AlternateContent>' +
+ '<mc:Choice Requires="w14">' +
+ '<choice/>' +
+ '</mc:Choice>' +
+ '<mc:Fallback>' +
+ '<fallback/>' +
+ '</mc:Fallback>' +
+ '</mc:AlternateContent>' +
+ '</numbering>';
+ return officeXmlReader.read(xmlString).then(function(element) {
+ assert.deepEqual(element.root.children, [xml.element("fallback")]);
+ });
+ });
+});