You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.7 KiB
75 lines
2.7 KiB
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);
|
|
}
|
|
}
|
|
|