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.
179 lines
6.5 KiB
179 lines
6.5 KiB
var assert = require("assert");
|
|
|
|
var docxReader = require("../../lib/docx/docx-reader");
|
|
var documents = require("../../lib/documents");
|
|
var xml = require("../../lib/xml");
|
|
|
|
var testing = require("../testing");
|
|
var test = require("../test")(module);
|
|
var testData = testing.testData;
|
|
var createFakeDocxFile = testing.createFakeDocxFile;
|
|
|
|
|
|
test("can read document with single paragraph with single run of text", function() {
|
|
var expectedDocument = documents.Document([
|
|
documents.Paragraph([
|
|
documents.Run([
|
|
documents.Text("Hello.")
|
|
])
|
|
])
|
|
]);
|
|
var docxFile = createFakeDocxFile({
|
|
"word/document.xml": testData("simple/word/document.xml")
|
|
});
|
|
return docxReader.read(docxFile).then(function(result) {
|
|
assert.deepEqual(expectedDocument, result.value);
|
|
});
|
|
});
|
|
|
|
test("hyperlink hrefs are read from relationships file", function() {
|
|
var docxFile = createFakeDocxFile({
|
|
"word/document.xml": testData("hyperlinks/word/document.xml"),
|
|
"word/_rels/document.xml.rels": testData("hyperlinks/word/_rels/document.xml.rels")
|
|
});
|
|
return docxReader.read(docxFile).then(function(result) {
|
|
var paragraph = result.value.children[0];
|
|
assert.equal(1, paragraph.children.length);
|
|
var hyperlink = paragraph.children[0];
|
|
assert.equal(hyperlink.href, "http://www.example.com");
|
|
assert.equal(hyperlink.children.length, 1);
|
|
});
|
|
});
|
|
|
|
var relationshipNamespaces = {
|
|
"r": "http://schemas.openxmlformats.org/package/2006/relationships"
|
|
};
|
|
|
|
test("main document is found using _rels/.rels", function() {
|
|
var relationships = xml.element("r:Relationships", {}, [
|
|
xml.element("r:Relationship", {
|
|
"Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
|
"Target": "/word/document2.xml"
|
|
})
|
|
]);
|
|
|
|
var docxFile = createFakeDocxFile({
|
|
"word/document2.xml": testData("simple/word/document.xml"),
|
|
"_rels/.rels": xml.writeString(relationships, relationshipNamespaces)
|
|
});
|
|
var expectedDocument = documents.Document([
|
|
documents.Paragraph([
|
|
documents.Run([
|
|
documents.Text("Hello.")
|
|
])
|
|
])
|
|
]);
|
|
return docxReader.read(docxFile).then(function(result) {
|
|
assert.deepEqual(expectedDocument, result.value);
|
|
});
|
|
});
|
|
|
|
|
|
test("error is thrown when main document part does not exist", function() {
|
|
var relationships = xml.element("r:Relationships", {}, [
|
|
xml.element("r:Relationship", {
|
|
"Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
|
"Target": "/word/document2.xml"
|
|
})
|
|
]);
|
|
|
|
var docxFile = createFakeDocxFile({
|
|
"_rels/.rels": xml.writeString(relationships, relationshipNamespaces)
|
|
});
|
|
return docxReader.read(docxFile).then(function(result) {
|
|
assert.ok(false, "Expected error");
|
|
}, function(error) {
|
|
assert.equal(error.message, "Could not find main document part. Are you sure this is a valid .docx file?");
|
|
});
|
|
});
|
|
|
|
|
|
test("part paths", {
|
|
"main document part is found using package relationships": function() {
|
|
var relationships = xml.element("r:Relationships", {}, [
|
|
xml.element("r:Relationship", {
|
|
"Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
|
"Target": "/word/document2.xml"
|
|
})
|
|
]);
|
|
|
|
var docxFile = createFakeDocxFile({
|
|
"word/document2.xml": " ",
|
|
"_rels/.rels": xml.writeString(relationships, relationshipNamespaces)
|
|
});
|
|
return docxReader._findPartPaths(docxFile).then(function(partPaths) {
|
|
assert.equal(partPaths.mainDocument, "word/document2.xml");
|
|
});
|
|
},
|
|
|
|
"word/document.xml is used as fallback location for main document part": function() {
|
|
var docxFile = createFakeDocxFile({
|
|
"word/document.xml": " "
|
|
});
|
|
return docxReader._findPartPaths(docxFile).then(function(partPaths) {
|
|
assert.equal(partPaths.mainDocument, "word/document.xml");
|
|
});
|
|
}
|
|
});
|
|
|
|
[
|
|
{
|
|
name: "comments",
|
|
type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments"
|
|
},
|
|
{
|
|
name: "endnotes",
|
|
type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes"
|
|
},
|
|
{
|
|
name: "footnotes",
|
|
type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"
|
|
},
|
|
{
|
|
name: "numbering",
|
|
type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering"
|
|
},
|
|
{
|
|
name: "styles",
|
|
type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"
|
|
}
|
|
].forEach(function(options) {
|
|
test(options.name + " part is found using main document relationships", function() {
|
|
var docxFile = createFakeDocxFile({
|
|
"_rels/.rels": createPackageRelationships("word/document.xml"),
|
|
"word/document.xml": " ",
|
|
"word/_rels/document.xml.rels": xml.writeString(xml.element("r:Relationships", {}, [
|
|
xml.element("r:Relationship", {
|
|
"Type": options.type,
|
|
"Target": "target-path.xml"
|
|
})
|
|
]), relationshipNamespaces),
|
|
"word/target-path.xml": " "
|
|
});
|
|
return docxReader._findPartPaths(docxFile).then(function(partPaths) {
|
|
assert.equal(partPaths[options.name], "word/target-path.xml");
|
|
});
|
|
});
|
|
|
|
test("word/" + options.name + ".xml is used as fallback location for " + options.name + " part", function() {
|
|
var zipContents = {
|
|
"_rels/.rels": createPackageRelationships("word/document.xml"),
|
|
"word/document.xml": " "
|
|
};
|
|
zipContents["word/" + options.name + ".xml"] = " ";
|
|
var docxFile = createFakeDocxFile(zipContents);
|
|
return docxReader._findPartPaths(docxFile).then(function(partPaths) {
|
|
assert.equal(partPaths[options.name], "word/" + options.name + ".xml");
|
|
});
|
|
});
|
|
});
|
|
|
|
|
|
function createPackageRelationships(mainDocumentPath) {
|
|
return xml.writeString(xml.element("r:Relationships", {}, [
|
|
xml.element("r:Relationship", {
|
|
"Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
|
"Target": mainDocumentPath
|
|
})
|
|
]), relationshipNamespaces);
|
|
}
|
|
|