Add next gen compiler using JSZip
This commit is contained in:
117
src/export/packer/next-compiler.ts
Normal file
117
src/export/packer/next-compiler.ts
Normal file
@ -0,0 +1,117 @@
|
||||
import * as JSZip from "jszip";
|
||||
import * as xml from "xml";
|
||||
|
||||
import { File } from "file";
|
||||
import { Formatter } from "../formatter";
|
||||
|
||||
interface IXmlifyedFile {
|
||||
data: string;
|
||||
path: string;
|
||||
}
|
||||
|
||||
interface IXmlifyedFileMapping {
|
||||
Document: IXmlifyedFile;
|
||||
Styles: IXmlifyedFile;
|
||||
Properties: IXmlifyedFile;
|
||||
Numbering: IXmlifyedFile;
|
||||
Relationships: IXmlifyedFile;
|
||||
FileRelationships: IXmlifyedFile;
|
||||
Header: IXmlifyedFile;
|
||||
Footer: IXmlifyedFile;
|
||||
HeaderRelationships: IXmlifyedFile;
|
||||
FooterRelationships: IXmlifyedFile;
|
||||
ContentTypes: IXmlifyedFile;
|
||||
AppProperties: IXmlifyedFile;
|
||||
}
|
||||
|
||||
export class Compiler {
|
||||
private formatter: Formatter;
|
||||
|
||||
constructor(private file: File) {
|
||||
this.formatter = new Formatter();
|
||||
}
|
||||
|
||||
public compile(): JSZip {
|
||||
const zip = new JSZip();
|
||||
|
||||
const xmlifiedFileMapping = this.xmlifyFile(this.file);
|
||||
|
||||
for (const key in xmlifiedFileMapping) {
|
||||
if (!xmlifiedFileMapping[key]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const xmlifiedFile = xmlifiedFileMapping[key];
|
||||
|
||||
zip.file(xmlifiedFile.path, xmlifiedFile.data);
|
||||
}
|
||||
|
||||
// for (const data of file.Media.array) {
|
||||
// this.archive.append(data.stream, {
|
||||
// name: `word/media/${data.fileName}`,
|
||||
// });
|
||||
|
||||
// zip.file(`word/media/${data.fileName}`, )
|
||||
// }
|
||||
|
||||
return zip;
|
||||
}
|
||||
|
||||
private xmlifyFile(file: File): IXmlifyedFileMapping {
|
||||
return {
|
||||
Document: {
|
||||
data: xml(this.formatter.format(file.Document), true),
|
||||
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",
|
||||
},
|
||||
Relationships: {
|
||||
data: xml(this.formatter.format(file.DocumentRelationships)),
|
||||
path: "word/_rels/document.xml.rels",
|
||||
},
|
||||
FileRelationships: {
|
||||
data: xml(this.formatter.format(file.FileRelationships)),
|
||||
path: "_rels/.rels",
|
||||
},
|
||||
Header: {
|
||||
data: xml(this.formatter.format(file.Header.Header)),
|
||||
path: "word/header1.xml",
|
||||
},
|
||||
Footer: {
|
||||
data: xml(this.formatter.format(file.Footer.Footer)),
|
||||
path: "word/footer1.xml",
|
||||
},
|
||||
HeaderRelationships: {
|
||||
data: xml(this.formatter.format(file.Header.Relationships)),
|
||||
path: "word/_rels/header1.xml.rels",
|
||||
},
|
||||
FooterRelationships: {
|
||||
data: xml(this.formatter.format(file.Footer.Relationships)),
|
||||
path: "word/_rels/footer1.xml.rels",
|
||||
},
|
||||
ContentTypes: {
|
||||
data: xml(this.formatter.format(file.ContentTypes)),
|
||||
path: "[Content_Types].xml",
|
||||
},
|
||||
AppProperties: {
|
||||
data: xml(this.formatter.format(file.AppProperties)),
|
||||
path: "docProps/app.xml",
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user