123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- var _ = require("underscore");
- var promises = require("../promises");
- var xml = require("../xml");
- exports.writeStyleMap = writeStyleMap;
- exports.readStyleMap = readStyleMap;
- var schema = "http://schemas.zwobble.org/mammoth/style-map";
- var styleMapPath = "mammoth/style-map";
- var styleMapAbsolutePath = "/" + styleMapPath;
- function writeStyleMap(docxFile, styleMap) {
- docxFile.write(styleMapPath, styleMap);
- return updateRelationships(docxFile).then(function() {
- return updateContentTypes(docxFile);
- });
- }
- function updateRelationships(docxFile) {
- var path = "word/_rels/document.xml.rels";
- var relationshipsUri = "http://schemas.openxmlformats.org/package/2006/relationships";
- var relationshipElementName = "{" + relationshipsUri + "}Relationship";
- return docxFile.read(path, "utf8")
- .then(xml.readString)
- .then(function(relationshipsContainer) {
- var relationships = relationshipsContainer.children;
- addOrUpdateElement(relationships, relationshipElementName, "Id", {
- "Id": "rMammothStyleMap",
- "Type": schema,
- "Target": styleMapAbsolutePath
- });
-
- var namespaces = {"": relationshipsUri};
- return docxFile.write(path, xml.writeString(relationshipsContainer, namespaces));
- });
- }
- function updateContentTypes(docxFile) {
- var path = "[Content_Types].xml";
- var contentTypesUri = "http://schemas.openxmlformats.org/package/2006/content-types";
- var overrideName = "{" + contentTypesUri + "}Override";
- return docxFile.read(path, "utf8")
- .then(xml.readString)
- .then(function(typesElement) {
- var children = typesElement.children;
- addOrUpdateElement(children, overrideName, "PartName", {
- "PartName": styleMapAbsolutePath,
- "ContentType": "text/prs.mammoth.style-map"
- });
- var namespaces = {"": contentTypesUri};
- return docxFile.write(path, xml.writeString(typesElement, namespaces));
- });
- }
- function addOrUpdateElement(elements, name, identifyingAttribute, attributes) {
- var existingElement = _.find(elements, function(element) {
- return element.name === name &&
- element.attributes[identifyingAttribute] === attributes[identifyingAttribute];
- });
- if (existingElement) {
- existingElement.attributes = attributes;
- } else {
- elements.push(xml.element(name, attributes));
- }
- }
- function readStyleMap(docxFile) {
- if (docxFile.exists(styleMapPath)) {
- return docxFile.read(styleMapPath, "utf8");
- } else {
- return promises.resolve(null);
- }
- }
|