docx-rs/docx-wasm/test/index.test.js

796 lines
227 KiB
JavaScript
Raw Normal View History

const w = require("../dist/node");
const { readFileSync, writeFileSync } = require("fs");
const Zip = require("adm-zip");
const encodedCat =
"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
describe("reader", () => {
test("should read lvlOverride docx", () => {
const buffer = readFileSync("../fixtures/lvl_override/override.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read gridAfter docx", () => {
const buffer = readFileSync("../fixtures/grid_after/grid_after.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read tr2bl docx", () => {
const buffer = readFileSync("../fixtures/tr2bl/tr2bl.docx");
const json = w.readDocx(buffer);
writeFileSync("../output/js/tr2bl.json", JSON.stringify(json, null, 2));
expect(json).toMatchSnapshot();
});
test("should read custom docx", () => {
const buffer = readFileSync("../fixtures/custom/custom.docx");
const json = w.readDocx(buffer);
writeFileSync("../output/js/custom.json", JSON.stringify(json, null, 2));
expect(json).toMatchSnapshot();
});
test("should read table style docx", () => {
const buffer = readFileSync("../fixtures/table_style/table_style.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read extended comments docx", () => {
const buffer = readFileSync(
"../fixtures/extended_comments/extended_comments.docx"
);
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
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();
});
test("should read div docx", () => {
const buffer = readFileSync("../fixtures/div/div.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read vertAlign docx", () => {
const buffer = readFileSync("../fixtures/vert_align/vert_align.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read line spacing docx", () => {
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");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read afterLines docx", () => {
const buffer = readFileSync("../fixtures/after_lines/after_lines.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read toc1 docx", () => {
const buffer = readFileSync("../fixtures/toc1/toc1.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read footer docx", () => {
const buffer = readFileSync("../fixtures/footer/footer.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read strike docx", () => {
const buffer = readFileSync("../fixtures/strike/strike.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
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();
});
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();
});
test("should read font docx", () => {
const buffer = readFileSync("../fixtures/font/font.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
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();
});
test("should read textbox", () => {
const buffer = readFileSync("../fixtures/textbox/textbox.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read without num id", () => {
const buffer = readFileSync("../fixtures/without_numid/without_numid.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
test("should read imagedata in shape", () => {
const buffer = readFileSync("../fixtures/shape/shape.docx");
const json = w.readDocx(buffer);
expect(json).toMatchSnapshot();
});
});
describe("writer", () => {
test("should write hello", () => {
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!"));
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();
}
}
});
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();
}
}
writeFileSync("../output/js/strike.docx", buffer);
});
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")
)
);
const buffer = new w.Docx()
.addParagraph(p)
.addAbstractNumbering(new w.AbstractNumbering(0))
.addNumbering(num)
.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();
}
}
});
test("should write page size", () => {
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!"));
const buffer = new w.Docx().addParagraph(p).pageSize(400, 800).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();
}
}
});
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();
}
}
writeFileSync("../output/js/nested_table.docx", buffer);
});
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();
}
}
writeFileSync("../output/js/cell_borders.docx", buffer);
});
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(
new w.TableCell().addParagraph(p).shading("clear", "auto", "FF0000")
)
);
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();
}
}
writeFileSync("../output/js/cell_shading.docx", buffer);
});
test("should write page margin", () => {
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!"));
const buffer = new w.Docx()
.addParagraph(p)
.pageMargin({ top: 1000, left: 2000 })
.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();
}
}
});
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");
const buffer = new w.Docx()
.addParagraph(p)
.defaultSize(40)
.defaultFonts(fonts)
.build();
writeFileSync("../output/js/default_font.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 doc vars", () => {
const p = new w.Paragraph().addRun(new w.Run().addText("Hello world!!!!"));
const buffer = new w.Docx().addParagraph(p).addDocVar("foo", "bar").build();
writeFileSync("../output/js/doc_vars.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 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();
writeFileSync("../output/js/doc_grid.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 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();
}
}
writeFileSync("../output/js/table_layout.docx", buffer);
});
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();
writeFileSync("../output/js/text_border.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 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();
writeFileSync("../output/js/page_orientation.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 custom props", () => {
const p = new w.Paragraph().addRun(new w.Run().addText("Hello!!"));
const buffer = new w.Docx()
.addParagraph(p)
.customProperty("hello", '{"world": 0}')
.build();
writeFileSync("../output/js/custom.docx", buffer);
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();
}
}
});
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",
"1.0.0.0",
"developer",
"Registry"
).property("hello", JSON.stringify({ hello: "world" }))
)
.build();
writeFileSync("../output/js/webextension.docx", buffer);
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();
}
}
});
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();
writeFileSync("../output/js/custom-item.docx", buffer);
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();
}
}
});
test("should write line spacing", () => {
const p = new w.Paragraph()
.addRun(new w.Run().addText("Hello "))
.lineSpacing(
new w.LineSpacing().before(100).after(0).line(100).afterLines(400)
);
const buffer = new w.Docx().addParagraph(p).build();
writeFileSync("../output/js/line_spacing.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 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();
writeFileSync("../output/js/footer.docx", buffer);
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();
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();
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();
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();
}
}
});
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();
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);
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();
}
}
});
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();
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);
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 inline image", () => {
const buf = Buffer.from(encodedCat, "base64");
const image = new w.Image(buf).size(320 * 9525, 240 * 9525);
const p = new w.Paragraph().addRun(
new w.Run().addText("Hello world!!").addImage(image)
);
const buffer = new w.Docx().addParagraph(p).build();
writeFileSync("../output/js/inline_image.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 inline jpeg image", () => {
const buf = Buffer.from(require("./cat"), "base64");
const image = new w.Image(buf).size(320 * 9525, 240 * 9525);
const p = new w.Paragraph().addRun(
new w.Run().addText("Hello world!!").addImage(image)
);
const buffer = new w.Docx().addParagraph(p).build();
writeFileSync("../output/js/inline_image.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 jpeg image with ins", () => {
const buf = Buffer.from(require("./cat"), "base64");
const image = new w.Image(buf).size(320 * 9525, 240 * 9525);
const p = new w.Paragraph().addInsert(
new w.Insert(new w.Run().addImage(image))
.author("bokuweb")
.date("2021-12-23T18:16:00Z")
);
const buffer = new w.Docx().addParagraph(p).build();
writeFileSync("../output/js/image_with_ins.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 jpeg image with del", () => {
const buf = Buffer.from(require("./cat"), "base64");
const image = new w.Image(buf).size(320 * 9525, 240 * 9525);
const p = new w.Paragraph().addDelete(
new w.Delete(new w.Run().addImage(image))
.author("bokuweb")
.date("2021-12-23T18:16:00Z")
);
const buffer = new w.Docx().addParagraph(p).build();
writeFileSync("../output/js/image_with_del.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();
}
}
});
});