From 1c582ffacd0e18d6be385285e54495945d8ec400 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 20 Dec 2015 20:40:31 +0000 Subject: Always use mc:Fallback when reading mc:AlternateContent elements --- NEWS | 4 ++++ lib/docx/office-xml-reader.js | 23 ++++++++++++++++++++++- tests/docx/office-xml-reader.tests.js | 26 ++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 tests/docx/office-xml-reader.tests.js 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 = + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + return officeXmlReader.read(xmlString).then(function(element) { + assert.deepEqual(element.root.children, [xml.element("fallback")]); + }); + }); +}); -- cgit v1.2.3