it("should pack all additional headers and footers", async function() { file.createFooter(); file.createFooter(); file.createHeader(); file.createHeader(); this.timeout(99999999); const zipFile = compiler.compile(file); const fileNames = Object.keys(zipFile.files).map((f) => zipFile.files[f].name); expect(fileNames).is.an.instanceof(Array); expect(fileNames).has.length(26); expect(fileNames).to.include("word/header1.xml"); expect(fileNames).to.include("word/_rels/header1.xml.rels"); expect(fileNames).to.include("word/header2.xml"); expect(fileNames).to.include("word/_rels/header2.xml.rels"); expect(fileNames).to.include("word/header3.xml"); expect(fileNames).to.include("word/_rels/header3.xml.rels"); expect(fileNames).to.include("word/footer1.xml"); expect(fileNames).to.include("word/_rels/footer1.xml.rels"); expect(fileNames).to.include("word/footer2.xml"); expect(fileNames).to.include("word/_rels/footer2.xml.rels"); expect(fileNames).to.include("word/footer3.xml"); expect(fileNames).to.include("word/_rels/footer3.xml.rels"); });
beforeEach(() => { file = new File({ creator: "Dolan Miu", revision: "1", lastModifiedBy: "Dolan Miu", }); const paragraph = new Paragraph("test text"); const heading = new Paragraph("Hello world").heading1(); file.addParagraph(new Paragraph("title").title()); file.addParagraph(heading); file.addParagraph(new Paragraph("heading 2").heading2()); file.addParagraph(paragraph); packer = new Packer(); });
describe("Compiler", () => { let compiler: Compiler; let file: File; beforeEach(() => { file = new File(); compiler = new Compiler(); }); describe("#compile()", () => { it("should pack all the content", async function() { this.timeout(99999999); const zipFile = compiler.compile(file); const fileNames = Object.keys(zipFile.files).map((f) => zipFile.files[f].name); expect(fileNames).is.an.instanceof(Array); expect(fileNames).has.length(18); expect(fileNames).to.include("word/document.xml"); expect(fileNames).to.include("word/styles.xml"); expect(fileNames).to.include("docProps/core.xml"); expect(fileNames).to.include("docProps/app.xml"); expect(fileNames).to.include("word/numbering.xml"); expect(fileNames).to.include("word/header1.xml"); expect(fileNames).to.include("word/_rels/header1.xml.rels"); expect(fileNames).to.include("word/footer1.xml"); expect(fileNames).to.include("word/footnotes.xml"); expect(fileNames).to.include("word/settings.xml"); expect(fileNames).to.include("word/_rels/footer1.xml.rels"); expect(fileNames).to.include("word/_rels/document.xml.rels"); expect(fileNames).to.include("[Content_Types].xml"); expect(fileNames).to.include("_rels/.rels"); }); it("should pack all additional headers and footers", async function() { file.createFooter(); file.createFooter(); file.createHeader(); file.createHeader(); this.timeout(99999999); const zipFile = compiler.compile(file); const fileNames = Object.keys(zipFile.files).map((f) => zipFile.files[f].name); expect(fileNames).is.an.instanceof(Array); expect(fileNames).has.length(26); expect(fileNames).to.include("word/header1.xml"); expect(fileNames).to.include("word/_rels/header1.xml.rels"); expect(fileNames).to.include("word/header2.xml"); expect(fileNames).to.include("word/_rels/header2.xml.rels"); expect(fileNames).to.include("word/header3.xml"); expect(fileNames).to.include("word/_rels/header3.xml.rels"); expect(fileNames).to.include("word/footer1.xml"); expect(fileNames).to.include("word/_rels/footer1.xml.rels"); expect(fileNames).to.include("word/footer2.xml"); expect(fileNames).to.include("word/_rels/footer2.xml.rels"); expect(fileNames).to.include("word/footer3.xml"); expect(fileNames).to.include("word/_rels/footer3.xml.rels"); }); }); });
private xmlifyFile(file: File): IXmlifyedFileMapping { file.verifyUpdateFields(); const documentRelationshipCount = file.DocumentRelationships.RelationshipCount + 1; return { Relationships: { data: (() => { const xmlData = xml(this.formatter.format(file.Document)); const mediaDatas = this.imageReplacer.getMediaData(xmlData, file.Media); mediaDatas.forEach((mediaData, i) => { file.DocumentRelationships.createRelationship( documentRelationshipCount + i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${mediaData.fileName}`, ); }); return xml(this.formatter.format(file.DocumentRelationships)); })(), path: "word/_rels/document.xml.rels", }, Document: { data: (() => { const tempXmlData = xml(this.formatter.format(file.Document), true); const mediaDatas = this.imageReplacer.getMediaData(tempXmlData, file.Media); const xmlData = this.imageReplacer.replace(tempXmlData, mediaDatas, documentRelationshipCount); return xmlData; })(), path: "word/document.xml", }, Styles: { data: xml(this.formatter.format(file.Styles)), path: "word/styles.xml", }, Properties: { data: xml(this.formatter.format(file.CoreProperties), { declaration: { standalone: "yes", encoding: "UTF-8", }, }), path: "docProps/core.xml", }, Numbering: { data: xml(this.formatter.format(file.Numbering)), path: "word/numbering.xml", }, FileRelationships: { data: xml(this.formatter.format(file.FileRelationships)), path: "_rels/.rels", }, HeaderRelationships: file.Headers.map((headerWrapper, index) => { const xmlData = xml(this.formatter.format(headerWrapper.Header)); const mediaDatas = this.imageReplacer.getMediaData(xmlData, file.Media); mediaDatas.forEach((mediaData, i) => { headerWrapper.Relationships.createRelationship( i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${mediaData.fileName}`, ); }); return { data: xml(this.formatter.format(headerWrapper.Relationships)), path: `word/_rels/header${index + 1}.xml.rels`, }; }), FooterRelationships: file.Footers.map((footerWrapper, index) => { const xmlData = xml(this.formatter.format(footerWrapper.Footer)); const mediaDatas = this.imageReplacer.getMediaData(xmlData, file.Media); mediaDatas.forEach((mediaData, i) => { footerWrapper.Relationships.createRelationship( i, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", `media/${mediaData.fileName}`, ); }); return { data: xml(this.formatter.format(footerWrapper.Relationships)), path: `word/_rels/footer${index + 1}.xml.rels`, }; }), Headers: file.Headers.map((headerWrapper, index) => { const tempXmlData = xml(this.formatter.format(headerWrapper.Header)); const mediaDatas = this.imageReplacer.getMediaData(tempXmlData, file.Media); // TODO: 0 needs to be changed when headers get relationships of their own const xmlData = this.imageReplacer.replace(tempXmlData, mediaDatas, 0); return { data: xmlData, path: `word/header${index + 1}.xml`, }; }), Footers: file.Footers.map((footerWrapper, index) => { const tempXmlData = xml(this.formatter.format(footerWrapper.Footer)); const mediaDatas = this.imageReplacer.getMediaData(tempXmlData, file.Media); // TODO: 0 needs to be changed when headers get relationships of their own const xmlData = this.imageReplacer.replace(tempXmlData, mediaDatas, 0); return { data: xmlData, path: `word/footer${index + 1}.xml`, }; }), ContentTypes: { data: xml(this.formatter.format(file.ContentTypes)), path: "[Content_Types].xml", }, AppProperties: { data: xml(this.formatter.format(file.AppProperties)), path: "docProps/app.xml", }, FootNotes: { data: xml(this.formatter.format(file.FootNotes)), path: "word/footnotes.xml", }, Settings: { data: xml(this.formatter.format(file.Settings)), path: "word/settings.xml", }, }; }