diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-12-20 20:40:31 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-12-20 20:40:31 +0000 |
| commit | 1c582ffacd0e18d6be385285e54495945d8ec400 (patch) | |
| tree | 3edb8960563ffdf0bffbce7399f19dccc29c13ca | |
| parent | cdf41f916220977b758d681e1e96436ff13daca8 (diff) | |
Always use mc:Fallback when reading mc:AlternateContent elements
| -rw-r--r-- | NEWS | 4 | ||||
| -rw-r--r-- | lib/docx/office-xml-reader.js | 23 | ||||
| -rw-r--r-- | tests/docx/office-xml-reader.tests.js | 26 |
3 files changed, 52 insertions, 1 deletions
@@ -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")]); + }); + }); +}); |
