diff options
| -rw-r--r-- | lib/content-types-reader.js | 19 | ||||
| -rw-r--r-- | tests/content-types-reader.tests.js | 10 |
2 files changed, 26 insertions, 3 deletions
diff --git a/lib/content-types-reader.js b/lib/content-types-reader.js index 0346b8c..0a74eb9 100644 --- a/lib/content-types-reader.js +++ b/lib/content-types-reader.js @@ -13,18 +13,31 @@ function readContentTypesFromZipFile(file) { function readContentTypesFromXml(xml) { var extensionDefaults = {}; + var overrides = {}; xml.root.children.forEach(function(child) { if (child.name === "content-types:Default") { extensionDefaults[child.attributes.Extension] = child.attributes.ContentType; } + if (child.name === "content-types:Override") { + var name = child.attributes.PartName; + if (name.charAt(0) === "/") { + name = name.substring(1); + } + overrides[name] = child.attributes.ContentType; + } }); return { findContentType: function(path) { - var pathParts = path.split("."); - var extension = pathParts[pathParts.length - 1]; - return extensionDefaults[extension]; + var overrideContentType = overrides[path]; + if (overrideContentType) { + return overrideContentType; + } else { + var pathParts = path.split("."); + var extension = pathParts[pathParts.length - 1]; + return extensionDefaults[extension]; + } } } } diff --git a/tests/content-types-reader.tests.js b/tests/content-types-reader.tests.js index 7cd7295..df7ed47 100644 --- a/tests/content-types-reader.tests.js +++ b/tests/content-types-reader.tests.js @@ -14,4 +14,14 @@ describe('readContentTypesFromXml', function() { }); assert.equal(contentTypes.findContentType("word/media/hat.png"), "image/png"); }); + + test('reads overrides in preference to defaults', function() { + var contentTypes = readContentTypesFromXml({ + root: new XmlElement("content-types:Types", {}, [ + new XmlElement("content-types:Default", {Extension: "png", ContentType: "image/png"}), + new XmlElement("content-types:Override", {PartName: "/word/media/hat.png", ContentType: "image/hat"}) + ]) + }); + assert.equal(contentTypes.findContentType("word/media/hat.png"), "image/hat"); + }); }); |
