2020-10-05 16:46:18 +03:00
|
|
|
const w = require("../dist/node");
|
|
|
|
const { readFileSync, writeFileSync } = require("fs");
|
|
|
|
const Zip = require("adm-zip");
|
|
|
|
|
|
|
|
describe("reader", () => {
|
|
|
|
test("should read lvlOverride docx", () => {
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = readFileSync("../fixtures/lvl_override/override.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
2020-10-09 08:11:46 +03:00
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should read gridAfter docx", () => {
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = readFileSync("../fixtures/grid_after/grid_after.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
2020-10-30 13:29:06 +02:00
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
2021-03-22 16:30:58 +02:00
|
|
|
test("should read tr2bl docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/tr2bl/tr2bl.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/tr2bl.json", JSON.stringify(json, null, 2));
|
2021-03-22 16:30:58 +02:00
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
2021-06-23 12:39:01 +03:00
|
|
|
test("should read custom docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/custom/custom.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/custom.json", JSON.stringify(json, null, 2));
|
2021-06-23 12:39:01 +03:00
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
2020-10-30 13:29:06 +02:00
|
|
|
test("should read table style docx", () => {
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = readFileSync("../fixtures/table_style/table_style.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
2020-10-05 16:46:18 +03:00
|
|
|
expect(json).toMatchSnapshot();
|
2020-12-15 15:33:01 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
test("should read extended comments docx", () => {
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = readFileSync(
|
2020-12-18 09:09:48 +02:00
|
|
|
"../fixtures/extended_comments/extended_comments.docx"
|
|
|
|
);
|
2020-12-21 11:44:31 +02:00
|
|
|
const json = w.readDocx(buffer);
|
2020-12-15 15:33:01 +02:00
|
|
|
expect(json).toMatchSnapshot();
|
2020-12-21 10:30:42 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
test("should read multi paragraph comments docx", () => {
|
|
|
|
const buf = readFileSync(
|
|
|
|
"../fixtures/multi_paragraph_comment/multi_paragraph_comment.docx"
|
|
|
|
);
|
|
|
|
const json = w.readDocx(buf);
|
|
|
|
expect(json).toMatchSnapshot();
|
2020-10-05 16:46:18 +03:00
|
|
|
});
|
2021-04-09 05:30:50 +03:00
|
|
|
|
|
|
|
test("should read div docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/div/div.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2021-06-07 18:10:44 +03:00
|
|
|
|
|
|
|
test("should read vertAlign docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/vert_align/vert_align.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2021-09-29 03:03:39 +03:00
|
|
|
|
|
|
|
test("should read line spacing docx", () => {
|
2021-10-20 10:37:51 +03:00
|
|
|
const buffer = readFileSync("../fixtures/line_spacing/line_spacing.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should read outlineLvl docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/outline_lvl/outline_lvl.docx");
|
2021-09-29 03:03:39 +03:00
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2021-11-25 12:42:06 +02:00
|
|
|
|
|
|
|
test("should read afterLines docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/after_lines/after_lines.docx");
|
2021-12-01 17:07:58 +02:00
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
2021-12-14 18:06:32 +02:00
|
|
|
test("should read toc1 docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/toc1/toc1.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
|
|
|
|
2021-12-01 17:07:58 +02:00
|
|
|
test("should read footer docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/footer/footer.docx");
|
2021-11-25 12:42:06 +02:00
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2021-12-21 04:54:27 +02:00
|
|
|
|
|
|
|
test("should read strike docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/strike/strike.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2022-01-14 04:53:39 +02:00
|
|
|
|
|
|
|
test("should read paragraph property change docx", () => {
|
|
|
|
const buffer = readFileSync(
|
|
|
|
"../fixtures/paragraph_property_change/paragraph_property_change.docx"
|
|
|
|
);
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2022-01-18 07:19:23 +02:00
|
|
|
|
|
|
|
test("should read table indent docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/table_indent/table_indent.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2022-03-15 09:58:29 +02:00
|
|
|
|
|
|
|
test("should read del_in_ins docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/del_in_ins/del_in_ins.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2022-03-16 05:24:12 +02:00
|
|
|
|
|
|
|
test("should read font docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/font/font.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2022-03-28 13:40:32 +03:00
|
|
|
|
|
|
|
test("should read image inline and anchor docx", () => {
|
|
|
|
const buffer = readFileSync("../fixtures/image_inline_and_anchor/image_inline_and_anchor.docx");
|
|
|
|
const json = w.readDocx(buffer);
|
|
|
|
expect(json).toMatchSnapshot();
|
|
|
|
});
|
2020-10-05 16:46:18 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
describe("writer", () => {
|
|
|
|
test("should write hello", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!"));
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = new w.Docx().addParagraph(p).build();
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
2020-10-05 16:46:18 +03:00
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2021-12-21 08:47:29 +02:00
|
|
|
test("should write strike", () => {
|
|
|
|
const p = new w.Paragraph().addRun(
|
|
|
|
new w.Run().addText("Hello world!!").strike()
|
|
|
|
);
|
|
|
|
const buffer = new w.Docx().addParagraph(p).build();
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/strike.docx", buffer);
|
2021-12-21 08:47:29 +02:00
|
|
|
});
|
|
|
|
|
2020-10-05 16:46:18 +03:00
|
|
|
test("should write lvlOverride with level", () => {
|
|
|
|
const p = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Hello world!!"))
|
|
|
|
.numbering(0, 0);
|
|
|
|
const num = new w.Numbering(0, 0);
|
|
|
|
num.addOverride(
|
|
|
|
new w.LevelOverride(0).overrideLevel(
|
|
|
|
new w.Level(0, 3, "decimal", "%1", "left")
|
|
|
|
)
|
|
|
|
);
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = new w.Docx()
|
2020-10-05 16:46:18 +03:00
|
|
|
.addParagraph(p)
|
|
|
|
.addAbstractNumbering(new w.AbstractNumbering(0))
|
|
|
|
.addNumbering(num)
|
|
|
|
.build();
|
|
|
|
|
2020-12-21 11:44:31 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
2020-10-05 16:46:18 +03:00
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2020-10-09 14:30:55 +03:00
|
|
|
|
|
|
|
test("should write page size", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!"));
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = new w.Docx().addParagraph(p).pageSize(400, 800).build();
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
2020-10-09 14:30:55 +03:00
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2020-10-12 18:04:09 +03:00
|
|
|
|
2021-03-15 09:47:22 +02:00
|
|
|
test("should write nested table", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!"));
|
|
|
|
const childTable = new w.Table().addRow(
|
|
|
|
new w.TableRow().addCell(new w.TableCell().addParagraph(p))
|
|
|
|
);
|
|
|
|
const parentTable = new w.Table().addRow(
|
|
|
|
new w.TableRow().addCell(new w.TableCell().addTable(childTable))
|
|
|
|
);
|
|
|
|
const buffer = new w.Docx().addTable(parentTable).build();
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/nested_table.docx", buffer);
|
2021-03-15 09:47:22 +02:00
|
|
|
});
|
|
|
|
|
2021-03-16 09:09:39 +02:00
|
|
|
test("should write tl2br and tr2bl cells", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello!!"));
|
|
|
|
const table = new w.Table().addRow(
|
|
|
|
new w.TableRow()
|
|
|
|
.addCell(
|
|
|
|
new w.TableCell()
|
|
|
|
.setBorder(new w.TableCellBorder("tl2br"))
|
|
|
|
.addParagraph(p)
|
|
|
|
)
|
|
|
|
.addCell(
|
|
|
|
new w.TableCell()
|
|
|
|
.setBorder(new w.TableCellBorder("tr2bl"))
|
|
|
|
.addParagraph(p)
|
|
|
|
)
|
|
|
|
.addCell(
|
|
|
|
new w.TableCell()
|
|
|
|
.setBorder(new w.TableCellBorder("tr2bl"))
|
|
|
|
.setBorder(new w.TableCellBorder("tl2br"))
|
|
|
|
.addParagraph(p)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
const buffer = new w.Docx().addTable(table).build();
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/cell_borders.docx", buffer);
|
2021-03-16 09:09:39 +02:00
|
|
|
});
|
|
|
|
|
2021-03-18 12:02:28 +02:00
|
|
|
test("should write cell shading", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello!!"));
|
|
|
|
const table = new w.Table().addRow(
|
|
|
|
new w.TableRow().addCell(
|
2021-03-19 05:31:36 +02:00
|
|
|
new w.TableCell().addParagraph(p).shading("clear", "auto", "FF0000")
|
2021-03-18 12:02:28 +02:00
|
|
|
)
|
|
|
|
);
|
|
|
|
const buffer = new w.Docx().addTable(table).build();
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/cell_shading.docx", buffer);
|
2021-03-18 12:02:28 +02:00
|
|
|
});
|
|
|
|
|
2020-10-12 18:04:09 +03:00
|
|
|
test("should write page margin", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!"));
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = new w.Docx()
|
2020-10-12 18:04:09 +03:00
|
|
|
.addParagraph(p)
|
|
|
|
.pageMargin({ top: 1000, left: 2000 })
|
|
|
|
.build();
|
2020-12-21 11:44:31 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
2020-12-14 08:01:23 +02:00
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should write default font", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!!!"));
|
|
|
|
const fonts = new w.RunFonts()
|
|
|
|
.eastAsia("Arial")
|
|
|
|
.ascii("Arial")
|
|
|
|
.hiAnsi("Arial");
|
2020-12-21 11:44:31 +02:00
|
|
|
const buffer = new w.Docx()
|
2020-12-14 08:01:23 +02:00
|
|
|
.addParagraph(p)
|
|
|
|
.defaultSize(40)
|
|
|
|
.defaultFonts(fonts)
|
|
|
|
.build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/default_font.docx", buffer);
|
2020-12-21 11:44:31 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
2020-12-15 08:38:17 +02:00
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should write doc vars", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!!!"));
|
2021-03-15 09:47:22 +02:00
|
|
|
const buffer = new w.Docx().addParagraph(p).addDocVar("foo", "bar").build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/doc_vars.docx", buffer);
|
2020-12-21 11:44:31 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
2020-10-12 18:04:09 +03:00
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-03-19 18:38:22 +02:00
|
|
|
|
|
|
|
test("should write doc grid", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!!!"));
|
|
|
|
const buffer = new w.Docx().addParagraph(p).docGrid("default", 360).build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/doc_grid.docx", buffer);
|
2021-03-19 18:38:22 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-03-20 17:16:43 +02:00
|
|
|
|
2021-03-23 05:01:09 +02:00
|
|
|
test("should write table layout", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello!!"));
|
|
|
|
const table = new w.Table()
|
|
|
|
.addRow(new w.TableRow().addCell(new w.TableCell().addParagraph(p)))
|
|
|
|
.layout("fixed");
|
|
|
|
const buffer = new w.Docx().addTable(table).build();
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/table_layout.docx", buffer);
|
2021-03-23 05:01:09 +02:00
|
|
|
});
|
|
|
|
|
2021-03-20 17:16:43 +02:00
|
|
|
test("should write text border", () => {
|
|
|
|
const p = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Hello "))
|
|
|
|
.addRun(new w.Run().addText("World!").textBorder("single", 4, 0, "auto"));
|
|
|
|
const buffer = new w.Docx().addParagraph(p).build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/text_border.docx", buffer);
|
2021-03-20 17:16:43 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-03-24 09:51:11 +02:00
|
|
|
|
|
|
|
test("should write page orientation", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello "));
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addParagraph(p)
|
|
|
|
.pageSize(16838, 11906)
|
|
|
|
.pageOrientation("landscape")
|
|
|
|
.build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/page_orientation.docx", buffer);
|
2021-03-24 09:51:11 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-06-23 12:39:01 +03:00
|
|
|
|
|
|
|
test("should write custom props", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello!!"));
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addParagraph(p)
|
2021-06-30 16:37:13 +03:00
|
|
|
.customProperty("hello", '{"world": 0}')
|
2021-06-23 12:39:01 +03:00
|
|
|
.build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/custom.docx", buffer);
|
2021-06-23 12:39:01 +03:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml|custom.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-06-30 16:37:13 +03:00
|
|
|
|
|
|
|
test("should write webextension", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello!!"));
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addParagraph(p)
|
|
|
|
.taskpanes()
|
|
|
|
.webextension(
|
|
|
|
new w.WebExtension(
|
|
|
|
"7f33b723-fb58-4524-8733-dbedc4b7c095",
|
2021-07-09 07:04:48 +03:00
|
|
|
"abcd",
|
2021-06-30 16:37:13 +03:00
|
|
|
"1.0.0.0",
|
|
|
|
"developer",
|
|
|
|
"Registry"
|
2021-07-01 10:54:03 +03:00
|
|
|
).property("hello", JSON.stringify({ hello: "world" }))
|
2021-06-30 16:37:13 +03:00
|
|
|
)
|
|
|
|
.build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/webextension.docx", buffer);
|
2021-06-30 16:37:13 +03:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/webextension1.xml|_rels|taskpanes.xml.rel/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-07-13 12:46:15 +03:00
|
|
|
|
|
|
|
test("should write customItem", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello!!"));
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addParagraph(p)
|
|
|
|
.addCustomItem(
|
|
|
|
"06AC5857-5C65-A94A-BCEC-37356A209BC3",
|
|
|
|
'<root xmlns="https://example.com"><item name="Cheap Item" price="$193.95"/><item name="Expensive Item" price="$931.88"/></root>'
|
|
|
|
)
|
|
|
|
.build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/custom-item.docx", buffer);
|
2021-07-13 12:46:15 +03:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/item1.xml|_rels|item1Props/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-09-29 03:03:39 +03:00
|
|
|
|
|
|
|
test("should write line spacing", () => {
|
|
|
|
const p = new w.Paragraph()
|
2021-10-20 10:37:51 +03:00
|
|
|
.addRun(new w.Run().addText("Hello "))
|
2021-11-25 12:42:06 +02:00
|
|
|
.lineSpacing(
|
|
|
|
new w.LineSpacing().before(100).after(0).line(100).afterLines(400)
|
|
|
|
);
|
2021-09-29 03:03:39 +03:00
|
|
|
const buffer = new w.Docx().addParagraph(p).build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/line_spacing.docx", buffer);
|
2021-09-29 03:03:39 +03:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-11-24 18:49:27 +02:00
|
|
|
|
|
|
|
test("should write footer for default section", () => {
|
|
|
|
const p1 = new w.Paragraph().addRun(new w.Run().addText("Hello Footer"));
|
|
|
|
const p2 = new w.Paragraph().addRun(new w.Run().addText("World "));
|
|
|
|
const footer = new w.Footer().addParagraph(p1);
|
|
|
|
const buffer = new w.Docx().footer(footer).addParagraph(p2).build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/footer.docx", buffer);
|
2021-11-24 18:49:27 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|footer1.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-11-25 17:06:16 +02:00
|
|
|
|
|
|
|
test("should write header for default section", () => {
|
|
|
|
const p1 = new w.Paragraph().addRun(new w.Run().addText("Hello Header"));
|
|
|
|
const p2 = new w.Paragraph().addRun(new w.Run().addText("World "));
|
|
|
|
const header = new w.Header().addParagraph(p1);
|
|
|
|
const buffer = new w.Docx().header(header).addParagraph(p2).build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/header.docx", buffer);
|
2021-11-25 17:06:16 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|footer1.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-12-01 17:39:50 +02:00
|
|
|
|
|
|
|
test("should write firstHeader with table for default section", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello Header!!"));
|
|
|
|
const table = new w.Table().addRow(
|
|
|
|
new w.TableRow().addCell(new w.TableCell().addParagraph(p))
|
|
|
|
);
|
|
|
|
const header = new w.Header().addTable(table);
|
|
|
|
const buffer = new w.Docx().firstHeader(header).build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/first_header_with_table.docx", buffer);
|
2021-12-01 17:39:50 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|header[1-9].xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should write evenFooter with table for default section", () => {
|
|
|
|
const p = new w.Paragraph().addRun(new w.Run().addText("Hello Footer!!"));
|
|
|
|
const table = new w.Table().addRow(
|
|
|
|
new w.TableRow().addCell(new w.TableCell().addParagraph(p))
|
|
|
|
);
|
|
|
|
const footer = new w.Footer().addTable(table);
|
|
|
|
const buffer = new w.Docx().evenFooter(footer).build();
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/even_footer_with_table.docx", buffer);
|
2021-12-01 17:39:50 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|footer[1-9].xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2021-12-17 18:03:02 +02:00
|
|
|
|
|
|
|
test("should write hyperlink", () => {
|
|
|
|
const p1 = new w.Paragraph().addHyperlink(
|
|
|
|
new w.Hyperlink().anchor("anchor").addRun(new w.Run().addText("Hello!!"))
|
|
|
|
);
|
|
|
|
const p2 = new w.Paragraph()
|
|
|
|
.addBookmarkStart(1, "anchor")
|
|
|
|
.addRun(new w.Run().addText("World!!"))
|
|
|
|
.pageBreakBefore(true)
|
|
|
|
.addBookmarkEnd(1);
|
|
|
|
const buffer = new w.Docx().addParagraph(p1).addParagraph(p2).build();
|
|
|
|
|
2022-01-06 09:13:45 +02:00
|
|
|
writeFileSync("../output/js/hyperlink.docx", buffer);
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should write dirty and disable auto items ToC", () => {
|
|
|
|
const p1 = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Hello!!"))
|
|
|
|
.pageBreakBefore(true)
|
|
|
|
.style("Heading1");
|
|
|
|
const style1 = new w.Style("Heading1", "paragraph").name("Heading 1");
|
|
|
|
const p2 = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("World"))
|
|
|
|
.pageBreakBefore(true)
|
|
|
|
.style("Heading2");
|
|
|
|
const style2 = new w.Style("Heading2", "paragraph").name("Heading 2");
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addTableOfContents(
|
|
|
|
new w.TableOfContents().alias("Table of contents").dirty()
|
|
|
|
)
|
|
|
|
.addParagraph(p1)
|
|
|
|
.addParagraph(p2)
|
|
|
|
.addStyle(style1)
|
|
|
|
.addStyle(style2)
|
|
|
|
.build();
|
|
|
|
writeFileSync("../output/js/toc_dirty_and_disable_auto_items.docx", buffer);
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should write auto items ToC", () => {
|
|
|
|
const p1 = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Hello!!"))
|
|
|
|
.pageBreakBefore(true)
|
|
|
|
.style("Heading1");
|
|
|
|
const style1 = new w.Style("Heading1", "paragraph").name("Heading 1");
|
|
|
|
const p2 = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("World"))
|
|
|
|
.pageBreakBefore(true)
|
|
|
|
.style("Heading2");
|
|
|
|
const style2 = new w.Style("Heading2", "paragraph").name("Heading 2");
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addTableOfContents(
|
|
|
|
new w.TableOfContents().alias("Table of contents").auto()
|
|
|
|
)
|
|
|
|
.addParagraph(p1)
|
|
|
|
.addParagraph(p2)
|
|
|
|
.addStyle(style1)
|
|
|
|
.addStyle(style2)
|
|
|
|
.build();
|
|
|
|
writeFileSync("../output/js/toc_auto_items.docx", buffer);
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should write ToC with items", () => {
|
|
|
|
const p1 = new w.Paragraph()
|
|
|
|
.addBookmarkStart(1, "_Toc00000000")
|
|
|
|
.addRun(new w.Run().addText("Hello!!"))
|
|
|
|
.addBookmarkEnd(1)
|
|
|
|
.pageBreakBefore(true)
|
|
|
|
.style("Heading1");
|
|
|
|
const style1 = new w.Style("Heading1", "paragraph").name("Heading 1");
|
|
|
|
const p2 = new w.Paragraph()
|
|
|
|
.addBookmarkStart(2, "_Toc00000001")
|
|
|
|
.addRun(new w.Run().addText("World"))
|
|
|
|
.addBookmarkEnd(2)
|
|
|
|
.pageBreakBefore(true)
|
|
|
|
.style("Heading2");
|
|
|
|
const style2 = new w.Style("Heading2", "paragraph").name("Heading 2");
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addTableOfContents(
|
|
|
|
new w.TableOfContents()
|
|
|
|
.alias("Table of contents")
|
|
|
|
.addItem(
|
|
|
|
new w.TableOfContentsItem()
|
|
|
|
.text("Hello!!")
|
|
|
|
.level(1)
|
|
|
|
.pageRef("2")
|
|
|
|
.tocKey("_Toc00000000")
|
|
|
|
)
|
|
|
|
.addItem(
|
|
|
|
new w.TableOfContentsItem()
|
|
|
|
.text("World")
|
|
|
|
.level(2)
|
|
|
|
.pageRef("3")
|
|
|
|
.tocKey("_Toc00000001")
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.addParagraph(p1)
|
|
|
|
.addParagraph(p2)
|
|
|
|
.addStyle(style1)
|
|
|
|
.addStyle(style2)
|
|
|
|
.build();
|
|
|
|
writeFileSync("../output/js/toc_with_items.docx", buffer);
|
2021-12-17 18:03:02 +02:00
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2022-01-17 08:27:24 +02:00
|
|
|
|
|
|
|
test("should write pPrChange with inserted numbering", () => {
|
|
|
|
const p = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Hello world!!"))
|
|
|
|
.numbering(1, 0)
|
|
|
|
.paragraphPropertyChange(
|
|
|
|
new w.ParagraphPropertyChange().author("bokuweb")
|
|
|
|
);
|
|
|
|
|
|
|
|
const num = new w.Numbering(1, 0);
|
|
|
|
const buffer = new w.Docx().addParagraph(p).addNumbering(num).build();
|
|
|
|
|
|
|
|
writeFileSync(
|
|
|
|
"../output/js/pprchange_with_inserted_numbering.docx",
|
|
|
|
buffer
|
|
|
|
);
|
|
|
|
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2022-01-17 18:44:08 +02:00
|
|
|
|
|
|
|
test("should write pPrChange with deleted numbering", () => {
|
|
|
|
const p = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Hello world!!"))
|
|
|
|
.paragraphPropertyChange(
|
|
|
|
new w.ParagraphPropertyChange().author("bokuweb").numbering(1, 0)
|
|
|
|
);
|
|
|
|
|
|
|
|
const num = new w.Numbering(1, 0);
|
|
|
|
const buffer = new w.Docx().addParagraph(p).addNumbering(num).build();
|
|
|
|
|
2022-01-19 11:55:23 +02:00
|
|
|
writeFileSync("../output/js/pprchange_with_deleted_numbering.docx", buffer);
|
|
|
|
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
test("should write paragraph delete", () => {
|
|
|
|
const p1 = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Hello world!!"))
|
|
|
|
.numbering(1, 0)
|
|
|
|
.delete("bokuweb", "2021-12-23T18:16:00Z");
|
|
|
|
const p2 = new w.Paragraph()
|
|
|
|
.addRun(new w.Run().addText("Foo"))
|
|
|
|
.numbering(1, 0);
|
|
|
|
|
|
|
|
const num = new w.Numbering(1, 0);
|
|
|
|
|
|
|
|
const buffer = new w.Docx()
|
|
|
|
.addParagraph(p1)
|
|
|
|
.addParagraph(p2)
|
|
|
|
.addNumbering(num)
|
|
|
|
.build();
|
|
|
|
|
|
|
|
writeFileSync("../output/js/paragraph_delete.docx", buffer);
|
2022-01-17 18:44:08 +02:00
|
|
|
|
|
|
|
const z = new Zip(Buffer.from(buffer));
|
|
|
|
for (const e of z.getEntries()) {
|
|
|
|
if (e.entryName.match(/document.xml|numbering.xml/)) {
|
|
|
|
expect(z.readAsText(e)).toMatchSnapshot();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2020-10-05 16:46:18 +03:00
|
|
|
});
|