diff --git a/src/export/formatter.spec.ts b/src/export/formatter.spec.ts
index 497a631332..47d7773529 100644
--- a/src/export/formatter.spec.ts
+++ b/src/export/formatter.spec.ts
@@ -31,7 +31,7 @@ describe("Formatter", () => {
const paragraph = new file.Paragraph();
paragraph.addRun(new file.TextRun("test").bold());
const newJson = formatter.format(paragraph);
- assert.isDefined(newJson["w:p"][1]["w:r"][0]["w:rPr"][0]["w:b"][0]._attr["w:val"]);
+ assert.isDefined(newJson["w:p"][0]["w:r"][0]["w:rPr"][0]["w:b"]._attr["w:val"]);
});
it("should format attributes (rsidSect)", () => {
diff --git a/src/export/packer/next-compiler.ts b/src/export/packer/next-compiler.ts
index e97a155b01..345d4db450 100644
--- a/src/export/packer/next-compiler.ts
+++ b/src/export/packer/next-compiler.ts
@@ -191,13 +191,4 @@ export class Compiler {
},
};
}
-
- /* By default docx collapse empty tags. -> . this function mimic it
- so comparing (diff) original docx file and the library output is easier
- Currently not used, so commenting out */
- // private collapseEmptyTags(xmlData: string): string {
- // const regEx = /<(([^ <>]+)[^<>]*)><\/\2>/g;
- // const collapsed = xmlData.replace(regEx, "<$1/>");
- // return collapsed;
- // }
}
diff --git a/src/file/content-types/content-types.spec.ts b/src/file/content-types/content-types.spec.ts
index d88eb4a858..1d8e008f92 100644
--- a/src/file/content-types/content-types.spec.ts
+++ b/src/file/content-types/content-types.spec.ts
@@ -20,84 +20,70 @@ describe("ContentTypes", () => {
expect(tree["Types"]).to.be.an.instanceof(Array);
expect(tree["Types"][0]).to.deep.equal({ _attr: { xmlns: "http://schemas.openxmlformats.org/package/2006/content-types" } });
- expect(tree["Types"][1]).to.deep.equal({ Default: [{ _attr: { ContentType: "image/png", Extension: "png" } }] });
- expect(tree["Types"][2]).to.deep.equal({ Default: [{ _attr: { ContentType: "image/jpeg", Extension: "jpeg" } }] });
- expect(tree["Types"][3]).to.deep.equal({ Default: [{ _attr: { ContentType: "image/jpeg", Extension: "jpg" } }] });
- expect(tree["Types"][4]).to.deep.equal({ Default: [{ _attr: { ContentType: "image/bmp", Extension: "bmp" } }] });
- expect(tree["Types"][5]).to.deep.equal({ Default: [{ _attr: { ContentType: "image/gif", Extension: "gif" } }] });
+ expect(tree["Types"][1]).to.deep.equal({ Default: { _attr: { ContentType: "image/png", Extension: "png" } } });
+ expect(tree["Types"][2]).to.deep.equal({ Default: { _attr: { ContentType: "image/jpeg", Extension: "jpeg" } } });
+ expect(tree["Types"][3]).to.deep.equal({ Default: { _attr: { ContentType: "image/jpeg", Extension: "jpg" } } });
+ expect(tree["Types"][4]).to.deep.equal({ Default: { _attr: { ContentType: "image/bmp", Extension: "bmp" } } });
+ expect(tree["Types"][5]).to.deep.equal({ Default: { _attr: { ContentType: "image/gif", Extension: "gif" } } });
expect(tree["Types"][6]).to.deep.equal({
- Default: [{ _attr: { ContentType: "application/vnd.openxmlformats-package.relationships+xml", Extension: "rels" } }],
+ Default: { _attr: { ContentType: "application/vnd.openxmlformats-package.relationships+xml", Extension: "rels" } },
});
- expect(tree["Types"][7]).to.deep.equal({ Default: [{ _attr: { ContentType: "application/xml", Extension: "xml" } }] });
+ expect(tree["Types"][7]).to.deep.equal({ Default: { _attr: { ContentType: "application/xml", Extension: "xml" } } });
expect(tree["Types"][8]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
- PartName: "/word/document.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
+ PartName: "/word/document.xml",
},
- ],
+ },
});
expect(tree["Types"][9]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml",
- PartName: "/word/styles.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml",
+ PartName: "/word/styles.xml",
},
- ],
+ },
});
expect(tree["Types"][10]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-package.core-properties+xml",
- PartName: "/docProps/core.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-package.core-properties+xml",
+ PartName: "/docProps/core.xml",
},
- ],
+ },
});
expect(tree["Types"][11]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.extended-properties+xml",
- PartName: "/docProps/app.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.extended-properties+xml",
+ PartName: "/docProps/app.xml",
},
- ],
+ },
});
expect(tree["Types"][12]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml",
- PartName: "/word/numbering.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml",
+ PartName: "/word/numbering.xml",
},
- ],
+ },
});
expect(tree["Types"][13]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml",
- PartName: "/word/footnotes.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml",
+ PartName: "/word/footnotes.xml",
},
- ],
+ },
});
expect(tree["Types"][14]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml",
- PartName: "/word/settings.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml",
+ PartName: "/word/settings.xml",
},
- ],
+ },
});
});
});
@@ -109,25 +95,21 @@ describe("ContentTypes", () => {
const tree = new Formatter().format(contentTypes);
expect(tree["Types"][15]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml",
- PartName: "/word/footer101.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml",
+ PartName: "/word/footer101.xml",
},
- ],
+ },
});
expect(tree["Types"][16]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml",
- PartName: "/word/footer102.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml",
+ PartName: "/word/footer102.xml",
},
- ],
+ },
});
});
});
@@ -139,25 +121,21 @@ describe("ContentTypes", () => {
const tree = new Formatter().format(contentTypes);
expect(tree["Types"][15]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml",
- PartName: "/word/header201.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml",
+ PartName: "/word/header201.xml",
},
- ],
+ },
});
expect(tree["Types"][16]).to.deep.equal({
- Override: [
- {
- _attr: {
- ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml",
- PartName: "/word/header202.xml",
- },
+ Override: {
+ _attr: {
+ ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml",
+ PartName: "/word/header202.xml",
},
- ],
+ },
});
});
});
diff --git a/src/file/document/body/body.spec.ts b/src/file/document/body/body.spec.ts
index b82944ff78..502c10692e 100644
--- a/src/file/document/body/body.spec.ts
+++ b/src/file/document/body/body.spec.ts
@@ -30,14 +30,14 @@ describe("Body", () => {
const formatted = new Formatter().format(body)["w:body"];
expect(formatted).to.be.an.instanceof(Array);
- const defaultSectionPr = formatted[0]["w:p"][1]["w:pPr"][0]["w:sectPr"];
+ const defaultSectionPr = formatted[0]["w:p"][0]["w:pPr"][0]["w:sectPr"];
// check that this is the default section and added first in paragraph
- expect(defaultSectionPr[0]).to.deep.equal({ "w:pgSz": [{ _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } }] });
+ expect(defaultSectionPr[0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } } });
// check for new section (since it's the last one, it's direct child of body)
const newSection = formatted[1]["w:sectPr"];
- expect(newSection[0]).to.deep.equal({ "w:pgSz": [{ _attr: { "w:h": 10000, "w:w": 10000, "w:orient": "portrait" } }] });
+ expect(newSection[0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 10000, "w:w": 10000, "w:orient": "portrait" } } });
});
it("should add section with default parameters", () => {
@@ -52,30 +52,27 @@ describe("Body", () => {
"w:body": [
{
"w:p": [
- { "w:pPr": [] },
{
"w:pPr": [
{
"w:sectPr": [
- { "w:pgSz": [{ _attr: { "w:w": 11906, "w:h": 16838, "w:orient": "portrait" } }] },
+ { "w:pgSz": { _attr: { "w:w": 11906, "w:h": 16838, "w:orient": "portrait" } } },
{
- "w:pgMar": [
- {
- _attr: {
- "w:top": 1440,
- "w:right": 1440,
- "w:bottom": 1440,
- "w:left": 1440,
- "w:header": 708,
- "w:footer": 708,
- "w:gutter": 0,
- "w:mirrorMargins": false,
- },
+ "w:pgMar": {
+ _attr: {
+ "w:top": 1440,
+ "w:right": 1440,
+ "w:bottom": 1440,
+ "w:left": 1440,
+ "w:header": 708,
+ "w:footer": 708,
+ "w:gutter": 0,
+ "w:mirrorMargins": false,
},
- ],
+ },
},
- { "w:cols": [{ _attr: { "w:space": 708 } }] },
- { "w:docGrid": [{ _attr: { "w:linePitch": 360 } }] },
+ { "w:cols": { _attr: { "w:space": 708 } } },
+ { "w:docGrid": { _attr: { "w:linePitch": 360 } } },
],
},
],
@@ -84,25 +81,23 @@ describe("Body", () => {
},
{
"w:sectPr": [
- { "w:pgSz": [{ _attr: { "w:w": 10000, "w:h": 10000, "w:orient": "portrait" } }] },
+ { "w:pgSz": { _attr: { "w:w": 10000, "w:h": 10000, "w:orient": "portrait" } } },
{
- "w:pgMar": [
- {
- _attr: {
- "w:top": 1440,
- "w:right": 1440,
- "w:bottom": 1440,
- "w:left": 1440,
- "w:header": 708,
- "w:footer": 708,
- "w:gutter": 0,
- "w:mirrorMargins": false,
- },
+ "w:pgMar": {
+ _attr: {
+ "w:top": 1440,
+ "w:right": 1440,
+ "w:bottom": 1440,
+ "w:left": 1440,
+ "w:header": 708,
+ "w:footer": 708,
+ "w:gutter": 0,
+ "w:mirrorMargins": false,
},
- ],
+ },
},
- { "w:cols": [{ _attr: { "w:space": 708 } }] },
- { "w:docGrid": [{ _attr: { "w:linePitch": 360 } }] },
+ { "w:cols": { _attr: { "w:space": 708 } } },
+ { "w:docGrid": { _attr: { "w:linePitch": 360 } } },
],
},
],
diff --git a/src/file/document/body/section-properties/page-border/page-borders.spec.ts b/src/file/document/body/section-properties/page-border/page-borders.spec.ts
index 3ac11c1114..0b5a90a4a6 100644
--- a/src/file/document/body/section-properties/page-border/page-borders.spec.ts
+++ b/src/file/document/body/section-properties/page-border/page-borders.spec.ts
@@ -21,8 +21,7 @@ describe("PageBorders", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:pgBorders"]);
- expect(tree["w:pgBorders"]).to.be.an.instanceof(Array);
- expect(tree["w:pgBorders"][0]).to.deep.equal({ _attr: { "w:display": "firstPage" } });
+ expect(tree["w:pgBorders"]).to.deep.equal({ _attr: { "w:display": "firstPage" } });
});
it("should create page borders with full configuration", () => {
@@ -58,32 +57,24 @@ describe("PageBorders", () => {
expect(tree["w:pgBorders"]).to.be.an.instanceof(Array);
expect(tree["w:pgBorders"][0]).to.deep.equal({ _attr: { "w:display": "firstPage", "w:zOrder": "back" } });
expect(tree["w:pgBorders"][1]).to.deep.equal({
- "w:top": [
- {
- _attr: { "w:color": "001122", "w:size": 10, "w:val": "doubleWave" },
- },
- ],
+ "w:top": {
+ _attr: { "w:color": "001122", "w:size": 10, "w:val": "doubleWave" },
+ },
});
expect(tree["w:pgBorders"][2]).to.deep.equal({
- "w:right": [
- {
- _attr: { "w:color": "223344", "w:size": 20, "w:val": "double" },
- },
- ],
+ "w:right": {
+ _attr: { "w:color": "223344", "w:size": 20, "w:val": "double" },
+ },
});
expect(tree["w:pgBorders"][3]).to.deep.equal({
- "w:bottom": [
- {
- _attr: { "w:color": "556677", "w:size": 30, "w:val": "single" },
- },
- ],
+ "w:bottom": {
+ _attr: { "w:color": "556677", "w:size": 30, "w:val": "single" },
+ },
});
expect(tree["w:pgBorders"][4]).to.deep.equal({
- "w:left": [
- {
- _attr: { "w:color": "889900", "w:size": 40, "w:val": "dotted" },
- },
- ],
+ "w:left": {
+ _attr: { "w:color": "889900", "w:size": 40, "w:val": "dotted" },
+ },
});
});
});
diff --git a/src/file/document/body/section-properties/page-border/page-borders.ts b/src/file/document/body/section-properties/page-border/page-borders.ts
index 6abfa6f68b..a37469f83d 100644
--- a/src/file/document/body/section-properties/page-border/page-borders.ts
+++ b/src/file/document/body/section-properties/page-border/page-borders.ts
@@ -1,6 +1,6 @@
// http://officeopenxml.com/WPsectionBorders.php
import { BorderStyle } from "file/styles";
-import { IXmlableObject, XmlAttributeComponent, XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent, XmlAttributeComponent, XmlComponent } from "file/xml-components";
export enum PageBorderDisplay {
ALL_PAGES = "allPages",
@@ -64,7 +64,7 @@ class PageBordersAttributes extends XmlAttributeComponent
};
}
-export class PageBorders extends XmlComponent {
+export class PageBorders extends IgnoreIfEmptyXmlComponent {
constructor(options?: IPageBordersOptions) {
super("w:pgBorders");
@@ -97,10 +97,4 @@ export class PageBorders extends XmlComponent {
this.root.push(new PageBorder("w:left", options.pageBorderLeft));
}
}
-
- public prepForXml(): IXmlableObject | undefined {
- if (this.root.length > 0) {
- return super.prepForXml();
- }
- }
}
diff --git a/src/file/document/body/section-properties/page-size/page-size.spec.ts b/src/file/document/body/section-properties/page-size/page-size.spec.ts
index a99c3d2ed8..0921006e1e 100644
--- a/src/file/document/body/section-properties/page-size/page-size.spec.ts
+++ b/src/file/document/body/section-properties/page-size/page-size.spec.ts
@@ -12,8 +12,7 @@ describe("PageSize", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:pgSz"]);
- expect(tree["w:pgSz"]).to.be.an.instanceof(Array);
- expect(tree["w:pgSz"][0]).to.deep.equal({ _attr: { "w:h": 200, "w:w": 100, "w:orient": "portrait" } });
+ expect(tree["w:pgSz"]).to.deep.equal({ _attr: { "w:h": 200, "w:w": 100, "w:orient": "portrait" } });
});
it("should create page size with horizontal and invert the lengths", () => {
@@ -21,8 +20,7 @@ describe("PageSize", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:pgSz"]);
- expect(tree["w:pgSz"]).to.be.an.instanceof(Array);
- expect(tree["w:pgSz"][0]).to.deep.equal({ _attr: { "w:h": 100, "w:w": 200, "w:orient": "landscape" } });
+ expect(tree["w:pgSz"]).to.deep.equal({ _attr: { "w:h": 100, "w:w": 200, "w:orient": "landscape" } });
});
});
});
diff --git a/src/file/document/body/section-properties/section-properties.spec.ts b/src/file/document/body/section-properties/section-properties.spec.ts
index 81135daba6..b545a058c4 100644
--- a/src/file/document/body/section-properties/section-properties.spec.ts
+++ b/src/file/document/body/section-properties/section-properties.spec.ts
@@ -39,29 +39,27 @@ describe("SectionProperties", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]);
expect(tree["w:sectPr"]).to.be.an.instanceof(Array);
- expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": [{ _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } }] });
+ expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } } });
expect(tree["w:sectPr"][1]).to.deep.equal({
- "w:pgMar": [
- {
- _attr: {
- "w:bottom": 1440,
- "w:footer": 708,
- "w:top": 1440,
- "w:right": 1440,
- "w:left": 1440,
- "w:header": 708,
- "w:gutter": 0,
- "w:mirrorMargins": false,
- },
+ "w:pgMar": {
+ _attr: {
+ "w:bottom": 1440,
+ "w:footer": 708,
+ "w:top": 1440,
+ "w:right": 1440,
+ "w:left": 1440,
+ "w:header": 708,
+ "w:gutter": 0,
+ "w:mirrorMargins": false,
},
- ],
+ },
});
- expect(tree["w:sectPr"][2]).to.deep.equal({ "w:cols": [{ _attr: { "w:space": 708 } }] });
- expect(tree["w:sectPr"][3]).to.deep.equal({ "w:docGrid": [{ _attr: { "w:linePitch": 360 } }] });
- expect(tree["w:sectPr"][4]).to.deep.equal({ "w:headerReference": [{ _attr: { "r:id": "rId100", "w:type": "default" } }] });
- expect(tree["w:sectPr"][5]).to.deep.equal({ "w:footerReference": [{ _attr: { "r:id": "rId200", "w:type": "even" } }] });
- expect(tree["w:sectPr"][6]).to.deep.equal({ "w:pgNumType": [{ _attr: { "w:fmt": "cardinalText", "w:start": 10 } }] });
+ expect(tree["w:sectPr"][2]).to.deep.equal({ "w:cols": { _attr: { "w:space": 708 } } });
+ expect(tree["w:sectPr"][3]).to.deep.equal({ "w:docGrid": { _attr: { "w:linePitch": 360 } } });
+ expect(tree["w:sectPr"][4]).to.deep.equal({ "w:headerReference": { _attr: { "r:id": "rId100", "w:type": "default" } } });
+ expect(tree["w:sectPr"][5]).to.deep.equal({ "w:footerReference": { _attr: { "r:id": "rId200", "w:type": "even" } } });
+ expect(tree["w:sectPr"][6]).to.deep.equal({ "w:pgNumType": { _attr: { "w:fmt": "cardinalText", "w:start": 10 } } });
});
it("should create section properties with no options", () => {
@@ -69,25 +67,23 @@ describe("SectionProperties", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]);
expect(tree["w:sectPr"]).to.be.an.instanceof(Array);
- expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": [{ _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } }] });
+ expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } } });
expect(tree["w:sectPr"][1]).to.deep.equal({
- "w:pgMar": [
- {
- _attr: {
- "w:bottom": 1440,
- "w:footer": 708,
- "w:top": 1440,
- "w:right": 1440,
- "w:left": 1440,
- "w:header": 708,
- "w:gutter": 0,
- "w:mirrorMargins": false,
- },
+ "w:pgMar": {
+ _attr: {
+ "w:bottom": 1440,
+ "w:footer": 708,
+ "w:top": 1440,
+ "w:right": 1440,
+ "w:left": 1440,
+ "w:header": 708,
+ "w:gutter": 0,
+ "w:mirrorMargins": false,
},
- ],
+ },
});
- expect(tree["w:sectPr"][2]).to.deep.equal({ "w:cols": [{ _attr: { "w:space": 708 } }] });
- expect(tree["w:sectPr"][3]).to.deep.equal({ "w:docGrid": [{ _attr: { "w:linePitch": 360 } }] });
+ expect(tree["w:sectPr"][2]).to.deep.equal({ "w:cols": { _attr: { "w:space": 708 } } });
+ expect(tree["w:sectPr"][3]).to.deep.equal({ "w:docGrid": { _attr: { "w:linePitch": 360 } } });
});
it("should create section properties with changed options", () => {
@@ -97,22 +93,20 @@ describe("SectionProperties", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]);
expect(tree["w:sectPr"]).to.be.an.instanceof(Array);
- expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": [{ _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } }] });
+ expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } } });
expect(tree["w:sectPr"][1]).to.deep.equal({
- "w:pgMar": [
- {
- _attr: {
- "w:bottom": 1440,
- "w:footer": 708,
- "w:top": 0,
- "w:right": 1440,
- "w:left": 1440,
- "w:header": 708,
- "w:gutter": 0,
- "w:mirrorMargins": false,
- },
+ "w:pgMar": {
+ _attr: {
+ "w:bottom": 1440,
+ "w:footer": 708,
+ "w:top": 0,
+ "w:right": 1440,
+ "w:left": 1440,
+ "w:header": 708,
+ "w:gutter": 0,
+ "w:mirrorMargins": false,
},
- ],
+ },
});
});
@@ -123,22 +117,20 @@ describe("SectionProperties", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]);
expect(tree["w:sectPr"]).to.be.an.instanceof(Array);
- expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": [{ _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } }] });
+ expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 16838, "w:w": 11906, "w:orient": "portrait" } } });
expect(tree["w:sectPr"][1]).to.deep.equal({
- "w:pgMar": [
- {
- _attr: {
- "w:bottom": 0,
- "w:footer": 708,
- "w:top": 1440,
- "w:right": 1440,
- "w:left": 1440,
- "w:header": 708,
- "w:gutter": 0,
- "w:mirrorMargins": false,
- },
+ "w:pgMar": {
+ _attr: {
+ "w:bottom": 0,
+ "w:footer": 708,
+ "w:top": 1440,
+ "w:right": 1440,
+ "w:left": 1440,
+ "w:header": 708,
+ "w:gutter": 0,
+ "w:mirrorMargins": false,
},
- ],
+ },
});
});
@@ -150,22 +142,20 @@ describe("SectionProperties", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]);
expect(tree["w:sectPr"]).to.be.an.instanceof(Array);
- expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": [{ _attr: { "w:h": 0, "w:w": 0, "w:orient": "portrait" } }] });
+ expect(tree["w:sectPr"][0]).to.deep.equal({ "w:pgSz": { _attr: { "w:h": 0, "w:w": 0, "w:orient": "portrait" } } });
expect(tree["w:sectPr"][1]).to.deep.equal({
- "w:pgMar": [
- {
- _attr: {
- "w:bottom": 1440,
- "w:footer": 708,
- "w:top": 1440,
- "w:right": 1440,
- "w:left": 1440,
- "w:header": 708,
- "w:gutter": 0,
- "w:mirrorMargins": false,
- },
+ "w:pgMar": {
+ _attr: {
+ "w:bottom": 1440,
+ "w:footer": 708,
+ "w:top": 1440,
+ "w:right": 1440,
+ "w:left": 1440,
+ "w:header": 708,
+ "w:gutter": 0,
+ "w:mirrorMargins": false,
},
- ],
+ },
});
});
@@ -179,7 +169,7 @@ describe("SectionProperties", () => {
expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]);
const pgBorders = tree["w:sectPr"].find((item) => item["w:pgBorders"] !== undefined);
expect(pgBorders).to.deep.equal({
- "w:pgBorders": [{ _attr: { "w:offsetFrom": "page" } }],
+ "w:pgBorders": { _attr: { "w:offsetFrom": "page" } },
});
});
@@ -191,7 +181,7 @@ describe("SectionProperties", () => {
expect(Object.keys(tree)).to.deep.equal(["w:sectPr"]);
const pgNumType = tree["w:sectPr"].find((item) => item["w:pgNumType"] !== undefined);
expect(pgNumType).to.deep.equal({
- "w:pgNumType": [{ _attr: { "w:fmt": "upperRoman" } }],
+ "w:pgNumType": { _attr: { "w:fmt": "upperRoman" } },
});
});
diff --git a/src/file/document/body/section-properties/title-page/title-page.spec.ts b/src/file/document/body/section-properties/title-page/title-page.spec.ts
index 3b89c974c4..e5eed2a429 100644
--- a/src/file/document/body/section-properties/title-page/title-page.spec.ts
+++ b/src/file/document/body/section-properties/title-page/title-page.spec.ts
@@ -11,8 +11,7 @@ describe("PageSize", () => {
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["w:titlePg"]);
- expect(tree["w:titlePg"]).to.be.an.instanceof(Array);
- expect(tree["w:titlePg"][0]).to.deep.equal({ _attr: { "w:val": "1" } });
+ expect(tree["w:titlePg"]).to.deep.equal({ _attr: { "w:val": "1" } });
});
});
});
diff --git a/src/file/document/document.spec.ts b/src/file/document/document.spec.ts
index c4ecad66bb..111d42efdf 100644
--- a/src/file/document/document.spec.ts
+++ b/src/file/document/document.spec.ts
@@ -52,7 +52,7 @@ describe("Document", () => {
expect(body[0])
.to.have.property("w:p")
.which.includes({
- "w:r": [{ "w:rPr": [] }, { "w:t": [{ _attr: { "xml:space": "preserve" } }, "sample paragraph text"] }],
+ "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "sample paragraph text"] }],
});
});
});
@@ -84,9 +84,9 @@ describe("Document", () => {
.to.have.property("w:tbl")
.which.includes({
"w:tblGrid": [
- { "w:gridCol": [{ _attr: { "w:w": 100 } }] },
- { "w:gridCol": [{ _attr: { "w:w": 100 } }] },
- { "w:gridCol": [{ _attr: { "w:w": 100 } }] },
+ { "w:gridCol": { _attr: { "w:w": 100 } } },
+ { "w:gridCol": { _attr: { "w:w": 100 } } },
+ { "w:gridCol": { _attr: { "w:w": 100 } } },
],
});
expect(body[0]["w:tbl"].filter((x) => x["w:tr"])).to.have.length(2);
diff --git a/src/file/file.spec.ts b/src/file/file.spec.ts
index 0d28459f2a..1ceb87cd85 100644
--- a/src/file/file.spec.ts
+++ b/src/file/file.spec.ts
@@ -25,8 +25,8 @@ describe("File", () => {
const tree = new Formatter().format(doc.Document.Body);
- expect(tree["w:body"][1]["w:sectPr"][4]["w:headerReference"][0]._attr["w:type"]).to.equal("default");
- expect(tree["w:body"][1]["w:sectPr"][5]["w:footerReference"][0]._attr["w:type"]).to.equal("default");
+ expect(tree["w:body"][1]["w:sectPr"][4]["w:headerReference"]._attr["w:type"]).to.equal("default");
+ expect(tree["w:body"][1]["w:sectPr"][5]["w:footerReference"]._attr["w:type"]).to.equal("default");
});
it("should create with first headers and footers", () => {
@@ -45,8 +45,8 @@ describe("File", () => {
const tree = new Formatter().format(doc.Document.Body);
- expect(tree["w:body"][1]["w:sectPr"][4]["w:headerReference"][0]._attr["w:type"]).to.equal("first");
- expect(tree["w:body"][1]["w:sectPr"][5]["w:footerReference"][0]._attr["w:type"]).to.equal("first");
+ expect(tree["w:body"][1]["w:sectPr"][4]["w:headerReference"]._attr["w:type"]).to.equal("first");
+ expect(tree["w:body"][1]["w:sectPr"][5]["w:footerReference"]._attr["w:type"]).to.equal("first");
});
it("should create with correct headers", () => {
@@ -69,13 +69,13 @@ describe("File", () => {
const tree = new Formatter().format(doc.Document.Body);
- expect(tree["w:body"][1]["w:sectPr"][4]["w:headerReference"][0]._attr["w:type"]).to.equal("default");
- expect(tree["w:body"][1]["w:sectPr"][5]["w:headerReference"][0]._attr["w:type"]).to.equal("first");
- expect(tree["w:body"][1]["w:sectPr"][6]["w:headerReference"][0]._attr["w:type"]).to.equal("even");
+ expect(tree["w:body"][1]["w:sectPr"][4]["w:headerReference"]._attr["w:type"]).to.equal("default");
+ expect(tree["w:body"][1]["w:sectPr"][5]["w:headerReference"]._attr["w:type"]).to.equal("first");
+ expect(tree["w:body"][1]["w:sectPr"][6]["w:headerReference"]._attr["w:type"]).to.equal("even");
- expect(tree["w:body"][1]["w:sectPr"][7]["w:footerReference"][0]._attr["w:type"]).to.equal("default");
- expect(tree["w:body"][1]["w:sectPr"][8]["w:footerReference"][0]._attr["w:type"]).to.equal("first");
- expect(tree["w:body"][1]["w:sectPr"][9]["w:footerReference"][0]._attr["w:type"]).to.equal("even");
+ expect(tree["w:body"][1]["w:sectPr"][7]["w:footerReference"]._attr["w:type"]).to.equal("default");
+ expect(tree["w:body"][1]["w:sectPr"][8]["w:footerReference"]._attr["w:type"]).to.equal("first");
+ expect(tree["w:body"][1]["w:sectPr"][9]["w:footerReference"]._attr["w:type"]).to.equal("even");
});
});
diff --git a/src/file/footnotes/footnote/footnote.spec.ts b/src/file/footnotes/footnote/footnote.spec.ts
index 2db4fd094b..8594cd75fd 100644
--- a/src/file/footnotes/footnote/footnote.spec.ts
+++ b/src/file/footnotes/footnote/footnote.spec.ts
@@ -11,8 +11,7 @@ describe("Footnote", () => {
const tree = new Formatter().format(footnote);
expect(Object.keys(tree)).to.deep.equal(["w:footnote"]);
- expect(tree["w:footnote"]).to.be.an.instanceof(Array);
- expect(tree["w:footnote"][0]).to.deep.equal({ _attr: { "w:type": "separator", "w:id": 1 } });
+ expect(tree["w:footnote"]).to.deep.equal({ _attr: { "w:type": "separator", "w:id": 1 } });
});
it("should create a footnote without a footnote type", () => {
@@ -20,8 +19,7 @@ describe("Footnote", () => {
const tree = new Formatter().format(footnote);
expect(Object.keys(tree)).to.deep.equal(["w:footnote"]);
- expect(tree["w:footnote"]).to.be.an.instanceof(Array);
- expect(tree["w:footnote"][0]).to.deep.equal({ _attr: { "w:id": 1 } });
+ expect(tree["w:footnote"]).to.deep.equal({ _attr: { "w:id": 1 } });
});
});
});
diff --git a/src/file/media/media.spec.ts b/src/file/media/media.spec.ts
index 04630ff5ed..9c53f1910d 100644
--- a/src/file/media/media.spec.ts
+++ b/src/file/media/media.spec.ts
@@ -27,10 +27,10 @@ describe("Media", () => {
const file = new File();
const image1 = Media.addImage(file, "test");
const tree = new Formatter().format(image1.Paragraph);
- const inlineElements = tree["w:p"][1]["w:r"][1]["w:drawing"][0]["wp:inline"];
+ const inlineElements = tree["w:p"][0]["w:r"][0]["w:drawing"][0]["wp:inline"];
const graphicData = inlineElements.find((x) => x["a:graphic"]);
- expect(graphicData["a:graphic"][1]["a:graphicData"][1]["pic:pic"][2]["pic:blipFill"][0]["a:blip"][0]).to.deep.equal({
+ expect(graphicData["a:graphic"][1]["a:graphicData"][1]["pic:pic"][2]["pic:blipFill"][0]["a:blip"]).to.deep.equal({
_attr: {
"r:embed": `rId{testId.png}`,
cstate: "none",
@@ -39,10 +39,10 @@ describe("Media", () => {
const image2 = Media.addImage(file, "test");
const tree2 = new Formatter().format(image2.Paragraph);
- const inlineElements2 = tree2["w:p"][1]["w:r"][1]["w:drawing"][0]["wp:inline"];
+ const inlineElements2 = tree2["w:p"][0]["w:r"][0]["w:drawing"][0]["wp:inline"];
const graphicData2 = inlineElements2.find((x) => x["a:graphic"]);
- expect(graphicData2["a:graphic"][1]["a:graphicData"][1]["pic:pic"][2]["pic:blipFill"][0]["a:blip"][0]).to.deep.equal({
+ expect(graphicData2["a:graphic"][1]["a:graphicData"][1]["pic:pic"][2]["pic:blipFill"][0]["a:blip"]).to.deep.equal({
_attr: {
"r:embed": `rId{testId.png}`,
cstate: "none",
diff --git a/src/file/numbering/numbering.spec.ts b/src/file/numbering/numbering.spec.ts
index cebf780b0c..0142335c26 100644
--- a/src/file/numbering/numbering.spec.ts
+++ b/src/file/numbering/numbering.spec.ts
@@ -22,7 +22,7 @@ describe("Numbering", () => {
expect(abstractNums).to.have.lengthOf(1);
expect(abstractNums[0]["w:abstractNum"]).to.deep.include.members([
{ _attr: { "w:abstractNumId": 0, "w15:restartNumberingAfterBreak": 0 } },
- { "w:multiLevelType": [{ _attr: { "w:val": "hybridMultilevel" } }] },
+ { "w:multiLevelType": { _attr: { "w:val": "hybridMultilevel" } } },
]);
abstractNums
@@ -37,9 +37,9 @@ describe("Numbering", () => {
{ "w:numFmt": [{ _attr: { "w:val": "bullet" } }] },
]);
// Once chai 4.0.0 lands and #644 is resolved, we can add the following to the test:
- // {"w:lvlText": [{"_attr": {"w:val": "•"}}]},
- // {"w:rPr": [{"w:rFonts": [{"_attr": {"w:ascii": "Symbol", "w:cs": "Symbol", "w:eastAsia": "Symbol", "w:hAnsi": "Symbol", "w:hint": "default"}}]}]},
- // {"w:pPr": [{"_attr": {}},
+ // {"w:lvlText": {"_attr": {"w:val": "•"}}},
+ // {"w:rPr": [{"w:rFonts": {"_attr": {"w:ascii": "Symbol", "w:cs": "Symbol", "w:eastAsia": "Symbol", "w:hAnsi": "Symbol", "w:hint": "default"}}}]},
+ // {"w:pPr": [
// {"w:ind": [{"_attr": {"w:left": 720, "w:hanging": 360}}]}]},
});
});
@@ -65,7 +65,7 @@ describe("Numbering", () => {
expect(n).to.be.instanceof(Num);
const tree = new Formatter().format(numbering);
const serializedN = tree["w:numbering"].find((obj) => obj["w:num"] && obj["w:num"][0]._attr["w:numId"] === n.id);
- expect(serializedN["w:num"][1]["w:abstractNumId"][0]._attr["w:val"]).to.equal(a2.id);
+ expect(serializedN["w:num"][1]["w:abstractNumId"]._attr["w:val"]).to.equal(a2.id);
});
it("assigns a unique ID to each concrete numbering it creates", () => {
@@ -89,10 +89,10 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(3, "lowerLetter", "%1)", "end");
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({ _attr: { "w:ilvl": 3, "w15:tentative": 1 } });
- expect(tree["w:lvl"]).to.include({ "w:start": [{ _attr: { "w:val": 1 } }] });
- expect(tree["w:lvl"]).to.include({ "w:lvlJc": [{ _attr: { "w:val": "end" } }] });
- expect(tree["w:lvl"]).to.include({ "w:numFmt": [{ _attr: { "w:val": "lowerLetter" } }] });
- expect(tree["w:lvl"]).to.include({ "w:lvlText": [{ _attr: { "w:val": "%1)" } }] });
+ expect(tree["w:lvl"]).to.include({ "w:start": { _attr: { "w:val": 1 } } });
+ expect(tree["w:lvl"]).to.include({ "w:lvlJc": { _attr: { "w:val": "end" } } });
+ expect(tree["w:lvl"]).to.include({ "w:numFmt": { _attr: { "w:val": "lowerLetter" } } });
+ expect(tree["w:lvl"]).to.include({ "w:lvlText": { _attr: { "w:val": "%1)" } } });
});
it("uses 'start' as the default alignment", () => {
@@ -100,10 +100,10 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(3, "lowerLetter", "%1)");
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({ _attr: { "w:ilvl": 3, "w15:tentative": 1 } });
- expect(tree["w:lvl"]).to.include({ "w:start": [{ _attr: { "w:val": 1 } }] });
- expect(tree["w:lvl"]).to.include({ "w:lvlJc": [{ _attr: { "w:val": "start" } }] });
- expect(tree["w:lvl"]).to.include({ "w:numFmt": [{ _attr: { "w:val": "lowerLetter" } }] });
- expect(tree["w:lvl"]).to.include({ "w:lvlText": [{ _attr: { "w:val": "%1)" } }] });
+ expect(tree["w:lvl"]).to.include({ "w:start": { _attr: { "w:val": 1 } } });
+ expect(tree["w:lvl"]).to.include({ "w:lvlJc": { _attr: { "w:val": "start" } } });
+ expect(tree["w:lvl"]).to.include({ "w:numFmt": { _attr: { "w:val": "lowerLetter" } } });
+ expect(tree["w:lvl"]).to.include({ "w:lvlText": { _attr: { "w:val": "%1)" } } });
});
describe("formatting methods: paragraph properties", () => {
@@ -112,7 +112,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerLetter", "%0.").indent({ left: 720 });
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:ind": [{ _attr: { "w:left": 720 } }] }],
+ "w:pPr": [{ "w:ind": { _attr: { "w:left": 720 } } }],
});
});
@@ -121,7 +121,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerLetter", "%0.").spacing({ before: 50, after: 150 });
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:spacing": [{ _attr: { "w:before": 50, "w:after": 150 } }] }],
+ "w:pPr": [{ "w:spacing": { _attr: { "w:before": 50, "w:after": 150 } } }],
});
});
@@ -130,7 +130,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerLetter", "%0.").center();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "center" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "center" } } }],
});
});
@@ -139,7 +139,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.", "left").left();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "left" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "left" } } }],
});
});
@@ -148,7 +148,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").right();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "right" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "right" } } }],
});
});
@@ -157,7 +157,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").justified();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "both" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "both" } } }],
});
});
@@ -170,16 +170,14 @@ describe("AbstractNumbering", () => {
{
"w:pBdr": [
{
- "w:bottom": [
- {
- _attr: {
- "w:color": "auto",
- "w:space": "1",
- "w:val": "single",
- "w:sz": "6",
- },
+ "w:bottom": {
+ _attr: {
+ "w:color": "auto",
+ "w:space": "1",
+ "w:val": "single",
+ "w:sz": "6",
},
- ],
+ },
},
],
},
@@ -194,7 +192,7 @@ describe("AbstractNumbering", () => {
expect(tree["w:lvl"]).to.include({
"w:pPr": [
{
- "w:tabs": [{ "w:tab": [{ _attr: { "w:val": "left", "w:pos": 1200 } }] }],
+ "w:tabs": [{ "w:tab": { _attr: { "w:val": "left", "w:pos": 1200 } } }],
},
],
});
@@ -207,7 +205,7 @@ describe("AbstractNumbering", () => {
expect(tree["w:lvl"]).to.include({
"w:pPr": [
{
- "w:tabs": [{ "w:tab": [{ _attr: { "w:val": "right", "w:pos": 9026 } }] }],
+ "w:tabs": [{ "w:tab": { _attr: { "w:val": "right", "w:pos": 9026 } } }],
},
],
});
@@ -218,7 +216,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").keepLines();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:keepLines": [] }],
+ "w:pPr": [{ "w:keepLines": null }],
});
});
@@ -227,7 +225,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").keepNext();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:pPr": [{ "w:keepNext": [] }],
+ "w:pPr": [{ "w:keepNext": null }],
});
});
});
@@ -238,7 +236,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").size(24);
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:sz": [{ _attr: { "w:val": 24 } }] }],
+ "w:rPr": [{ "w:sz": { _attr: { "w:val": 24 } } }],
});
});
@@ -247,7 +245,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").smallCaps();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:smallCaps": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:smallCaps": { _attr: { "w:val": true } } }],
});
});
@@ -256,7 +254,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").allCaps();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:caps": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:caps": { _attr: { "w:val": true } } }],
});
});
@@ -265,7 +263,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").strike();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:strike": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:strike": { _attr: { "w:val": true } } }],
});
});
@@ -274,7 +272,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").doubleStrike();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:dstrike": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:dstrike": { _attr: { "w:val": true } } }],
});
});
@@ -283,7 +281,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").subScript();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:vertAlign": [{ _attr: { "w:val": "subscript" } }] }],
+ "w:rPr": [{ "w:vertAlign": { _attr: { "w:val": "subscript" } } }],
});
});
@@ -292,7 +290,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").superScript();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:vertAlign": [{ _attr: { "w:val": "superscript" } }] }],
+ "w:rPr": [{ "w:vertAlign": { _attr: { "w:val": "superscript" } } }],
});
});
@@ -302,7 +300,7 @@ describe("AbstractNumbering", () => {
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
"w:rPr": [
- { "w:rFonts": [{ _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } }] },
+ { "w:rFonts": { _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } } },
],
});
});
@@ -312,7 +310,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").bold();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:b": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:b": { _attr: { "w:val": true } } }],
});
});
@@ -321,7 +319,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").italics();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:i": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:i": { _attr: { "w:val": true } } }],
});
});
@@ -331,7 +329,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").underline();
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "single" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "single" } } }],
});
});
@@ -340,7 +338,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").underline("double");
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "double" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "double" } } }],
});
});
@@ -349,7 +347,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").underline("double", "005599");
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "double", "w:color": "005599" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "double", "w:color": "005599" } } }],
});
});
});
@@ -359,7 +357,7 @@ describe("AbstractNumbering", () => {
const level = abstractNumbering.createLevel(0, "lowerRoman", "%0.").color("123456");
const tree = new Formatter().format(level);
expect(tree["w:lvl"]).to.include({
- "w:rPr": [{ "w:color": [{ _attr: { "w:val": "123456" } }] }],
+ "w:rPr": [{ "w:color": { _attr: { "w:val": "123456" } } }],
});
});
});
@@ -388,20 +386,12 @@ describe("concrete numbering", () => {
},
},
{
- "w:lvl": [
- {
- _attr: {
- "w:ilvl": 3,
- "w15:tentative": 1,
- },
+ "w:lvl": {
+ _attr: {
+ "w:ilvl": 3,
+ "w15:tentative": 1,
},
- {
- "w:pPr": [],
- },
- {
- "w:rPr": [],
- },
- ],
+ },
},
],
});
@@ -418,29 +408,19 @@ describe("concrete numbering", () => {
},
},
{
- "w:startOverride": [
- {
- _attr: {
- "w:val": 9,
- },
+ "w:startOverride": {
+ _attr: {
+ "w:val": 9,
},
- ],
+ },
},
{
- "w:lvl": [
- {
- _attr: {
- "w:ilvl": 1,
- "w15:tentative": 1,
- },
+ "w:lvl": {
+ _attr: {
+ "w:ilvl": 1,
+ "w15:tentative": 1,
},
- {
- "w:pPr": [],
- },
- {
- "w:rPr": [],
- },
- ],
+ },
},
],
});
@@ -454,7 +434,7 @@ describe("concrete numbering", () => {
"w:lvlOverride": [
{ _attr: { "w:ilvl": 1 } },
{
- "w:lvl": [{ _attr: { "w15:tentative": 1, "w:ilvl": 1 } }, { "w:pPr": [] }, { "w:rPr": [] }],
+ "w:lvl": { _attr: { "w15:tentative": 1, "w:ilvl": 1 } },
},
],
});
diff --git a/src/file/paragraph/formatting/spacing.spec.ts b/src/file/paragraph/formatting/spacing.spec.ts
index ea4dafe1b8..8241fb282c 100644
--- a/src/file/paragraph/formatting/spacing.spec.ts
+++ b/src/file/paragraph/formatting/spacing.spec.ts
@@ -10,7 +10,7 @@ describe("Spacing", () => {
const spacing = new Spacing({ before: 100, after: 120, line: 150 });
const tree = new Formatter().format(spacing);
expect(tree).to.deep.equal({
- "w:spacing": [{ _attr: { "w:after": 120, "w:before": 100, "w:line": 150 } }],
+ "w:spacing": { _attr: { "w:after": 120, "w:before": 100, "w:line": 150 } },
});
});
@@ -18,7 +18,7 @@ describe("Spacing", () => {
const spacing = new Spacing({ before: 100 });
const tree = new Formatter().format(spacing);
expect(tree).to.deep.equal({
- "w:spacing": [{ _attr: { "w:before": 100 } }],
+ "w:spacing": { _attr: { "w:before": 100 } },
});
});
});
@@ -30,7 +30,7 @@ describe("ContextualSpacing", () => {
const spacing = new ContextualSpacing(true);
const tree = new Formatter().format(spacing);
expect(tree).to.deep.equal({
- "w:contextualSpacing": [{ _attr: { "w:val": 1 } }],
+ "w:contextualSpacing": { _attr: { "w:val": 1 } },
});
});
@@ -38,7 +38,7 @@ describe("ContextualSpacing", () => {
const spacing = new ContextualSpacing(false);
const tree = new Formatter().format(spacing);
expect(tree).to.deep.equal({
- "w:contextualSpacing": [{ _attr: { "w:val": 0 } }],
+ "w:contextualSpacing": { _attr: { "w:val": 0 } },
});
});
});
diff --git a/src/file/paragraph/image.spec.ts b/src/file/paragraph/image.spec.ts
index 7dcb6ae148..d69eda845b 100644
--- a/src/file/paragraph/image.spec.ts
+++ b/src/file/paragraph/image.spec.ts
@@ -45,14 +45,8 @@ describe("Image", () => {
const tree = new Formatter().format(image);
expect(tree).to.deep.equal({
"w:p": [
- {
- "w:pPr": [],
- },
{
"w:r": [
- {
- "w:rPr": [],
- },
{
"w:drawing": [
{
@@ -66,49 +60,41 @@ describe("Image", () => {
},
},
{
- "wp:extent": [
- {
- _attr: {
- cx: 20,
- cy: 20,
- },
+ "wp:extent": {
+ _attr: {
+ cx: 20,
+ cy: 20,
},
- ],
+ },
},
{
- "wp:effectExtent": [
- {
- _attr: {
- b: 0,
- l: 0,
- r: 0,
- t: 0,
- },
+ "wp:effectExtent": {
+ _attr: {
+ b: 0,
+ l: 0,
+ r: 0,
+ t: 0,
},
- ],
+ },
},
{
- "wp:docPr": [
- {
- _attr: {
- descr: "",
- id: 0,
- name: "",
- },
+ "wp:docPr": {
+ _attr: {
+ descr: "",
+ id: 0,
+ name: "",
},
- ],
+ },
},
{
"wp:cNvGraphicFramePr": [
{
- "a:graphicFrameLocks": [
- {
- _attr: {
- noChangeAspect: 1,
- "xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main",
- },
+ "a:graphicFrameLocks": {
+ _attr: {
+ noChangeAspect: 1,
+ "xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main",
},
- ],
+ },
},
],
},
@@ -137,27 +123,23 @@ describe("Image", () => {
{
"pic:nvPicPr": [
{
- "pic:cNvPr": [
- {
- _attr: {
- desc: "",
- id: 0,
- name: "",
- },
+ "pic:cNvPr": {
+ _attr: {
+ desc: "",
+ id: 0,
+ name: "",
},
- ],
+ },
},
{
"pic:cNvPicPr": [
{
- "a:picLocks": [
- {
- _attr: {
- noChangeArrowheads: 1,
- noChangeAspect: 1,
- },
+ "a:picLocks": {
+ _attr: {
+ noChangeArrowheads: 1,
+ noChangeAspect: 1,
},
- ],
+ },
},
],
},
@@ -166,22 +148,20 @@ describe("Image", () => {
{
"pic:blipFill": [
{
- "a:blip": [
- {
- _attr: {
- cstate: "none",
- "r:embed": "rId{test.png}",
- },
+ "a:blip": {
+ _attr: {
+ cstate: "none",
+ "r:embed": "rId{test.png}",
},
- ],
+ },
},
{
- "a:srcRect": [],
+ "a:srcRect": null,
},
{
"a:stretch": [
{
- "a:fillRect": [],
+ "a:fillRect": null,
},
],
},
@@ -197,24 +177,20 @@ describe("Image", () => {
{
"a:xfrm": [
{
- "a:ext": [
- {
- _attr: {
- cx: 10,
- cy: 10,
- },
+ "a:ext": {
+ _attr: {
+ cx: 10,
+ cy: 10,
},
- ],
+ },
},
{
- "a:off": [
- {
- _attr: {
- x: 0,
- y: 0,
- },
+ "a:off": {
+ _attr: {
+ x: 0,
+ y: 0,
},
- ],
+ },
},
],
},
@@ -226,7 +202,7 @@ describe("Image", () => {
},
},
{
- "a:avLst": [],
+ "a:avLst": null,
},
],
},
diff --git a/src/file/paragraph/links/hyperlink.spec.ts b/src/file/paragraph/links/hyperlink.spec.ts
index 34c7d7dc7c..2cadcfcaca 100644
--- a/src/file/paragraph/links/hyperlink.spec.ts
+++ b/src/file/paragraph/links/hyperlink.spec.ts
@@ -31,7 +31,7 @@ describe("Hyperlink", () => {
const tree = new Formatter().format(hyperlink);
const runJson = {
"w:r": [
- { "w:rPr": [{ "w:rStyle": [{ _attr: { "w:val": "Hyperlink" } }] }] },
+ { "w:rPr": [{ "w:rStyle": { _attr: { "w:val": "Hyperlink" } } }] },
{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "https://example.com"] },
],
};
diff --git a/src/file/paragraph/paragraph.spec.ts b/src/file/paragraph/paragraph.spec.ts
index f47850ac4d..382095b268 100644
--- a/src/file/paragraph/paragraph.spec.ts
+++ b/src/file/paragraph/paragraph.spec.ts
@@ -40,7 +40,7 @@ describe("Paragraph", () => {
expect(tree)
.to.be.an("array")
.which.includes({
- "w:r": [{ "w:rPr": [] }, { "w:t": [{ _attr: { "xml:space": "preserve" } }, "this is a test run"] }],
+ "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "this is a test run"] }],
});
});
});
@@ -52,7 +52,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "Heading1" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "Heading1" } } }],
},
],
});
@@ -66,7 +66,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "Heading2" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "Heading2" } } }],
},
],
});
@@ -80,7 +80,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "Heading3" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "Heading3" } } }],
},
],
});
@@ -94,7 +94,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "Heading4" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "Heading4" } } }],
},
],
});
@@ -108,7 +108,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "Heading5" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "Heading5" } } }],
},
],
});
@@ -122,7 +122,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "Heading6" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "Heading6" } } }],
},
],
});
@@ -136,7 +136,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "Title" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "Title" } } }],
},
],
});
@@ -150,7 +150,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "center" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "center" } } }],
},
],
});
@@ -164,7 +164,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "left" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "left" } } }],
},
],
});
@@ -178,7 +178,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "right" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "right" } } }],
},
],
});
@@ -192,7 +192,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "start" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "start" } } }],
},
],
});
@@ -206,7 +206,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "end" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "end" } } }],
},
],
});
@@ -220,7 +220,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "distribute" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "distribute" } } }],
},
],
});
@@ -234,7 +234,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "both" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "both" } } }],
},
],
});
@@ -252,14 +252,12 @@ describe("Paragraph", () => {
{
"w:tabs": [
{
- "w:tab": [
- {
- _attr: {
- "w:pos": 9026,
- "w:val": "right",
- },
+ "w:tab": {
+ _attr: {
+ "w:pos": 9026,
+ "w:val": "right",
},
- ],
+ },
},
],
},
@@ -281,15 +279,13 @@ describe("Paragraph", () => {
{
"w:tabs": [
{
- "w:tab": [
- {
- _attr: {
- "w:pos": 100,
- "w:val": "left",
- "w:leader": "hyphen",
- },
+ "w:tab": {
+ _attr: {
+ "w:pos": 100,
+ "w:val": "left",
+ "w:leader": "hyphen",
},
- ],
+ },
},
],
},
@@ -311,15 +307,13 @@ describe("Paragraph", () => {
{
"w:tabs": [
{
- "w:tab": [
- {
- _attr: {
- "w:pos": 100,
- "w:val": "right",
- "w:leader": "dot",
- },
+ "w:tab": {
+ _attr: {
+ "w:pos": 100,
+ "w:val": "right",
+ "w:leader": "dot",
},
- ],
+ },
},
],
},
@@ -341,15 +335,13 @@ describe("Paragraph", () => {
{
"w:tabs": [
{
- "w:tab": [
- {
- _attr: {
- "w:pos": 100,
- "w:val": "center",
- "w:leader": "middleDot",
- },
+ "w:tab": {
+ _attr: {
+ "w:pos": 100,
+ "w:val": "center",
+ "w:leader": "middleDot",
},
- ],
+ },
},
],
},
@@ -367,7 +359,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:contextualSpacing": [{ _attr: { "w:val": 1 } }] }],
+ "w:pPr": [{ "w:contextualSpacing": { _attr: { "w:val": 1 } } }],
},
],
});
@@ -379,7 +371,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:contextualSpacing": [{ _attr: { "w:val": 0 } }] }],
+ "w:pPr": [{ "w:contextualSpacing": { _attr: { "w:val": 0 } } }],
},
],
});
@@ -397,16 +389,14 @@ describe("Paragraph", () => {
{
"w:pBdr": [
{
- "w:bottom": [
- {
- _attr: {
- "w:val": "single",
- "w:color": "auto",
- "w:space": "1",
- "w:sz": "6",
- },
+ "w:bottom": {
+ _attr: {
+ "w:val": "single",
+ "w:color": "auto",
+ "w:space": "1",
+ "w:sz": "6",
},
- ],
+ },
},
],
},
@@ -430,28 +420,24 @@ describe("Paragraph", () => {
{
"w:pBdr": [
{
- "w:left": [
- {
- _attr: {
- "w:color": "auto",
- "w:space": "1",
- "w:sz": "6",
- "w:val": "single",
- },
+ "w:left": {
+ _attr: {
+ "w:color": "auto",
+ "w:space": "1",
+ "w:sz": "6",
+ "w:val": "single",
},
- ],
+ },
},
{
- "w:right": [
- {
- _attr: {
- "w:color": "auto",
- "w:space": "1",
- "w:sz": "6",
- "w:val": "single",
- },
+ "w:right": {
+ _attr: {
+ "w:color": "auto",
+ "w:space": "1",
+ "w:sz": "6",
+ "w:val": "single",
},
- ],
+ },
},
],
},
@@ -469,10 +455,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [],
- },
- {
- "w:r": [{ "w:rPr": [] }, { "w:br": [{ _attr: { "w:type": "page" } }] }],
+ "w:r": [{ "w:br": { _attr: { "w:type": "page" } } }],
},
],
});
@@ -488,7 +471,7 @@ describe("Paragraph", () => {
{
"w:pPr": [
{
- "w:pageBreakBefore": [],
+ "w:pageBreakBefore": null,
},
],
},
@@ -510,7 +493,7 @@ describe("Paragraph", () => {
.which.is.an("array")
.which.has.length.at.least(1);
expect(tree["w:p"][0]["w:pPr"][0]).to.deep.equal({
- "w:pStyle": [{ _attr: { "w:val": "ListParagraph" } }],
+ "w:pStyle": { _attr: { "w:val": "ListParagraph" } },
});
});
@@ -526,7 +509,7 @@ describe("Paragraph", () => {
.which.is.an("array")
.which.has.length.at.least(1);
expect(tree["w:p"][0]["w:pPr"][0]).to.deep.equal({
- "w:pStyle": [{ _attr: { "w:val": "ListParagraph" } }],
+ "w:pStyle": { _attr: { "w:val": "ListParagraph" } },
});
});
@@ -542,7 +525,7 @@ describe("Paragraph", () => {
.which.is.an("array")
.which.has.length.at.least(2);
expect(tree["w:p"][0]["w:pPr"][1]).to.deep.equal({
- "w:numPr": [{ "w:ilvl": [{ _attr: { "w:val": 1 } }] }, { "w:numId": [{ _attr: { "w:val": 1 } }] }],
+ "w:numPr": [{ "w:ilvl": { _attr: { "w:val": 1 } } }, { "w:numId": { _attr: { "w:val": 1 } } }],
});
});
});
@@ -565,7 +548,7 @@ describe("Paragraph", () => {
.which.is.an("array")
.which.has.length.at.least(1);
expect(tree["w:p"][0]["w:pPr"][0]).to.deep.equal({
- "w:pStyle": [{ _attr: { "w:val": "ListParagraph" } }],
+ "w:pStyle": { _attr: { "w:val": "ListParagraph" } },
});
});
@@ -581,11 +564,11 @@ describe("Paragraph", () => {
"w:p": [
{
"w:pPr": [
- { "w:pStyle": [{ _attr: { "w:val": "ListParagraph" } }] },
+ { "w:pStyle": { _attr: { "w:val": "ListParagraph" } } },
{
"w:numPr": [
- { "w:ilvl": [{ _attr: { "w:val": 0 } }] },
- { "w:numId": [{ _attr: { "w:val": letterNumbering.id } }] },
+ { "w:ilvl": { _attr: { "w:val": 0 } } },
+ { "w:numId": { _attr: { "w:val": letterNumbering.id } } },
],
},
],
@@ -602,7 +585,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:pStyle": [{ _attr: { "w:val": "myFancyStyle" } }] }],
+ "w:pPr": [{ "w:pStyle": { _attr: { "w:val": "myFancyStyle" } } }],
},
],
});
@@ -616,7 +599,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:ind": [{ _attr: { "w:left": 720 } }] }],
+ "w:pPr": [{ "w:ind": { _attr: { "w:left": 720 } } }],
},
],
});
@@ -630,7 +613,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:spacing": [{ _attr: { "w:before": 90, "w:line": 50 } }] }],
+ "w:pPr": [{ "w:spacing": { _attr: { "w:before": 90, "w:line": 50 } } }],
},
],
});
@@ -642,7 +625,7 @@ describe("Paragraph", () => {
paragraph.keepLines();
const tree = new Formatter().format(paragraph);
expect(tree).to.deep.equal({
- "w:p": [{ "w:pPr": [{ "w:keepLines": [] }] }],
+ "w:p": [{ "w:pPr": [{ "w:keepLines": null }] }],
});
});
});
@@ -652,7 +635,7 @@ describe("Paragraph", () => {
paragraph.keepNext();
const tree = new Formatter().format(paragraph);
expect(tree).to.deep.equal({
- "w:p": [{ "w:pPr": [{ "w:keepNext": [] }] }],
+ "w:p": [{ "w:pPr": [{ "w:keepNext": null }] }],
});
});
});
@@ -662,7 +645,7 @@ describe("Paragraph", () => {
paragraph.bidirectional();
const tree = new Formatter().format(paragraph);
expect(tree).to.deep.equal({
- "w:p": [{ "w:pPr": [{ "w:bidi": [] }] }],
+ "w:p": [{ "w:pPr": [{ "w:bidi": null }] }],
});
});
});
@@ -674,7 +657,7 @@ describe("Paragraph", () => {
expect(tree).to.deep.equal({
"w:p": [
{
- "w:pPr": [{ "w:outlineLvl": [{ _attr: { "w:val": "0" } }] }],
+ "w:pPr": [{ "w:outlineLvl": { _attr: { "w:val": "0" } } }],
},
],
});
diff --git a/src/file/paragraph/properties.ts b/src/file/paragraph/properties.ts
index 4388e2b111..188960145c 100644
--- a/src/file/paragraph/properties.ts
+++ b/src/file/paragraph/properties.ts
@@ -1,8 +1,8 @@
// http://officeopenxml.com/WPparagraphProperties.php
-import { XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent, XmlComponent } from "file/xml-components";
import { Border } from "./formatting/border";
-export class ParagraphProperties extends XmlComponent {
+export class ParagraphProperties extends IgnoreIfEmptyXmlComponent {
public readonly paragraphBorder: Border;
constructor() {
diff --git a/src/file/paragraph/run/properties.ts b/src/file/paragraph/run/properties.ts
index 0a112b35cb..903282b5a6 100644
--- a/src/file/paragraph/run/properties.ts
+++ b/src/file/paragraph/run/properties.ts
@@ -1,6 +1,6 @@
-import { XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent, XmlComponent } from "file/xml-components";
-export class RunProperties extends XmlComponent {
+export class RunProperties extends IgnoreIfEmptyXmlComponent {
constructor() {
super("w:rPr");
}
diff --git a/src/file/paragraph/run/run-components/text.spec.ts b/src/file/paragraph/run/run-components/text.spec.ts
index 49ec73f48b..57a3a5ede1 100644
--- a/src/file/paragraph/run/run-components/text.spec.ts
+++ b/src/file/paragraph/run/run-components/text.spec.ts
@@ -9,7 +9,7 @@ describe("Text", () => {
it("creates an empty text run if no text is given", () => {
const t = new Text("");
const f = new Formatter().format(t);
- expect(f).to.deep.equal({ "w:t": [{ _attr: { "xml:space": "preserve" } }] });
+ expect(f).to.deep.equal({ "w:t": { _attr: { "xml:space": "preserve" } } });
});
it("adds the passed in text to the component", () => {
diff --git a/src/file/paragraph/run/run-fonts.spec.ts b/src/file/paragraph/run/run-fonts.spec.ts
index af766e9f74..1eacc8ecc9 100644
--- a/src/file/paragraph/run/run-fonts.spec.ts
+++ b/src/file/paragraph/run/run-fonts.spec.ts
@@ -9,16 +9,16 @@ describe("RunFonts", () => {
it("uses the font name for both ascii and hAnsi", () => {
const tree = new Formatter().format(new RunFonts("Times"));
expect(tree).to.deep.equal({
- "w:rFonts": [{ _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } }],
+ "w:rFonts": { _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } },
});
});
it("uses hint if given", () => {
const tree = new Formatter().format(new RunFonts("Times", "default"));
expect(tree).to.deep.equal({
- "w:rFonts": [
- { _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times", "w:hint": "default" } },
- ],
+ "w:rFonts": {
+ _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times", "w:hint": "default" },
+ },
});
});
});
diff --git a/src/file/paragraph/run/run.spec.ts b/src/file/paragraph/run/run.spec.ts
index b1fbc8794a..c30147d22f 100644
--- a/src/file/paragraph/run/run.spec.ts
+++ b/src/file/paragraph/run/run.spec.ts
@@ -41,7 +41,7 @@ describe("Run", () => {
run.underline();
const tree = new Formatter().format(run);
expect(tree).to.deep.equal({
- "w:r": [{ "w:rPr": [{ "w:u": [{ _attr: { "w:val": "single" } }] }] }],
+ "w:r": [{ "w:rPr": [{ "w:u": { _attr: { "w:val": "single" } } }] }],
});
});
@@ -49,7 +49,7 @@ describe("Run", () => {
run.underline("double", "990011");
const tree = new Formatter().format(run);
expect(tree).to.deep.equal({
- "w:r": [{ "w:rPr": [{ "w:u": [{ _attr: { "w:val": "double", "w:color": "990011" } }] }] }],
+ "w:r": [{ "w:rPr": [{ "w:u": { _attr: { "w:val": "double", "w:color": "990011" } } }] }],
});
});
});
@@ -114,7 +114,7 @@ describe("Run", () => {
"w:r": [
{
"w:rPr": [
- { "w:rFonts": [{ _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } }] },
+ { "w:rFonts": { _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } } },
],
},
],
@@ -127,7 +127,7 @@ describe("Run", () => {
run.color("001122");
const tree = new Formatter().format(run);
expect(tree).to.deep.equal({
- "w:r": [{ "w:rPr": [{ "w:color": [{ _attr: { "w:val": "001122" } }] }] }],
+ "w:r": [{ "w:rPr": [{ "w:color": { _attr: { "w:val": "001122" } } }] }],
});
});
});
@@ -139,7 +139,7 @@ describe("Run", () => {
expect(tree).to.deep.equal({
"w:r": [
{
- "w:rPr": [{ "w:sz": [{ _attr: { "w:val": 24 } }] }, { "w:szCs": [{ _attr: { "w:val": 24 } }] }],
+ "w:rPr": [{ "w:sz": { _attr: { "w:val": 24 } } }, { "w:szCs": { _attr: { "w:val": 24 } } }],
},
],
});
@@ -151,7 +151,7 @@ describe("Run", () => {
run.rightToLeft();
const tree = new Formatter().format(run);
expect(tree).to.deep.equal({
- "w:r": [{ "w:rPr": [{ "w:rtl": [{ _attr: { "w:val": true } }] }] }],
+ "w:r": [{ "w:rPr": [{ "w:rtl": { _attr: { "w:val": true } } }] }],
});
});
});
@@ -162,11 +162,10 @@ describe("Run", () => {
const tree = new Formatter().format(run);
expect(tree).to.deep.equal({
"w:r": [
- { "w:rPr": [] },
- { "w:fldChar": [{ _attr: { "w:fldCharType": "begin" } }] },
+ { "w:fldChar": { _attr: { "w:fldCharType": "begin" } } },
{ "w:instrText": [{ _attr: { "xml:space": "preserve" } }, "NUMPAGES"] },
- { "w:fldChar": [{ _attr: { "w:fldCharType": "separate" } }] },
- { "w:fldChar": [{ _attr: { "w:fldCharType": "end" } }] },
+ { "w:fldChar": { _attr: { "w:fldCharType": "separate" } } },
+ { "w:fldChar": { _attr: { "w:fldCharType": "end" } } },
],
});
});
@@ -178,11 +177,10 @@ describe("Run", () => {
const tree = new Formatter().format(run);
expect(tree).to.deep.equal({
"w:r": [
- { "w:rPr": [] },
- { "w:fldChar": [{ _attr: { "w:fldCharType": "begin" } }] },
+ { "w:fldChar": { _attr: { "w:fldCharType": "begin" } } },
{ "w:instrText": [{ _attr: { "xml:space": "preserve" } }, "PAGE"] },
- { "w:fldChar": [{ _attr: { "w:fldCharType": "separate" } }] },
- { "w:fldChar": [{ _attr: { "w:fldCharType": "end" } }] },
+ { "w:fldChar": { _attr: { "w:fldCharType": "separate" } } },
+ { "w:fldChar": { _attr: { "w:fldCharType": "end" } } },
],
});
});
@@ -193,7 +191,7 @@ describe("Run", () => {
run.style("myRunStyle");
const tree = new Formatter().format(run);
expect(tree).to.deep.equal({
- "w:r": [{ "w:rPr": [{ "w:rStyle": [{ _attr: { "w:val": "myRunStyle" } }] }] }],
+ "w:r": [{ "w:rPr": [{ "w:rStyle": { _attr: { "w:val": "myRunStyle" } } }] }],
});
});
});
diff --git a/src/file/paragraph/run/sequential-identifier.spec.ts b/src/file/paragraph/run/sequential-identifier.spec.ts
index f0f12cf8a8..f4a85393b6 100644
--- a/src/file/paragraph/run/sequential-identifier.spec.ts
+++ b/src/file/paragraph/run/sequential-identifier.spec.ts
@@ -17,17 +17,12 @@ describe("Sequential Identifier", () => {
const DEFAULT_SEQ = {
"w:r": [
{
- "w:rPr": [],
- },
- {
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "begin",
- "w:dirty": true,
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "begin",
+ "w:dirty": true,
},
- ],
+ },
},
{
"w:instrText": [
@@ -40,22 +35,18 @@ const DEFAULT_SEQ = {
],
},
{
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "separate",
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "separate",
},
- ],
+ },
},
{
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "end",
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "end",
},
- ],
+ },
},
],
};
diff --git a/src/file/paragraph/run/text-run.spec.ts b/src/file/paragraph/run/text-run.spec.ts
index 817e030856..077d6300f0 100644
--- a/src/file/paragraph/run/text-run.spec.ts
+++ b/src/file/paragraph/run/text-run.spec.ts
@@ -12,7 +12,7 @@ describe("TextRun", () => {
run = new TextRun("test");
const f = new Formatter().format(run);
expect(f).to.deep.equal({
- "w:r": [{ "w:rPr": [] }, { "w:t": [{ _attr: { "xml:space": "preserve" } }, "test"] }],
+ "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "test"] }],
});
});
});
diff --git a/src/file/paragraph/run/underline.spec.ts b/src/file/paragraph/run/underline.spec.ts
index c17efe54a2..346b4f7a93 100644
--- a/src/file/paragraph/run/underline.spec.ts
+++ b/src/file/paragraph/run/underline.spec.ts
@@ -17,7 +17,7 @@ describe("Underline", () => {
const underline = new u.Underline();
const tree = new Formatter().format(underline);
expect(tree).to.deep.equal({
- "w:u": [{ _attr: { "w:val": "single" } }],
+ "w:u": { _attr: { "w:val": "single" } },
});
});
@@ -25,7 +25,7 @@ describe("Underline", () => {
const underline = new u.Underline("double", "FF00CC");
const tree = new Formatter().format(underline);
expect(tree).to.deep.equal({
- "w:u": [{ _attr: { "w:val": "double", "w:color": "FF00CC" } }],
+ "w:u": { _attr: { "w:val": "double", "w:color": "FF00CC" } },
});
});
});
diff --git a/src/file/relationships/relationships.spec.ts b/src/file/relationships/relationships.spec.ts
index 00ab8c25bb..9525bd4fff 100644
--- a/src/file/relationships/relationships.spec.ts
+++ b/src/file/relationships/relationships.spec.ts
@@ -11,8 +11,7 @@ describe("Relationships", () => {
const properties = new Relationships();
const tree = new Formatter().format(properties);
expect(Object.keys(tree)).to.deep.equal(["Relationships"]);
- expect(tree["Relationships"]).to.be.an.instanceof(Array);
- expect(tree["Relationships"][0]).to.deep.equal({
+ expect(tree["Relationships"]).to.deep.equal({
_attr: { xmlns: "http://schemas.openxmlformats.org/package/2006/relationships" },
});
});
diff --git a/src/file/settings/compatibility.spec.ts b/src/file/settings/compatibility.spec.ts
index 198ec854ad..2c94b2a84c 100644
--- a/src/file/settings/compatibility.spec.ts
+++ b/src/file/settings/compatibility.spec.ts
@@ -8,7 +8,7 @@ describe("Compatibility", () => {
const compatibility = new Compatibility();
const tree = new Formatter().format(compatibility);
- expect(tree).to.deep.equal({ "w:compat": [] });
+ expect(tree).to.deep.equal({ "w:compat": null });
});
});
@@ -18,7 +18,7 @@ describe("Compatibility", () => {
compatibility.doNotExpandShiftReturn();
const tree = new Formatter().format(compatibility);
- expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotExpandShiftReturn": [] }] });
+ expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotExpandShiftReturn": null }] });
});
});
});
diff --git a/src/file/settings/settings.spec.ts b/src/file/settings/settings.spec.ts
index 3849f37a4b..1e34c781c2 100644
--- a/src/file/settings/settings.spec.ts
+++ b/src/file/settings/settings.spec.ts
@@ -13,9 +13,7 @@ describe("Settings", () => {
expect(keys).is.an.instanceof(Array);
expect(keys).has.length(1);
expect(keys[0]).to.be.equal("w:settings");
- expect(tree["w:settings"]).is.an.instanceof(Array);
- expect(tree["w:settings"]).has.length(1);
- keys = Object.keys(tree["w:settings"][0]);
+ keys = Object.keys(tree["w:settings"]);
expect(keys).is.an.instanceof(Array);
expect(keys).has.length(1);
expect(keys[0]).to.be.equal("_attr");
@@ -39,12 +37,12 @@ describe("Settings", () => {
expect(keys).is.an.instanceof(Array);
expect(keys).has.length(1);
expect(keys[0]).to.be.equal("w:updateFields");
- const updateFieldsArray = rootArray[1]["w:updateFields"];
- keys = Object.keys(updateFieldsArray[0]);
+ const updateFields = rootArray[1]["w:updateFields"];
+ keys = Object.keys(updateFields);
expect(keys).is.an.instanceof(Array);
expect(keys).has.length(1);
expect(keys[0]).to.be.equal("_attr");
- const updateFieldsAttr = updateFieldsArray[0]._attr;
+ const updateFieldsAttr = updateFields._attr;
expect(updateFieldsAttr["w:val"]).to.be.equal(true);
};
it("should add a UpdateFields with value true", () => {
diff --git a/src/file/settings/update-fields.spec.ts b/src/file/settings/update-fields.spec.ts
index 90d409ac40..2ccc9df8c4 100644
--- a/src/file/settings/update-fields.spec.ts
+++ b/src/file/settings/update-fields.spec.ts
@@ -5,22 +5,18 @@ import { Formatter } from "export/formatter";
import { UpdateFields } from "./update-fields";
const UF_TRUE = {
- "w:updateFields": [
- {
- _attr: {
- "w:val": true,
- },
+ "w:updateFields": {
+ _attr: {
+ "w:val": true,
},
- ],
+ },
};
const UF_FALSE = {
- "w:updateFields": [
- {
- _attr: {
- "w:val": false,
- },
+ "w:updateFields": {
+ _attr: {
+ "w:val": false,
},
- ],
+ },
};
describe("Update Fields", () => {
describe("#constructor", () => {
diff --git a/src/file/styles/external-styles-factory.spec.ts b/src/file/styles/external-styles-factory.spec.ts
index 329366a864..4db0f3199e 100644
--- a/src/file/styles/external-styles-factory.spec.ts
+++ b/src/file/styles/external-styles-factory.spec.ts
@@ -71,24 +71,34 @@ describe("External styles factory", () => {
deleted: false,
root: [
{
- _attr: {
- "w:ascii": "Arial",
- "w:cstheme": "minorHAnsi",
- "w:eastAsiaTheme": "minorHAnsi",
- "w:hAnsi": "Arial",
- },
deleted: false,
- root: [],
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:ascii": "Arial",
+ "w:cstheme": "minorHAnsi",
+ "w:eastAsiaTheme": "minorHAnsi",
+ "w:hAnsi": "Arial",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:rFonts",
},
{
- _attr: {
- "w:bidi": "ar-SA",
- "w:eastAsia": "en-US",
- "w:val": "en-US",
- },
deleted: false,
- root: [],
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:bidi": "ar-SA",
+ "w:eastAsia": "en-US",
+ "w:val": "en-US",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:lang",
},
],
@@ -104,13 +114,18 @@ describe("External styles factory", () => {
deleted: false,
root: [
{
- _attr: {
- "w:after": "160",
- "w:line": "259",
- "w:lineRule": "auto",
- },
deleted: false,
- root: [],
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:after": "160",
+ "w:line": "259",
+ "w:lineRule": "auto",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:spacing",
},
],
@@ -123,12 +138,17 @@ describe("External styles factory", () => {
rootKey: "w:docDefaults",
});
expect(importedStyle.root[2]).to.deep.equal({
- _attr: {
- "w:defLockedState": "1",
- "w:defUIPriority": "99",
- },
deleted: false,
- root: [],
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:defLockedState": "1",
+ "w:defUIPriority": "99",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:latentStyles",
});
});
@@ -139,19 +159,28 @@ describe("External styles factory", () => {
expect(importedStyle.root.length).to.equal(5);
expect(importedStyle.root[3]).to.deep.equal({
- _attr: {
- "w:default": "1",
- "w:styleId": "Normal",
- "w:type": "paragraph",
- },
deleted: false,
root: [
{
- _attr: {
- "w:val": "Normal",
- },
deleted: false,
- root: [],
+ root: {
+ "w:default": "1",
+ "w:styleId": "Normal",
+ "w:type": "paragraph",
+ },
+ rootKey: "_attr",
+ },
+ {
+ deleted: false,
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:val": "Normal",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:name",
},
{
@@ -164,26 +193,40 @@ describe("External styles factory", () => {
});
expect(importedStyle.root[4]).to.deep.equal({
- _attr: {
- "w:styleId": "Heading1",
- "w:type": "paragraph",
- },
deleted: false,
root: [
{
- _attr: {
- "w:val": "heading 1",
- },
deleted: false,
- root: [],
+ root: {
+ "w:styleId": "Heading1",
+ "w:type": "paragraph",
+ },
+ rootKey: "_attr",
+ },
+ {
+ deleted: false,
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:val": "heading 1",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:name",
},
{
- _attr: {
- "w:val": "Normal",
- },
deleted: false,
- root: [],
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:val": "Normal",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:basedOn",
},
{
@@ -203,14 +246,19 @@ describe("External styles factory", () => {
deleted: false,
root: [
{
- _attr: {
- "w:color": "auto",
- "w:space": "1",
- "w:sz": "4",
- "w:val": "single",
- },
deleted: false,
- root: [],
+ root: [
+ {
+ deleted: false,
+ root: {
+ "w:color": "auto",
+ "w:space": "1",
+ "w:sz": "4",
+ "w:val": "single",
+ },
+ rootKey: "_attr",
+ },
+ ],
rootKey: "w:bottom",
},
],
diff --git a/src/file/styles/style/character-style.spec.ts b/src/file/styles/style/character-style.spec.ts
index 727b7f3a3f..362bee3241 100644
--- a/src/file/styles/style/character-style.spec.ts
+++ b/src/file/styles/style/character-style.spec.ts
@@ -12,18 +12,15 @@ describe("CharacterStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
- { "w:rPr": [] },
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -35,19 +32,16 @@ describe("CharacterStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
- { "w:name": [{ _attr: { "w:val": "Style Name" } }] },
- { "w:rPr": [] },
+ { "w:name": { _attr: { "w:val": "Style Name" } } },
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -61,20 +55,17 @@ describe("CharacterStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
- { "w:rPr": [] },
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
- { "w:basedOn": [{ _attr: { "w:val": "otherId" } }] },
+ { "w:basedOn": { _attr: { "w:val": "otherId" } } },
],
});
});
@@ -88,19 +79,17 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [{ "w:sz": [{ _attr: { "w:val": 24 } }] }, { "w:szCs": [{ _attr: { "w:val": 24 } }] }],
+ "w:rPr": [{ "w:sz": { _attr: { "w:val": 24 } } }, { "w:szCs": { _attr: { "w:val": 24 } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -114,19 +103,17 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "single" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "single" } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -139,19 +126,17 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "double" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "double" } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -164,19 +149,17 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "double", "w:color": "005599" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "double", "w:color": "005599" } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -192,27 +175,23 @@ describe("CharacterStyle", () => {
{
"w:rPr": [
{
- "w:vertAlign": [
- {
- _attr: {
- "w:val": "superscript",
- },
+ "w:vertAlign": {
+ _attr: {
+ "w:val": "superscript",
},
- ],
- },
- ],
- },
- {
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
},
},
],
},
{
- "w:unhideWhenUsed": [],
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
+ },
+ },
+ },
+ {
+ "w:unhideWhenUsed": null,
},
],
});
@@ -225,19 +204,17 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [{ "w:color": [{ _attr: { "w:val": "123456" } }] }],
+ "w:rPr": [{ "w:color": { _attr: { "w:val": "123456" } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -250,19 +227,17 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [{ "w:b": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:b": { _attr: { "w:val": true } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -275,19 +250,17 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [{ "w:i": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:i": { _attr: { "w:val": true } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
});
@@ -300,21 +273,16 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [],
- },
- {
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
- { "w:link": [{ _attr: { "w:val": "MyLink" } }] },
+ { "w:link": { _attr: { "w:val": "MyLink" } } },
],
});
});
@@ -326,19 +294,14 @@ describe("CharacterStyle", () => {
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "myStyleId" } },
{
- "w:rPr": [],
- },
- {
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
- { "w:unhideWhenUsed": [] },
- { "w:semiHidden": [] },
+ { "w:unhideWhenUsed": null },
+ { "w:semiHidden": null },
],
});
});
diff --git a/src/file/styles/style/components.spec.ts b/src/file/styles/style/components.spec.ts
index 4ac3ca998f..b12f1e8838 100644
--- a/src/file/styles/style/components.spec.ts
+++ b/src/file/styles/style/components.spec.ts
@@ -6,48 +6,48 @@ describe("Style components", () => {
it("Name#constructor", () => {
const style = new components.Name("Style Name");
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:name": [{ _attr: { "w:val": "Style Name" } }] });
+ expect(tree).to.deep.equal({ "w:name": { _attr: { "w:val": "Style Name" } } });
});
it("BasedOn#constructor", () => {
const style = new components.BasedOn("otherId");
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:basedOn": [{ _attr: { "w:val": "otherId" } }] });
+ expect(tree).to.deep.equal({ "w:basedOn": { _attr: { "w:val": "otherId" } } });
});
it("Next#constructor", () => {
const style = new components.Next("otherId");
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:next": [{ _attr: { "w:val": "otherId" } }] });
+ expect(tree).to.deep.equal({ "w:next": { _attr: { "w:val": "otherId" } } });
});
it("Link#constructor", () => {
const style = new components.Link("otherId");
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:link": [{ _attr: { "w:val": "otherId" } }] });
+ expect(tree).to.deep.equal({ "w:link": { _attr: { "w:val": "otherId" } } });
});
it("UiPriority#constructor", () => {
const style = new components.UiPriority("123");
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:uiPriority": [{ _attr: { "w:val": "123" } }] });
+ expect(tree).to.deep.equal({ "w:uiPriority": { _attr: { "w:val": "123" } } });
});
it("UnhideWhenUsed#constructor", () => {
const style = new components.UnhideWhenUsed();
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:unhideWhenUsed": [] });
+ expect(tree).to.deep.equal({ "w:unhideWhenUsed": null });
});
it("QuickFormat#constructor", () => {
const style = new components.QuickFormat();
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:qFormat": [] });
+ expect(tree).to.deep.equal({ "w:qFormat": null });
});
it("SemiHidden#constructor", () => {
const style = new components.SemiHidden();
const tree = new Formatter().format(style);
- expect(tree).to.deep.equal({ "w:semiHidden": [] });
+ expect(tree).to.deep.equal({ "w:semiHidden": null });
});
});
diff --git a/src/file/styles/style/default-styles.spec.ts b/src/file/styles/style/default-styles.spec.ts
index a3144f186b..3888983c56 100644
--- a/src/file/styles/style/default-styles.spec.ts
+++ b/src/file/styles/style/default-styles.spec.ts
@@ -9,12 +9,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Heading1" } },
- { "w:name": [{ _attr: { "w:val": "Heading 1" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Heading 1" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -25,12 +23,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Title" } },
- { "w:name": [{ _attr: { "w:val": "Title" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Title" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -41,12 +37,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Heading1" } },
- { "w:name": [{ _attr: { "w:val": "Heading 1" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Heading 1" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -57,12 +51,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Heading2" } },
- { "w:name": [{ _attr: { "w:val": "Heading 2" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Heading 2" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -73,12 +65,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Heading3" } },
- { "w:name": [{ _attr: { "w:val": "Heading 3" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Heading 3" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -89,12 +79,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Heading4" } },
- { "w:name": [{ _attr: { "w:val": "Heading 4" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Heading 4" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -105,12 +93,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Heading5" } },
- { "w:name": [{ _attr: { "w:val": "Heading 5" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Heading 5" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -121,12 +107,10 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "Heading6" } },
- { "w:name": [{ _attr: { "w:val": "Heading 6" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:next": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "Heading 6" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:next": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -137,11 +121,9 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "ListParagraph" } },
- { "w:name": [{ _attr: { "w:val": "List Paragraph" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:qFormat": [] },
+ { "w:name": { _attr: { "w:val": "List Paragraph" } } },
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:qFormat": null },
],
});
});
@@ -152,60 +134,52 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "FootnoteText" } },
- { "w:name": [{ _attr: { "w:val": "footnote text" } }] },
+ { "w:name": { _attr: { "w:val": "footnote text" } } },
{
"w:pPr": [
{
- "w:spacing": [
- {
- _attr: {
- "w:after": 0,
- "w:line": 240,
- "w:lineRule": "auto",
- },
+ "w:spacing": {
+ _attr: {
+ "w:after": 0,
+ "w:line": 240,
+ "w:lineRule": "auto",
},
- ],
+ },
},
],
},
{
"w:rPr": [
{
- "w:sz": [
- {
- _attr: {
- "w:val": 20,
- },
+ "w:sz": {
+ _attr: {
+ "w:val": 20,
},
- ],
+ },
},
{
- "w:szCs": [
- {
- _attr: {
- "w:val": 20,
- },
+ "w:szCs": {
+ _attr: {
+ "w:val": 20,
},
- ],
- },
- ],
- },
- { "w:basedOn": [{ _attr: { "w:val": "Normal" } }] },
- { "w:link": [{ _attr: { "w:val": "FootnoteTextChar" } }] },
- {
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
},
},
],
},
+ { "w:basedOn": { _attr: { "w:val": "Normal" } } },
+ { "w:link": { _attr: { "w:val": "FootnoteTextChar" } } },
{
- "w:semiHidden": [],
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
+ },
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:semiHidden": null,
+ },
+ {
+ "w:unhideWhenUsed": null,
},
],
});
@@ -217,36 +191,32 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "FootnoteReference" } },
- { "w:name": [{ _attr: { "w:val": "footnote reference" } }] },
+ { "w:name": { _attr: { "w:val": "footnote reference" } } },
{
"w:rPr": [
{
- "w:vertAlign": [
- {
- _attr: {
- "w:val": "superscript",
- },
+ "w:vertAlign": {
+ _attr: {
+ "w:val": "superscript",
},
- ],
- },
- ],
- },
- {
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
},
},
],
},
{
- "w:unhideWhenUsed": [],
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
+ },
+ },
},
- { "w:basedOn": [{ _attr: { "w:val": "DefaultParagraphFont" } }] },
+ {
+ "w:unhideWhenUsed": null,
+ },
+ { "w:basedOn": { _attr: { "w:val": "DefaultParagraphFont" } } },
{
- "w:semiHidden": [],
+ "w:semiHidden": null,
},
],
});
@@ -258,45 +228,39 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "FootnoteTextChar" } },
- { "w:name": [{ _attr: { "w:val": "Footnote Text Char" } }] },
+ { "w:name": { _attr: { "w:val": "Footnote Text Char" } } },
{
"w:rPr": [
{
- "w:sz": [
- {
- _attr: {
- "w:val": 20,
- },
+ "w:sz": {
+ _attr: {
+ "w:val": 20,
},
- ],
+ },
},
{
- "w:szCs": [
- {
- _attr: {
- "w:val": 20,
- },
+ "w:szCs": {
+ _attr: {
+ "w:val": 20,
},
- ],
- },
- ],
- },
- {
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
},
},
],
},
{
- "w:unhideWhenUsed": [],
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
+ },
+ },
},
- { "w:basedOn": [{ _attr: { "w:val": "DefaultParagraphFont" } }] },
- { "w:link": [{ _attr: { "w:val": "FootnoteText" } }] },
{
- "w:semiHidden": [],
+ "w:unhideWhenUsed": null,
+ },
+ { "w:basedOn": { _attr: { "w:val": "DefaultParagraphFont" } } },
+ { "w:link": { _attr: { "w:val": "FootnoteText" } } },
+ {
+ "w:semiHidden": null,
},
],
});
@@ -308,23 +272,21 @@ describe("Default Styles", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "Hyperlink" } },
- { "w:name": [{ _attr: { "w:val": "Hyperlink" } }] },
+ { "w:name": { _attr: { "w:val": "Hyperlink" } } },
{
- "w:rPr": [{ "w:color": [{ _attr: { "w:val": "0563C1" } }] }, { "w:u": [{ _attr: { "w:val": "single" } }] }],
+ "w:rPr": [{ "w:color": { _attr: { "w:val": "0563C1" } } }, { "w:u": { _attr: { "w:val": "single" } } }],
},
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
- { "w:basedOn": [{ _attr: { "w:val": "DefaultParagraphFont" } }] },
+ { "w:basedOn": { _attr: { "w:val": "DefaultParagraphFont" } } },
],
});
});
diff --git a/src/file/styles/style/paragraph-style.spec.ts b/src/file/styles/style/paragraph-style.spec.ts
index 96ba8921bf..cf529c8773 100644
--- a/src/file/styles/style/paragraph-style.spec.ts
+++ b/src/file/styles/style/paragraph-style.spec.ts
@@ -10,7 +10,7 @@ describe("ParagraphStyle", () => {
const style = new ParagraphStyle("myStyleId");
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } }, { "w:pPr": [] }, { "w:rPr": [] }],
+ "w:style": { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
});
});
@@ -20,9 +20,7 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:name": [{ _attr: { "w:val": "Style Name" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
+ { "w:name": { _attr: { "w:val": "Style Name" } } },
],
});
});
@@ -35,9 +33,7 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:basedOn": [{ _attr: { "w:val": "otherId" } }] },
+ { "w:basedOn": { _attr: { "w:val": "otherId" } } },
],
});
});
@@ -46,12 +42,7 @@ describe("ParagraphStyle", () => {
const style = new ParagraphStyle("myStyleId").quickFormat();
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [
- { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:qFormat": [] },
- ],
+ "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } }, { "w:qFormat": null }],
});
});
@@ -61,9 +52,7 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:next": [{ _attr: { "w:val": "otherId" } }] },
+ { "w:next": { _attr: { "w:val": "otherId" } } },
],
});
});
@@ -77,9 +66,8 @@ describe("ParagraphStyle", () => {
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
{
- "w:pPr": [{ "w:ind": [{ _attr: { "w:left": 720 } }] }],
+ "w:pPr": [{ "w:ind": { _attr: { "w:left": 720 } } }],
},
- { "w:rPr": [] },
],
});
});
@@ -91,9 +79,8 @@ describe("ParagraphStyle", () => {
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
{
- "w:pPr": [{ "w:spacing": [{ _attr: { "w:before": 50, "w:after": 150 } }] }],
+ "w:pPr": [{ "w:spacing": { _attr: { "w:before": 50, "w:after": 150 } } }],
},
- { "w:rPr": [] },
],
});
});
@@ -105,9 +92,8 @@ describe("ParagraphStyle", () => {
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "center" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "center" } } }],
},
- { "w:rPr": [] },
],
});
});
@@ -118,9 +104,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:spacing": [{ _attr: { "w:val": 24 } }] }],
+ "w:rPr": [{ "w:spacing": { _attr: { "w:val": 24 } } }],
},
],
});
@@ -133,9 +118,8 @@ describe("ParagraphStyle", () => {
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "left" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "left" } } }],
},
- { "w:rPr": [] },
],
});
});
@@ -147,9 +131,8 @@ describe("ParagraphStyle", () => {
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "right" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "right" } } }],
},
- { "w:rPr": [] },
],
});
});
@@ -161,9 +144,8 @@ describe("ParagraphStyle", () => {
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
{
- "w:pPr": [{ "w:jc": [{ _attr: { "w:val": "both" } }] }],
+ "w:pPr": [{ "w:jc": { _attr: { "w:val": "both" } } }],
},
- { "w:rPr": [] },
],
});
});
@@ -179,22 +161,19 @@ describe("ParagraphStyle", () => {
{
"w:pBdr": [
{
- "w:bottom": [
- {
- _attr: {
- "w:color": "auto",
- "w:space": "1",
- "w:val": "single",
- "w:sz": "6",
- },
+ "w:bottom": {
+ _attr: {
+ "w:color": "auto",
+ "w:space": "1",
+ "w:val": "single",
+ "w:sz": "6",
},
- ],
+ },
},
],
},
],
},
- { "w:rPr": [] },
],
});
});
@@ -208,11 +187,10 @@ describe("ParagraphStyle", () => {
{
"w:pPr": [
{
- "w:tabs": [{ "w:tab": [{ _attr: { "w:val": "left", "w:pos": 1200 } }] }],
+ "w:tabs": [{ "w:tab": { _attr: { "w:val": "left", "w:pos": 1200 } } }],
},
],
},
- { "w:rPr": [] },
],
});
});
@@ -226,11 +204,10 @@ describe("ParagraphStyle", () => {
{
"w:pPr": [
{
- "w:tabs": [{ "w:tab": [{ _attr: { "w:val": "right", "w:pos": 9026 } }] }],
+ "w:tabs": [{ "w:tab": { _attr: { "w:val": "right", "w:pos": 9026 } } }],
},
],
},
- { "w:rPr": [] },
],
});
});
@@ -239,11 +216,7 @@ describe("ParagraphStyle", () => {
const style = new ParagraphStyle("myStyleId").keepLines();
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [
- { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [{ "w:keepLines": [] }] },
- { "w:rPr": [] },
- ],
+ "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } }, { "w:pPr": [{ "w:keepLines": null }] }],
});
});
@@ -251,11 +224,7 @@ describe("ParagraphStyle", () => {
const style = new ParagraphStyle("myStyleId").keepNext();
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [
- { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [{ "w:keepNext": [] }] },
- { "w:rPr": [] },
- ],
+ "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } }, { "w:pPr": [{ "w:keepNext": null }] }],
});
});
@@ -265,8 +234,7 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [{ "w:outlineLvl": [{ _attr: { "w:val": "1" } }] }] },
- { "w:rPr": [] },
+ { "w:pPr": [{ "w:outlineLvl": { _attr: { "w:val": "1" } } }] },
],
});
});
@@ -279,9 +247,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:sz": [{ _attr: { "w:val": 24 } }] }, { "w:szCs": [{ _attr: { "w:val": 24 } }] }],
+ "w:rPr": [{ "w:sz": { _attr: { "w:val": 24 } } }, { "w:szCs": { _attr: { "w:val": 24 } } }],
},
],
});
@@ -293,9 +260,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:smallCaps": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:smallCaps": { _attr: { "w:val": true } } }],
},
],
});
@@ -307,9 +273,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:caps": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:caps": { _attr: { "w:val": true } } }],
},
],
});
@@ -321,9 +286,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:strike": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:strike": { _attr: { "w:val": true } } }],
},
],
});
@@ -335,9 +299,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:dstrike": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:dstrike": { _attr: { "w:val": true } } }],
},
],
});
@@ -349,9 +312,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:vertAlign": [{ _attr: { "w:val": "subscript" } }] }],
+ "w:rPr": [{ "w:vertAlign": { _attr: { "w:val": "subscript" } } }],
},
],
});
@@ -363,9 +325,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:vertAlign": [{ _attr: { "w:val": "superscript" } }] }],
+ "w:rPr": [{ "w:vertAlign": { _attr: { "w:val": "superscript" } } }],
},
],
});
@@ -377,10 +338,9 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
"w:rPr": [
- { "w:rFonts": [{ _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } }] },
+ { "w:rFonts": { _attr: { "w:ascii": "Times", "w:cs": "Times", "w:eastAsia": "Times", "w:hAnsi": "Times" } } },
],
},
],
@@ -393,9 +353,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:b": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:b": { _attr: { "w:val": true } } }],
},
],
});
@@ -407,9 +366,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:i": [{ _attr: { "w:val": true } }] }],
+ "w:rPr": [{ "w:i": { _attr: { "w:val": true } } }],
},
],
});
@@ -422,9 +380,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "single" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "single" } } }],
},
],
});
@@ -436,9 +393,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "double" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "double" } } }],
},
],
});
@@ -450,9 +406,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:u": [{ _attr: { "w:val": "double", "w:color": "005599" } }] }],
+ "w:rPr": [{ "w:u": { _attr: { "w:val": "double", "w:color": "005599" } } }],
},
],
});
@@ -465,9 +420,8 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
{
- "w:rPr": [{ "w:color": [{ _attr: { "w:val": "123456" } }] }],
+ "w:rPr": [{ "w:color": { _attr: { "w:val": "123456" } } }],
},
],
});
@@ -477,12 +431,7 @@ describe("ParagraphStyle", () => {
const style = new ParagraphStyle("myStyleId").link("MyLink");
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [
- { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:link": [{ _attr: { "w:val": "MyLink" } }] },
- ],
+ "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } }, { "w:link": { _attr: { "w:val": "MyLink" } } }],
});
});
@@ -490,12 +439,7 @@ describe("ParagraphStyle", () => {
const style = new ParagraphStyle("myStyleId").semiHidden();
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [
- { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:semiHidden": [] },
- ],
+ "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } }, { "w:semiHidden": null }],
});
});
@@ -505,16 +449,12 @@ describe("ParagraphStyle", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
- { "w:rPr": [] },
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
],
});
@@ -524,12 +464,7 @@ describe("ParagraphStyle", () => {
const style = new ParagraphStyle("myStyleId").unhideWhenUsed();
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [
- { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:pPr": [] },
- { "w:rPr": [] },
- { "w:unhideWhenUsed": [] },
- ],
+ "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } }, { "w:unhideWhenUsed": null }],
});
});
});
diff --git a/src/file/styles/style/style.spec.ts b/src/file/styles/style/style.spec.ts
index 13b12ca021..55f55bd398 100644
--- a/src/file/styles/style/style.spec.ts
+++ b/src/file/styles/style/style.spec.ts
@@ -12,7 +12,7 @@ describe("Style", () => {
});
const tree = new Formatter().format(style);
expect(tree).to.deep.equal({
- "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId", "w:default": true } }],
+ "w:style": { _attr: { "w:type": "paragraph", "w:styleId": "myStyleId", "w:default": true } },
});
});
@@ -28,7 +28,7 @@ describe("Style", () => {
expect(tree).to.deep.equal({
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "myStyleId" } },
- { "w:name": [{ _attr: { "w:val": "Style Name" } }] },
+ { "w:name": { _attr: { "w:val": "Style Name" } } },
],
});
});
diff --git a/src/file/styles/styles.spec.ts b/src/file/styles/styles.spec.ts
index 5476c0742d..09e986d5cb 100644
--- a/src/file/styles/styles.spec.ts
+++ b/src/file/styles/styles.spec.ts
@@ -27,7 +27,7 @@ describe("Styles", () => {
const tree = new Formatter().format(styles)["w:styles"].filter((x) => !x._attr);
expect(tree).to.deep.equal([
{
- "w:style": [{ _attr: { "w:type": "paragraph", "w:styleId": "pStyleId" } }, { "w:pPr": [] }, { "w:rPr": [] }],
+ "w:style": { _attr: { "w:type": "paragraph", "w:styleId": "pStyleId" } },
},
]);
});
@@ -40,9 +40,7 @@ describe("Styles", () => {
{
"w:style": [
{ _attr: { "w:type": "paragraph", "w:styleId": "pStyleId" } },
- { "w:name": [{ _attr: { "w:val": "Paragraph Style" } }] },
- { "w:pPr": [] },
- { "w:rPr": [] },
+ { "w:name": { _attr: { "w:val": "Paragraph Style" } } },
],
},
]);
@@ -58,18 +56,15 @@ describe("Styles", () => {
{
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "pStyleId" } },
- { "w:rPr": [] },
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
},
@@ -84,19 +79,16 @@ describe("Styles", () => {
{
"w:style": [
{ _attr: { "w:type": "character", "w:styleId": "pStyleId" } },
- { "w:name": [{ _attr: { "w:val": "Character Style" } }] },
- { "w:rPr": [] },
+ { "w:name": { _attr: { "w:val": "Character Style" } } },
{
- "w:uiPriority": [
- {
- _attr: {
- "w:val": "99",
- },
+ "w:uiPriority": {
+ _attr: {
+ "w:val": "99",
},
- ],
+ },
},
{
- "w:unhideWhenUsed": [],
+ "w:unhideWhenUsed": null,
},
],
},
diff --git a/src/file/table-of-contents/table-of-contents.spec.ts b/src/file/table-of-contents/table-of-contents.spec.ts
index ce5312ac63..223a5a2679 100644
--- a/src/file/table-of-contents/table-of-contents.spec.ts
+++ b/src/file/table-of-contents/table-of-contents.spec.ts
@@ -49,13 +49,11 @@ const DEFAULT_TOC = {
{
"w:sdtPr": [
{
- "w:alias": [
- {
- _attr: {
- "w:val": "Table of Contents",
- },
+ "w:alias": {
+ _attr: {
+ "w:val": "Table of Contents",
},
- ],
+ },
},
],
},
@@ -63,23 +61,15 @@ const DEFAULT_TOC = {
"w:sdtContent": [
{
"w:p": [
- {
- "w:pPr": [],
- },
{
"w:r": [
{
- "w:rPr": [],
- },
- {
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "begin",
- "w:dirty": true,
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "begin",
+ "w:dirty": true,
},
- ],
+ },
},
{
"w:instrText": [
@@ -92,13 +82,11 @@ const DEFAULT_TOC = {
],
},
{
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "separate",
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "separate",
},
- ],
+ },
},
],
},
@@ -106,22 +94,14 @@ const DEFAULT_TOC = {
},
{
"w:p": [
- {
- "w:pPr": [],
- },
{
"w:r": [
{
- "w:rPr": [],
- },
- {
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "end",
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "end",
},
- ],
+ },
},
],
},
@@ -137,13 +117,11 @@ const COMPLETE_TOC = {
{
"w:sdtPr": [
{
- "w:alias": [
- {
- _attr: {
- "w:val": "Summary",
- },
+ "w:alias": {
+ _attr: {
+ "w:val": "Summary",
},
- ],
+ },
},
],
},
@@ -151,23 +129,15 @@ const COMPLETE_TOC = {
"w:sdtContent": [
{
"w:p": [
- {
- "w:pPr": [],
- },
{
"w:r": [
{
- "w:rPr": [],
- },
- {
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "begin",
- "w:dirty": true,
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "begin",
+ "w:dirty": true,
},
- ],
+ },
},
{
"w:instrText": [
@@ -180,13 +150,11 @@ const COMPLETE_TOC = {
],
},
{
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "separate",
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "separate",
},
- ],
+ },
},
],
},
@@ -194,22 +162,14 @@ const COMPLETE_TOC = {
},
{
"w:p": [
- {
- "w:pPr": [],
- },
{
"w:r": [
{
- "w:rPr": [],
- },
- {
- "w:fldChar": [
- {
- _attr: {
- "w:fldCharType": "end",
- },
+ "w:fldChar": {
+ _attr: {
+ "w:fldCharType": "end",
},
- ],
+ },
},
],
},
diff --git a/src/file/table/grid.spec.ts b/src/file/table/grid.spec.ts
index 75489f9bd9..cbef732f95 100644
--- a/src/file/table/grid.spec.ts
+++ b/src/file/table/grid.spec.ts
@@ -10,14 +10,14 @@ describe("GridCol", () => {
const grid = new GridCol(1234);
const tree = new Formatter().format(grid);
expect(tree).to.deep.equal({
- "w:gridCol": [{ _attr: { "w:w": 1234 } }],
+ "w:gridCol": { _attr: { "w:w": 1234 } },
});
});
it("does not set a width attribute if not given", () => {
const grid = new GridCol();
const tree = new Formatter().format(grid);
- expect(tree).to.deep.equal({ "w:gridCol": [] });
+ expect(tree).to.deep.equal({ "w:gridCol": null });
});
});
});
@@ -29,9 +29,9 @@ describe("TableGrid", () => {
const tree = new Formatter().format(grid);
expect(tree).to.deep.equal({
"w:tblGrid": [
- { "w:gridCol": [{ _attr: { "w:w": 1234 } }] },
- { "w:gridCol": [{ _attr: { "w:w": 321 } }] },
- { "w:gridCol": [{ _attr: { "w:w": 123 } }] },
+ { "w:gridCol": { _attr: { "w:w": 1234 } } },
+ { "w:gridCol": { _attr: { "w:w": 321 } } },
+ { "w:gridCol": { _attr: { "w:w": 123 } } },
],
});
});
diff --git a/src/file/table/shading/shading.spec.ts b/src/file/table/shading/shading.spec.ts
index d200aacd41..ce28fcca92 100644
--- a/src/file/table/shading/shading.spec.ts
+++ b/src/file/table/shading/shading.spec.ts
@@ -7,30 +7,26 @@ import { ShadingType, TableShading } from "./shading";
describe("TableShading", () => {
describe("#constructor", () => {
it("should create", () => {
- const cellMargain = new TableShading({});
- const tree = new Formatter().format(cellMargain);
+ const shading = new TableShading({});
+ const tree = new Formatter().format(shading);
expect(tree).to.deep.equal({
- "w:shd": [
- {
- _attr: {},
- },
- ],
+ "w:shd": {
+ _attr: {},
+ },
});
});
it("should create with params", () => {
- const cellMargain = new TableShading({ val: ShadingType.PERCENT_40, color: "FF0000", fill: "555555" });
- const tree = new Formatter().format(cellMargain);
+ const shading = new TableShading({ val: ShadingType.PERCENT_40, color: "FF0000", fill: "555555" });
+ const tree = new Formatter().format(shading);
expect(tree).to.deep.equal({
- "w:shd": [
- {
- _attr: {
- "w:color": "FF0000",
- "w:fill": "555555",
- "w:val": "pct40",
- },
+ "w:shd": {
+ _attr: {
+ "w:color": "FF0000",
+ "w:fill": "555555",
+ "w:val": "pct40",
},
- ],
+ },
});
});
});
diff --git a/src/file/table/table-cell/cell-margain/cell-margain.spec.ts b/src/file/table/table-cell/cell-margain/cell-margain.spec.ts
index 1d60cedabd..393a8d0087 100644
--- a/src/file/table/table-cell/cell-margain/cell-margain.spec.ts
+++ b/src/file/table/table-cell/cell-margain/cell-margain.spec.ts
@@ -10,14 +10,12 @@ describe("TopCellMargain", () => {
const cellMargain = new TopCellMargain(1);
const tree = new Formatter().format(cellMargain);
expect(tree).to.deep.equal({
- "w:top": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 1,
- },
+ "w:top": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 1,
},
- ],
+ },
});
});
});
@@ -29,14 +27,12 @@ describe("BottomCellMargain", () => {
const cellMargain = new BottomCellMargain(1);
const tree = new Formatter().format(cellMargain);
expect(tree).to.deep.equal({
- "w:bottom": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 1,
- },
+ "w:bottom": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 1,
},
- ],
+ },
});
});
});
@@ -48,14 +44,12 @@ describe("LeftCellMargain", () => {
const cellMargain = new LeftCellMargain(1);
const tree = new Formatter().format(cellMargain);
expect(tree).to.deep.equal({
- "w:start": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 1,
- },
+ "w:start": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 1,
},
- ],
+ },
});
});
});
@@ -67,14 +61,12 @@ describe("RightCellMargain", () => {
const cellMargain = new RightCellMargain(1);
const tree = new Formatter().format(cellMargain);
expect(tree).to.deep.equal({
- "w:end": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 1,
- },
+ "w:end": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 1,
},
- ],
+ },
});
});
});
diff --git a/src/file/table/table-cell/cell-margain/table-cell-margains.spec.ts b/src/file/table/table-cell/cell-margain/table-cell-margains.spec.ts
index f90f837f30..9cdd752fad 100644
--- a/src/file/table/table-cell/cell-margain/table-cell-margains.spec.ts
+++ b/src/file/table/table-cell/cell-margain/table-cell-margains.spec.ts
@@ -12,44 +12,36 @@ describe("TableCellMargain", () => {
expect(tree).to.deep.equal({
"w:tcMar": [
{
- "w:top": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 0,
- },
+ "w:top": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 0,
},
- ],
+ },
},
{
- "w:bottom": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 0,
- },
+ "w:bottom": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 0,
},
- ],
+ },
},
{
- "w:end": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 0,
- },
+ "w:end": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 0,
},
- ],
+ },
},
{
- "w:start": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 0,
- },
+ "w:start": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 0,
},
- ],
+ },
},
],
});
@@ -66,44 +58,36 @@ describe("TableCellMargain", () => {
expect(tree).to.deep.equal({
"w:tcMar": [
{
- "w:top": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 5,
- },
+ "w:top": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 5,
},
- ],
+ },
},
{
- "w:bottom": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 5,
- },
+ "w:bottom": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 5,
},
- ],
+ },
},
{
- "w:end": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 5,
- },
+ "w:end": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 5,
},
- ],
+ },
},
{
- "w:start": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 5,
- },
+ "w:start": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 5,
},
- ],
+ },
},
],
});
diff --git a/src/file/table/table-cell/table-cell-components.ts b/src/file/table/table-cell/table-cell-components.ts
index cb80b590e1..518b8a67b2 100644
--- a/src/file/table/table-cell/table-cell-components.ts
+++ b/src/file/table/table-cell/table-cell-components.ts
@@ -1,5 +1,5 @@
import { BorderStyle } from "file/styles";
-import { IXmlableObject, XmlAttributeComponent, XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent, XmlAttributeComponent, XmlComponent } from "file/xml-components";
interface ICellBorder {
readonly style: BorderStyle;
@@ -24,17 +24,11 @@ class BaseTableCellBorder extends XmlComponent {
}
}
-export class TableCellBorders extends XmlComponent {
+export class TableCellBorders extends IgnoreIfEmptyXmlComponent {
constructor() {
super("w:tcBorders");
}
- public prepForXml(): IXmlableObject | undefined {
- if (this.root.length > 0) {
- return super.prepForXml();
- }
- }
-
public addTopBorder(style: BorderStyle, size: number, color: string): TableCellBorders {
const top = new BaseTableCellBorder("w:top");
top.setProperties(style, size, color);
diff --git a/src/file/table/table-cell/table-cell-properties.spec.ts b/src/file/table/table-cell/table-cell-properties.spec.ts
index 504a0549d0..65bfd92fe6 100644
--- a/src/file/table/table-cell/table-cell-properties.spec.ts
+++ b/src/file/table/table-cell/table-cell-properties.spec.ts
@@ -9,77 +9,80 @@ import { TableCellProperties } from "./table-cell-properties";
describe("TableCellProperties", () => {
describe("#constructor", () => {
it("creates an initially empty property object", () => {
- const cellMargain = new TableCellProperties();
- const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tcPr": [] });
+ const properties = new TableCellProperties();
+ // The TableCellProperties is ignorable if there are no attributes,
+ // which results in prepForXml returning undefined, which causes
+ // the formatter to throw an error if that is the only object it
+ // has been asked to format.
+ expect(() => new Formatter().format(properties)).to.throw("XMLComponent did not format correctly");
});
});
describe("#addGridSpan", () => {
it("adds grid span", () => {
- const cellMargain = new TableCellProperties();
- cellMargain.addGridSpan(1);
- const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tcPr": [{ "w:gridSpan": [{ _attr: { "w:val": 1 } }] }] });
+ const properties = new TableCellProperties();
+ properties.addGridSpan(1);
+ const tree = new Formatter().format(properties);
+ expect(tree).to.deep.equal({ "w:tcPr": [{ "w:gridSpan": { _attr: { "w:val": 1 } } }] });
});
});
describe("#addVerticalMerge", () => {
it("adds vertical merge", () => {
- const cellMargain = new TableCellProperties();
- cellMargain.addVerticalMerge(VMergeType.CONTINUE);
- const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tcPr": [{ "w:vMerge": [{ _attr: { "w:val": "continue" } }] }] });
+ const properties = new TableCellProperties();
+ properties.addVerticalMerge(VMergeType.CONTINUE);
+ const tree = new Formatter().format(properties);
+ expect(tree).to.deep.equal({ "w:tcPr": [{ "w:vMerge": { _attr: { "w:val": "continue" } } }] });
});
});
describe("#setVerticalAlign", () => {
it("sets vertical align", () => {
- const cellMargain = new TableCellProperties();
- cellMargain.setVerticalAlign(VerticalAlign.BOTTOM);
- const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tcPr": [{ "w:vAlign": [{ _attr: { "w:val": "bottom" } }] }] });
+ const properties = new TableCellProperties();
+ properties.setVerticalAlign(VerticalAlign.BOTTOM);
+ const tree = new Formatter().format(properties);
+ expect(tree).to.deep.equal({ "w:tcPr": [{ "w:vAlign": { _attr: { "w:val": "bottom" } } }] });
});
});
describe("#setWidth", () => {
it("should set width", () => {
- const cellMargain = new TableCellProperties();
- cellMargain.setWidth(1, WidthType.DXA);
- const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tcPr": [{ "w:tcW": [{ _attr: { "w:type": "dxa", "w:w": 1 } }] }] });
+ const properties = new TableCellProperties();
+ properties.setWidth(1, WidthType.DXA);
+ const tree = new Formatter().format(properties);
+ expect(tree).to.deep.equal({ "w:tcPr": [{ "w:tcW": { _attr: { "w:type": "dxa", "w:w": 1 } } }] });
});
it("should set width using default of AUTO", () => {
- const cellMargain = new TableCellProperties();
- cellMargain.setWidth(1);
- const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tcPr": [{ "w:tcW": [{ _attr: { "w:type": "auto", "w:w": 1 } }] }] });
+ const properties = new TableCellProperties();
+ properties.setWidth(1);
+ const tree = new Formatter().format(properties);
+ expect(tree).to.deep.equal({ "w:tcPr": [{ "w:tcW": { _attr: { "w:type": "auto", "w:w": 1 } } }] });
});
});
describe("#setShading", () => {
it("sets shading", () => {
- const cellMargain = new TableCellProperties();
- cellMargain.setShading({
+ const properties = new TableCellProperties();
+ properties.setShading({
fill: "test",
color: "000",
});
- const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tcPr": [{ "w:shd": [{ _attr: { "w:fill": "test", "w:color": "000" } }] }] });
+ const tree = new Formatter().format(properties);
+ expect(tree).to.deep.equal({ "w:tcPr": [{ "w:shd": { _attr: { "w:fill": "test", "w:color": "000" } } }] });
});
});
describe("#Borders", () => {
it("should return the TableCellBorders if Border has borders", () => {
- const cellMargain = new TableCellProperties();
- cellMargain.Borders.addTopBorder(BorderStyle.DASH_DOT_STROKED, 3, "red");
- const borders = cellMargain.Borders;
+ const properties = new TableCellProperties();
+ properties.Borders.addTopBorder(BorderStyle.DASH_DOT_STROKED, 3, "red");
+ const borders = properties.Borders;
const tree = new Formatter().format(borders);
expect(tree).to.deep.equal({
- "w:tcBorders": [{ "w:top": [{ _attr: { "w:val": "dashDotStroked", "w:sz": 3, "w:color": "red" } }] }],
+ "w:tcBorders": [{ "w:top": { _attr: { "w:val": "dashDotStroked", "w:sz": 3, "w:color": "red" } } }],
});
});
});
diff --git a/src/file/table/table-cell/table-cell-properties.ts b/src/file/table/table-cell/table-cell-properties.ts
index dabfc173fb..1d9ecb41c2 100644
--- a/src/file/table/table-cell/table-cell-properties.ts
+++ b/src/file/table/table-cell/table-cell-properties.ts
@@ -1,10 +1,10 @@
-import { XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent } from "file/xml-components";
import { ITableShadingAttributesProperties, TableShading } from "../shading";
import { ITableCellMargainOptions, TableCellMargain } from "./cell-margain/table-cell-margains";
import { GridSpan, TableCellBorders, TableCellWidth, VAlign, VerticalAlign, VMerge, VMergeType, WidthType } from "./table-cell-components";
-export class TableCellProperties extends XmlComponent {
+export class TableCellProperties extends IgnoreIfEmptyXmlComponent {
private readonly cellBorder: TableCellBorders;
constructor() {
diff --git a/src/file/table/table-cell/table-cell.spec.ts b/src/file/table/table-cell/table-cell.spec.ts
index 5ec3344c30..8ac54ed85a 100644
--- a/src/file/table/table-cell/table-cell.spec.ts
+++ b/src/file/table/table-cell/table-cell.spec.ts
@@ -22,15 +22,13 @@ describe("TableCellBorders", () => {
expect(tree).to.deep.equal({
"w:tcBorders": [
{
- "w:top": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 1,
- "w:val": "dotted",
- },
+ "w:top": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 1,
+ "w:val": "dotted",
},
- ],
+ },
},
],
});
@@ -44,15 +42,13 @@ describe("TableCellBorders", () => {
expect(tree).to.deep.equal({
"w:tcBorders": [
{
- "w:start": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 2,
- "w:val": "single",
- },
+ "w:start": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 2,
+ "w:val": "single",
},
- ],
+ },
},
],
});
@@ -66,15 +62,13 @@ describe("TableCellBorders", () => {
expect(tree).to.deep.equal({
"w:tcBorders": [
{
- "w:bottom": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 1,
- "w:val": "double",
- },
+ "w:bottom": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 1,
+ "w:val": "double",
},
- ],
+ },
},
],
});
@@ -88,15 +82,13 @@ describe("TableCellBorders", () => {
expect(tree).to.deep.equal({
"w:tcBorders": [
{
- "w:end": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 3,
- "w:val": "thick",
- },
+ "w:end": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 3,
+ "w:val": "thick",
},
- ],
+ },
},
],
});
@@ -110,15 +102,13 @@ describe("TableCellBorders", () => {
expect(tree).to.deep.equal({
"w:tcBorders": [
{
- "w:left": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 3,
- "w:val": "thick",
- },
+ "w:left": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 3,
+ "w:val": "thick",
},
- ],
+ },
},
],
});
@@ -132,15 +122,13 @@ describe("TableCellBorders", () => {
expect(tree).to.deep.equal({
"w:tcBorders": [
{
- "w:right": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 3,
- "w:val": "thick",
- },
+ "w:right": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 3,
+ "w:val": "thick",
},
- ],
+ },
},
],
});
@@ -159,70 +147,58 @@ describe("TableCellBorders", () => {
expect(tree).to.deep.equal({
"w:tcBorders": [
{
- "w:top": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 1,
- "w:val": "dotted",
- },
+ "w:top": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 1,
+ "w:val": "dotted",
},
- ],
+ },
},
{
- "w:end": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 3,
- "w:val": "thick",
- },
+ "w:end": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 3,
+ "w:val": "thick",
},
- ],
+ },
},
{
- "w:bottom": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 1,
- "w:val": "double",
- },
+ "w:bottom": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 1,
+ "w:val": "double",
},
- ],
+ },
},
{
- "w:start": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 2,
- "w:val": "single",
- },
+ "w:start": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 2,
+ "w:val": "single",
},
- ],
+ },
},
{
- "w:left": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 2,
- "w:val": "single",
- },
+ "w:left": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 2,
+ "w:val": "single",
},
- ],
+ },
},
{
- "w:right": [
- {
- _attr: {
- "w:color": "FF00FF",
- "w:sz": 2,
- "w:val": "single",
- },
+ "w:right": {
+ _attr: {
+ "w:color": "FF00FF",
+ "w:sz": 2,
+ "w:val": "single",
},
- ],
+ },
},
],
});
@@ -236,14 +212,12 @@ describe("TableCellWidth", () => {
const tcWidth = new TableCellWidth(100, WidthType.DXA);
const tree = new Formatter().format(tcWidth);
expect(tree).to.deep.equal({
- "w:tcW": [
- {
- _attr: {
- "w:type": "dxa",
- "w:w": 100,
- },
+ "w:tcW": {
+ _attr: {
+ "w:type": "dxa",
+ "w:w": 100,
},
- ],
+ },
});
});
});
diff --git a/src/file/table/table-cell/table-cell.ts b/src/file/table/table-cell/table-cell.ts
index c5566cb318..2f4d996e8d 100644
--- a/src/file/table/table-cell/table-cell.ts
+++ b/src/file/table/table-cell/table-cell.ts
@@ -30,16 +30,10 @@ export class TableCell extends XmlComponent {
public prepForXml(): IXmlableObject | undefined {
// Cells must end with a paragraph
- const retval = super.prepForXml();
- if (!retval) {
- return undefined;
+ if (!(this.root[this.root.length - 1] instanceof Paragraph)) {
+ this.createParagraph();
}
-
- const content = retval["w:tc"];
- if (!content[content.length - 1]["w:p"]) {
- content.push(new Paragraph().prepForXml());
- }
- return retval;
+ return super.prepForXml();
}
public createParagraph(text?: string): Paragraph {
diff --git a/src/file/table/table-column.spec.ts b/src/file/table/table-column.spec.ts
index a536bcd01b..bff98500f1 100644
--- a/src/file/table/table-column.spec.ts
+++ b/src/file/table/table-column.spec.ts
@@ -37,15 +37,15 @@ describe("TableColumn", () => {
const tree = new Formatter().format(cells[0]);
expect(tree).to.deep.equal({
- "w:tc": [{ "w:tcPr": [{ "w:vMerge": [{ _attr: { "w:val": "restart" } }] }] }, { "w:p": [{ "w:pPr": [] }] }],
+ "w:tc": [{ "w:tcPr": [{ "w:vMerge": { _attr: { "w:val": "restart" } } }] }, { "w:p": null }],
});
const tree2 = new Formatter().format(cells[1]);
- expect(tree2).to.deep.equal({ "w:tc": [{ "w:tcPr": [] }, { "w:p": [{ "w:pPr": [] }] }] });
+ expect(tree2).to.deep.equal({ "w:tc": [{ "w:p": null }] });
const tree3 = new Formatter().format(cells[2]);
expect(tree3).to.deep.equal({
- "w:tc": [{ "w:tcPr": [{ "w:vMerge": [{ _attr: { "w:val": "continue" } }] }] }, { "w:p": [{ "w:pPr": [] }] }],
+ "w:tc": [{ "w:tcPr": [{ "w:vMerge": { _attr: { "w:val": "continue" } } }] }, { "w:p": null }],
});
});
});
diff --git a/src/file/table/table-properties/table-cell-margin.spec.ts b/src/file/table/table-properties/table-cell-margin.spec.ts
index 044b535232..c0935281b5 100644
--- a/src/file/table/table-properties/table-cell-margin.spec.ts
+++ b/src/file/table/table-properties/table-cell-margin.spec.ts
@@ -18,7 +18,7 @@ describe("TableCellMargin", () => {
const cellMargain = new TableCellMargin();
cellMargain.addTopMargin(1234, WidthType.DXA);
const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:top": [{ _attr: { "w:type": "dxa", "w:w": 1234 } }] }] });
+ expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:top": { _attr: { "w:type": "dxa", "w:w": 1234 } } }] });
});
});
@@ -27,7 +27,7 @@ describe("TableCellMargin", () => {
const cellMargain = new TableCellMargin();
cellMargain.addLeftMargin(1234, WidthType.DXA);
const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:left": [{ _attr: { "w:type": "dxa", "w:w": 1234 } }] }] });
+ expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:left": { _attr: { "w:type": "dxa", "w:w": 1234 } } }] });
});
});
@@ -36,7 +36,7 @@ describe("TableCellMargin", () => {
const cellMargain = new TableCellMargin();
cellMargain.addBottomMargin(1234, WidthType.DXA);
const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:bottom": [{ _attr: { "w:type": "dxa", "w:w": 1234 } }] }] });
+ expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:bottom": { _attr: { "w:type": "dxa", "w:w": 1234 } } }] });
});
});
@@ -45,7 +45,7 @@ describe("TableCellMargin", () => {
const cellMargain = new TableCellMargin();
cellMargain.addRightMargin(1234, WidthType.DXA);
const tree = new Formatter().format(cellMargain);
- expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:right": [{ _attr: { "w:type": "dxa", "w:w": 1234 } }] }] });
+ expect(tree).to.deep.equal({ "w:tblCellMar": [{ "w:right": { _attr: { "w:type": "dxa", "w:w": 1234 } } }] });
});
});
});
diff --git a/src/file/table/table-properties/table-cell-margin.ts b/src/file/table/table-properties/table-cell-margin.ts
index 73f967752b..ebebb87bc3 100644
--- a/src/file/table/table-properties/table-cell-margin.ts
+++ b/src/file/table/table-properties/table-cell-margin.ts
@@ -1,4 +1,4 @@
-import { IXmlableObject, XmlAttributeComponent, XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent, XmlAttributeComponent, XmlComponent } from "file/xml-components";
import { WidthType } from "../table-cell";
@@ -17,17 +17,11 @@ class BaseTableCellMargin extends XmlComponent {
}
}
-export class TableCellMargin extends XmlComponent {
+export class TableCellMargin extends IgnoreIfEmptyXmlComponent {
constructor() {
super("w:tblCellMar");
}
- public prepForXml(): IXmlableObject | undefined {
- if (this.root.length > 0) {
- return super.prepForXml();
- }
- }
-
public addTopMargin(value: number, type: WidthType = WidthType.DXA): void {
const top = new BaseTableCellMargin("w:top");
diff --git a/src/file/table/table-properties/table-float-properties.spec.ts b/src/file/table/table-properties/table-float-properties.spec.ts
index e527f5504a..a1422d871b 100644
--- a/src/file/table/table-properties/table-float-properties.spec.ts
+++ b/src/file/table/table-properties/table-float-properties.spec.ts
@@ -26,20 +26,18 @@ describe("Table Float Properties", () => {
});
const DEFAULT_TFP = {
- "w:tblpPr": [
- {
- _attr: {
- "w:horzAnchor": "margin",
- "w:vertAnchor": "page",
- "w:tblpX": 10,
- "w:tblpXSpec": "center",
- "w:tblpY": 20,
- "w:tblpYSpec": "bottom",
- "w:bottomFromText": 30,
- "w:topFromText": 40,
- "w:leftFromText": 50,
- "w:rightFromText": 60,
- },
+ "w:tblpPr": {
+ _attr: {
+ "w:horzAnchor": "margin",
+ "w:vertAnchor": "page",
+ "w:tblpX": 10,
+ "w:tblpXSpec": "center",
+ "w:tblpY": 20,
+ "w:tblpYSpec": "bottom",
+ "w:bottomFromText": 30,
+ "w:topFromText": 40,
+ "w:leftFromText": 50,
+ "w:rightFromText": 60,
},
- ],
+ },
};
diff --git a/src/file/table/table-properties/table-properties.spec.ts b/src/file/table/table-properties/table-properties.spec.ts
index 70db3206d7..c5bc54d2b9 100644
--- a/src/file/table/table-properties/table-properties.spec.ts
+++ b/src/file/table/table-properties/table-properties.spec.ts
@@ -9,8 +9,11 @@ describe("TableProperties", () => {
describe("#constructor", () => {
it("creates an initially empty property object", () => {
const tp = new TableProperties();
- const tree = new Formatter().format(tp);
- expect(tree).to.deep.equal({ "w:tblPr": [] });
+ // The TableProperties is ignorable if there are no attributes,
+ // which results in prepForXml returning undefined, which causes
+ // the formatter to throw an error if that is the only object it
+ // has been asked to format.
+ expect(() => new Formatter().format(tp)).to.throw("XMLComponent did not format correctly");
});
});
@@ -19,7 +22,7 @@ describe("TableProperties", () => {
const tp = new TableProperties().setWidth(1234, WidthType.DXA);
const tree = new Formatter().format(tp);
expect(tree).to.deep.equal({
- "w:tblPr": [{ "w:tblW": [{ _attr: { "w:type": "dxa", "w:w": 1234 } }] }],
+ "w:tblPr": [{ "w:tblW": { _attr: { "w:type": "dxa", "w:w": 1234 } } }],
});
});
@@ -27,7 +30,7 @@ describe("TableProperties", () => {
const tp = new TableProperties().setWidth(1234);
const tree = new Formatter().format(tp);
expect(tree).to.deep.equal({
- "w:tblPr": [{ "w:tblW": [{ _attr: { "w:type": "auto", "w:w": 1234 } }] }],
+ "w:tblPr": [{ "w:tblW": { _attr: { "w:type": "auto", "w:w": 1234 } } }],
});
});
});
@@ -37,7 +40,7 @@ describe("TableProperties", () => {
const tp = new TableProperties().setFixedWidthLayout();
const tree = new Formatter().format(tp);
expect(tree).to.deep.equal({
- "w:tblPr": [{ "w:tblLayout": [{ _attr: { "w:type": "fixed" } }] }],
+ "w:tblPr": [{ "w:tblLayout": { _attr: { "w:type": "fixed" } } }],
});
});
});
@@ -48,7 +51,7 @@ describe("TableProperties", () => {
tp.CellMargin.addTopMargin(1234, WidthType.DXA);
const tree = new Formatter().format(tp);
expect(tree).to.deep.equal({
- "w:tblPr": [{ "w:tblCellMar": [{ "w:top": [{ _attr: { "w:type": "dxa", "w:w": 1234 } }] }] }],
+ "w:tblPr": [{ "w:tblCellMar": [{ "w:top": { _attr: { "w:type": "dxa", "w:w": 1234 } } }] }],
});
});
@@ -57,7 +60,7 @@ describe("TableProperties", () => {
tp.CellMargin.addLeftMargin(1234, WidthType.DXA);
const tree = new Formatter().format(tp);
expect(tree).to.deep.equal({
- "w:tblPr": [{ "w:tblCellMar": [{ "w:left": [{ _attr: { "w:type": "dxa", "w:w": 1234 } }] }] }],
+ "w:tblPr": [{ "w:tblCellMar": [{ "w:left": { _attr: { "w:type": "dxa", "w:w": 1234 } } }] }],
});
});
});
diff --git a/src/file/table/table-properties/table-properties.ts b/src/file/table/table-properties/table-properties.ts
index 2b9f08b35a..4067b2b3dc 100644
--- a/src/file/table/table-properties/table-properties.ts
+++ b/src/file/table/table-properties/table-properties.ts
@@ -1,4 +1,4 @@
-import { XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent } from "file/xml-components";
import { ITableShadingAttributesProperties, TableShading } from "../shading";
import { WidthType } from "../table-cell";
@@ -8,7 +8,7 @@ import { ITableFloatOptions, TableFloatProperties } from "./table-float-properti
import { TableLayout, TableLayoutType } from "./table-layout";
import { PreferredTableWidth } from "./table-width";
-export class TableProperties extends XmlComponent {
+export class TableProperties extends IgnoreIfEmptyXmlComponent {
private readonly cellMargin: TableCellMargin;
constructor() {
diff --git a/src/file/table/table-row/table-row-properties.spec.ts b/src/file/table/table-row/table-row-properties.spec.ts
index 9fff1674ef..155238cb88 100644
--- a/src/file/table/table-row/table-row-properties.spec.ts
+++ b/src/file/table/table-row/table-row-properties.spec.ts
@@ -6,8 +6,11 @@ describe("TableRowProperties", () => {
describe("#constructor", () => {
it("creates an initially empty property object", () => {
const rowProperties = new TableRowProperties();
- const tree = new Formatter().format(rowProperties);
- expect(tree).to.deep.equal({ "w:trPr": [] });
+ // The TableRowProperties is ignorable if there are no attributes,
+ // which results in prepForXml returning undefined, which causes
+ // the formatter to throw an error if that is the only object it
+ // has been asked to format.
+ expect(() => new Formatter().format(rowProperties)).to.throw("XMLComponent did not format correctly");
});
});
@@ -16,7 +19,7 @@ describe("TableRowProperties", () => {
const rowProperties = new TableRowProperties();
rowProperties.setCantSplit();
const tree = new Formatter().format(rowProperties);
- expect(tree).to.deep.equal({ "w:trPr": [{ "w:cantSplit": [{ _attr: { "w:val": true } }] }] });
+ expect(tree).to.deep.equal({ "w:trPr": [{ "w:cantSplit": { _attr: { "w:val": true } } }] });
});
});
@@ -25,7 +28,7 @@ describe("TableRowProperties", () => {
const rowProperties = new TableRowProperties();
rowProperties.setTableHeader();
const tree = new Formatter().format(rowProperties);
- expect(tree).to.deep.equal({ "w:trPr": [{ "w:tblHeader": [{ _attr: { "w:val": true } }] }] });
+ expect(tree).to.deep.equal({ "w:trPr": [{ "w:tblHeader": { _attr: { "w:val": true } } }] });
});
});
});
diff --git a/src/file/table/table-row/table-row-properties.ts b/src/file/table/table-row/table-row-properties.ts
index f3e3a168ce..ed8332cc84 100644
--- a/src/file/table/table-row/table-row-properties.ts
+++ b/src/file/table/table-row/table-row-properties.ts
@@ -1,6 +1,6 @@
-import { XmlAttributeComponent, XmlComponent } from "file/xml-components";
+import { IgnoreIfEmptyXmlComponent, XmlAttributeComponent, XmlComponent } from "file/xml-components";
-export class TableRowProperties extends XmlComponent {
+export class TableRowProperties extends IgnoreIfEmptyXmlComponent {
constructor() {
super("w:trPr");
}
diff --git a/src/file/table/table-row/table-row.spec.ts b/src/file/table/table-row/table-row.spec.ts
index 9cc2d3e478..2af955eb6d 100644
--- a/src/file/table/table-row/table-row.spec.ts
+++ b/src/file/table/table-row/table-row.spec.ts
@@ -11,11 +11,7 @@ describe("TableRow", () => {
const tableRow = new TableRow([]);
const tree = new Formatter().format(tableRow);
expect(tree).to.deep.equal({
- "w:tr": [
- {
- "w:trPr": [],
- },
- ],
+ "w:tr": null,
});
});
@@ -24,20 +20,10 @@ describe("TableRow", () => {
const tree = new Formatter().format(tableRow);
expect(tree).to.deep.equal({
"w:tr": [
- {
- "w:trPr": [],
- },
{
"w:tc": [
{
- "w:tcPr": [],
- },
- {
- "w:p": [
- {
- "w:pPr": [],
- },
- ],
+ "w:p": null,
},
],
},
diff --git a/src/file/table/table.spec.ts b/src/file/table/table.spec.ts
index bcff8f5702..513524d863 100644
--- a/src/file/table/table.spec.ts
+++ b/src/file/table/table.spec.ts
@@ -11,68 +11,58 @@ import { RelativeHorizontalPosition, RelativeVerticalPosition, TableAnchorType }
const DEFAULT_TABLE_PROPERTIES = {
"w:tblCellMar": [
{
- "w:bottom": [
- {
- _attr: {
- "w:type": "auto",
- "w:w": 0,
- },
+ "w:bottom": {
+ _attr: {
+ "w:type": "auto",
+ "w:w": 0,
},
- ],
+ },
},
{
- "w:top": [
- {
- _attr: {
- "w:type": "auto",
- "w:w": 0,
- },
+ "w:top": {
+ _attr: {
+ "w:type": "auto",
+ "w:w": 0,
},
- ],
+ },
},
{
- "w:left": [
- {
- _attr: {
- "w:type": "auto",
- "w:w": 0,
- },
+ "w:left": {
+ _attr: {
+ "w:type": "auto",
+ "w:w": 0,
},
- ],
+ },
},
{
- "w:right": [
- {
- _attr: {
- "w:type": "auto",
- "w:w": 0,
- },
+ "w:right": {
+ _attr: {
+ "w:type": "auto",
+ "w:w": 0,
},
- ],
+ },
},
],
};
const BORDERS = {
"w:tblBorders": [
- { "w:top": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
- { "w:left": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
- { "w:bottom": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
- { "w:right": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
- { "w:insideH": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
- { "w:insideV": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
+ { "w:top": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+ { "w:left": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+ { "w:bottom": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+ { "w:right": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+ { "w:insideH": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+ { "w:insideV": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
],
};
const WIDTHS = {
- "w:tblW": [
- {
- _attr: {
- "w:type": "auto",
- "w:w": 100,
- },
+ "w:tblW": {
+ _attr: {
+ "w:type": "auto",
+ "w:w": 100,
},
- ],
+ },
};
// const f = {
@@ -81,45 +71,43 @@ const WIDTHS = {
// "w:tblPr": [
// {
// "w:tblCellMar": [
-// { "w:bottom": [{ _attr: { "w:type": "auto", "w:w": 0 } }] },
-// { "w:top": [{ _attr: { "w:type": "auto", "w:w": 0 } }] },
-// { "w:left": [{ _attr: { "w:type": "auto", "w:w": 0 } }] },
-// { "w:right": [{ _attr: { "w:type": "auto", "w:w": 0 } }] },
+// { "w:bottom": { _attr: { "w:type": "auto", "w:w": 0 } } },
+// { "w:top": { _attr: { "w:type": "auto", "w:w": 0 } } },
+// { "w:left": { _attr: { "w:type": "auto", "w:w": 0 } } },
+// { "w:right": { _attr: { "w:type": "auto", "w:w": 0 } } },
// ],
// },
// {
// "w:tblBorders": [
-// { "w:top": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
-// { "w:left": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
-// { "w:bottom": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
-// { "w:right": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
-// { "w:insideH": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
-// { "w:insideV": [{ _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } }] },
+// { "w:top": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+// { "w:left": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+// { "w:bottom": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+// { "w:right": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+// { "w:insideH": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
+// { "w:insideV": { _attr: { "w:val": "single", "w:sz": 4, "w:space": 0, "w:color": "auto" } } },
// ],
// },
-// { "w:tblW": [{ _attr: { "w:type": "auto", "w:w": 100 } }] },
+// { "w:tblW": { _attr: { "w:type": "auto", "w:w": 100 } } },
// {
-// "w:tblpPr": [
-// {
-// _attr: {
-// "w:horzAnchor": "margin",
-// "w:vertAnchor": "page",
-// "w:tblpX": 10,
-// "w:tblpXSpec": "center",
-// "w:tblpY": 20,
-// "w:tblpYSpec": "bottom",
-// "w:bottomFromText": 30,
-// "w:topFromText": 40,
-// "w:leftFromText": 50,
-// "w:rightFromText": 60,
-// },
+// "w:tblpPr": {
+// _attr: {
+// "w:horzAnchor": "margin",
+// "w:vertAnchor": "page",
+// "w:tblpX": 10,
+// "w:tblpXSpec": "center",
+// "w:tblpY": 20,
+// "w:tblpYSpec": "bottom",
+// "w:bottomFromText": 30,
+// "w:topFromText": 40,
+// "w:leftFromText": 50,
+// "w:rightFromText": 60,
// },
-// ],
+// },
// },
// ],
// },
-// { "w:tblGrid": [{ "w:gridCol": [{ _attr: { "w:w": 100 } }] }] },
-// { "w:tr": [{ "w:trPr": [] }, { "w:tc": [{ "w:tcPr": [] }, { "w:p": [{ "w:pPr": [] }] }] }] },
+// { "w:tblGrid": [{ "w:gridCol": { _attr: { "w:w": 100 } } }] },
+// { "w:tr": [{ "w:tc": [{ "w:p": null }] }] },
// ],
// };
@@ -131,16 +119,16 @@ describe("Table", () => {
columns: 2,
});
const tree = new Formatter().format(table);
- const cell = { "w:tc": [{ "w:tcPr": [] }, { "w:p": [{ "w:pPr": [] }] }] };
+ const cell = { "w:tc": [{ "w:p": null }] };
expect(tree).to.deep.equal({
"w:tbl": [
{ "w:tblPr": [DEFAULT_TABLE_PROPERTIES, BORDERS, WIDTHS] },
{
- "w:tblGrid": [{ "w:gridCol": [{ _attr: { "w:w": 100 } }] }, { "w:gridCol": [{ _attr: { "w:w": 100 } }] }],
+ "w:tblGrid": [{ "w:gridCol": { _attr: { "w:w": 100 } } }, { "w:gridCol": { _attr: { "w:w": 100 } } }],
},
- { "w:tr": [{ "w:trPr": [] }, cell, cell] },
- { "w:tr": [{ "w:trPr": [] }, cell, cell] },
- { "w:tr": [{ "w:trPr": [] }, cell, cell] },
+ { "w:tr": [cell, cell] },
+ { "w:tr": [cell, cell] },
+ { "w:tr": [cell, cell] },
],
});
});
@@ -172,9 +160,8 @@ describe("Table", () => {
const tree = new Formatter().format(table);
const cell = (c) => ({
"w:tc": [
- { "w:tcPr": [] },
{
- "w:p": [{ "w:pPr": [] }, { "w:r": [{ "w:rPr": [] }, { "w:t": [{ _attr: { "xml:space": "preserve" } }, c] }] }],
+ "w:p": [{ "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, c] }] }],
},
],
});
@@ -182,10 +169,10 @@ describe("Table", () => {
"w:tbl": [
{ "w:tblPr": [DEFAULT_TABLE_PROPERTIES, BORDERS, WIDTHS] },
{
- "w:tblGrid": [{ "w:gridCol": [{ _attr: { "w:w": 100 } }] }, { "w:gridCol": [{ _attr: { "w:w": 100 } }] }],
+ "w:tblGrid": [{ "w:gridCol": { _attr: { "w:w": 100 } } }, { "w:gridCol": { _attr: { "w:w": 100 } } }],
},
- { "w:tr": [{ "w:trPr": [] }, cell("A1"), cell("B1")] },
- { "w:tr": [{ "w:trPr": [] }, cell("A2"), cell("B2")] },
+ { "w:tr": [cell("A1"), cell("B1")] },
+ { "w:tr": [cell("A2"), cell("B2")] },
],
});
});
@@ -222,9 +209,8 @@ describe("Table", () => {
const tree = new Formatter().format(table);
const cell = (c) => ({
"w:tc": [
- { "w:tcPr": [] },
{
- "w:p": [{ "w:pPr": [] }, { "w:r": [{ "w:rPr": [] }, { "w:t": [{ _attr: { "xml:space": "preserve" } }, c] }] }],
+ "w:p": [{ "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, c] }] }],
},
],
});
@@ -232,10 +218,10 @@ describe("Table", () => {
"w:tbl": [
{ "w:tblPr": [DEFAULT_TABLE_PROPERTIES, BORDERS, WIDTHS] },
{
- "w:tblGrid": [{ "w:gridCol": [{ _attr: { "w:w": 100 } }] }, { "w:gridCol": [{ _attr: { "w:w": 100 } }] }],
+ "w:tblGrid": [{ "w:gridCol": { _attr: { "w:w": 100 } } }, { "w:gridCol": { _attr: { "w:w": 100 } } }],
},
- { "w:tr": [{ "w:trPr": [] }, cell("A1"), cell("B1")] },
- { "w:tr": [{ "w:trPr": [] }, cell("A2"), cell("B2")] },
+ { "w:tr": [cell("A1"), cell("B1")] },
+ { "w:tr": [cell("A2"), cell("B2")] },
],
});
});
@@ -250,7 +236,7 @@ describe("Table", () => {
// .which.is.an("array")
// .with.has.length.at.least(1);
// expect(tree["w:tbl"][0]).to.deep.equal({
- // "w:tblPr": [DEFAULT_TABLE_PROPERTIES, { "w:tblW": [{ _attr: { "w:type": "pct", "w:w": "1000%" } }] }],
+ // "w:tblPr": [DEFAULT_TABLE_PROPERTIES, { "w:tblW": { _attr: { "w:type": "pct", "w:w": "1000%" } } }],
// });
// });
@@ -259,7 +245,7 @@ describe("Table", () => {
// const tree = new Formatter().format(table);
// expect(tree["w:tbl"][0]).to.deep.equal({
- // "w:tblPr": [DEFAULT_TABLE_PROPERTIES, { "w:tblW": [{ _attr: { "w:type": "auto", "w:w": 1000 } }] }],
+ // "w:tblPr": [DEFAULT_TABLE_PROPERTIES, { "w:tblW": { _attr: { "w:type": "auto", "w:w": 1000 } } }],
// });
// });
// });
@@ -276,7 +262,7 @@ describe("Table", () => {
.which.is.an("array")
.with.has.length.at.least(1);
expect(tree["w:tbl"][0]).to.deep.equal({
- "w:tblPr": [DEFAULT_TABLE_PROPERTIES, BORDERS, WIDTHS, { "w:tblLayout": [{ _attr: { "w:type": "fixed" } }] }],
+ "w:tblPr": [DEFAULT_TABLE_PROPERTIES, BORDERS, WIDTHS, { "w:tblLayout": { _attr: { "w:type": "fixed" } } }],
});
});
});
@@ -298,7 +284,7 @@ describe("Table", () => {
.to.be.an("array")
.which.has.length.at.least(1);
expect(row["w:tr"].find((x) => x["w:tc"])).to.deep.equal({
- "w:tc": [{ "w:tcPr": [] }, { "w:p": [{ "w:pPr": [] }] }],
+ "w:tc": [{ "w:p": null }],
});
});
@@ -325,7 +311,7 @@ describe("Table", () => {
const cell = row["w:tr"].find((x) => x["w:tc"]);
expect(cell).not.to.be.undefined;
expect(cell["w:tc"][cell["w:tc"].length - 1]).to.deep.equal({
- "w:p": [{ "w:pPr": [] }],
+ "w:p": null,
});
});
@@ -346,12 +332,8 @@ describe("Table", () => {
.which.has.length.at.least(1);
expect(row["w:tr"].find((x) => x["w:tc"])).to.deep.equal({
"w:tc": [
- { "w:tcPr": [] },
{
- "w:p": [
- { "w:pPr": [] },
- { "w:r": [{ "w:rPr": [] }, { "w:t": [{ _attr: { "xml:space": "preserve" } }, "Hello"] }] },
- ],
+ "w:p": [{ "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "Hello"] }] }],
},
],
});
@@ -377,12 +359,10 @@ describe("Table", () => {
.which.has.length.at.least(1);
expect(row["w:tr"].find((x) => x["w:tc"])).to.deep.equal({
"w:tc": [
- { "w:tcPr": [] },
{
"w:p": [
- { "w:pPr": [] },
{
- "w:r": [{ "w:rPr": [] }, { "w:t": [{ _attr: { "xml:space": "preserve" } }, "Test paragraph"] }],
+ "w:r": [{ "w:t": [{ _attr: { "xml:space": "preserve" } }, "Test paragraph"] }],
},
],
},
@@ -421,22 +401,20 @@ describe("Table", () => {
BORDERS,
WIDTHS,
{
- "w:tblpPr": [
- {
- _attr: {
- "w:horzAnchor": "margin",
- "w:vertAnchor": "page",
- "w:tblpX": 10,
- "w:tblpXSpec": "center",
- "w:tblpY": 20,
- "w:tblpYSpec": "bottom",
- "w:bottomFromText": 30,
- "w:topFromText": 40,
- "w:leftFromText": 50,
- "w:rightFromText": 60,
- },
+ "w:tblpPr": {
+ _attr: {
+ "w:horzAnchor": "margin",
+ "w:vertAnchor": "page",
+ "w:tblpX": 10,
+ "w:tblpXSpec": "center",
+ "w:tblpY": 20,
+ "w:tblpYSpec": "bottom",
+ "w:bottomFromText": 30,
+ "w:topFromText": 40,
+ "w:leftFromText": 50,
+ "w:rightFromText": 60,
},
- ],
+ },
},
],
});
diff --git a/src/file/xml-components/default-attributes.ts b/src/file/xml-components/default-attributes.ts
index 0bfe444f5f..88f91bf932 100644
--- a/src/file/xml-components/default-attributes.ts
+++ b/src/file/xml-components/default-attributes.ts
@@ -6,7 +6,7 @@ export type AttributeMap = { [P in keyof T]: string };
export abstract class XmlAttributeComponent extends BaseXmlComponent {
// tslint:disable-next-line:readonly-keyword
protected root: T;
- protected readonly xmlKeys: AttributeMap;
+ protected readonly xmlKeys?: AttributeMap;
constructor(properties: T) {
super("_attr");
@@ -18,7 +18,7 @@ export abstract class XmlAttributeComponent extends BaseXmlComponent {
Object.keys(this.root).forEach((key) => {
const value = this.root[key];
if (value !== undefined) {
- const newKey = this.xmlKeys[key];
+ const newKey = (this.xmlKeys && this.xmlKeys[key]) || key;
attrs[newKey] = value;
}
});
diff --git a/src/file/xml-components/imported-xml-component.spec.ts b/src/file/xml-components/imported-xml-component.spec.ts
index 3d883fa908..72caf44bb4 100644
--- a/src/file/xml-components/imported-xml-component.spec.ts
+++ b/src/file/xml-components/imported-xml-component.spec.ts
@@ -25,11 +25,25 @@ const convertedXmlElement = {
deleted: false,
rootKey: "w:p",
root: [
+ { deleted: false, rootKey: "_attr", root: { "w:one": "value 1", "w:two": "value 2" } },
{ deleted: false, rootKey: "w:rPr", root: [{ deleted: false, rootKey: "w:noProof", root: ["some value"] }] },
- { deleted: false, rootKey: "w:r", root: [{ deleted: false, rootKey: "w:t", root: ["Text 1"] }], _attr: { active: "true" } },
- { deleted: false, rootKey: "w:r", root: [{ deleted: false, rootKey: "w:t", root: ["Text 2"] }], _attr: { active: "true" } },
+ {
+ deleted: false,
+ rootKey: "w:r",
+ root: [
+ { deleted: false, rootKey: "_attr", root: { active: "true" } },
+ { deleted: false, rootKey: "w:t", root: ["Text 1"] },
+ ],
+ },
+ {
+ deleted: false,
+ rootKey: "w:r",
+ root: [
+ { deleted: false, rootKey: "_attr", root: { active: "true" } },
+ { deleted: false, rootKey: "w:t", root: ["Text 2"] },
+ ],
+ },
],
- _attr: { "w:one": "value 1", "w:two": "value 2" },
},
],
rootKey: undefined,
@@ -59,7 +73,7 @@ describe("ImportedXmlComponent", () => {
},
},
{
- "w:child": [],
+ "w:child": null,
},
],
});
diff --git a/src/file/xml-components/imported-xml-component.ts b/src/file/xml-components/imported-xml-component.ts
index 7485c651e0..790ff936ac 100644
--- a/src/file/xml-components/imported-xml-component.ts
+++ b/src/file/xml-components/imported-xml-component.ts
@@ -1,6 +1,6 @@
// tslint:disable:no-any
import { Element as XmlElement, xml2js } from "xml-js";
-import { IXmlableObject, XmlComponent } from ".";
+import { IXmlableObject, XmlAttributeComponent, XmlComponent } from ".";
/**
* Converts the given xml element (in json format) into XmlComponent.
@@ -27,6 +27,10 @@ export function convertToXmlComponent(element: XmlElement): ImportedXmlComponent
}
}
+class ImportedXmlComponentAttributes extends XmlAttributeComponent {
+ // noop
+}
+
/**
* Represents imported xml component from xml file.
*/
@@ -46,58 +50,14 @@ export class ImportedXmlComponent extends XmlComponent {
* @param importedContent xml content of the imported component
*/
- // tslint:disable-next-line:variable-name
- private readonly _attr: any;
-
// tslint:disable-next-line:variable-name
constructor(rootKey: string, _attr?: any) {
super(rootKey);
if (_attr) {
- this._attr = _attr;
+ this.root.push(new ImportedXmlComponentAttributes(_attr));
}
}
- /**
- * Transforms the object so it can be converted to xml. Example:
- *
- *
- *
- *
- * {
- * 'w:someKey': [
- * {
- * _attr: {
- * someAttr: "1",
- * otherAttr: "11"
- * }
- * },
- * {
- * 'w:child': [
- * {
- * _attr: {
- * childAttr: "2"
- * }
- * }
- * ]
- * }
- * ]
- * }
- */
- public prepForXml(): IXmlableObject | undefined {
- const result = super.prepForXml();
- if (!result) {
- return undefined;
- }
-
- if (!!this._attr) {
- if (!Array.isArray(result[this.rootKey])) {
- result[this.rootKey] = [result[this.rootKey]];
- }
- result[this.rootKey].unshift({ _attr: this._attr });
- }
- return result;
- }
-
public push(xmlComponent: XmlComponent | string): void {
this.root.push(xmlComponent);
}
diff --git a/src/file/xml-components/xml-component.spec.ts b/src/file/xml-components/xml-component.spec.ts
index ce198b135c..38a0b12711 100644
--- a/src/file/xml-components/xml-component.spec.ts
+++ b/src/file/xml-components/xml-component.spec.ts
@@ -31,7 +31,7 @@ describe("XmlComponent", () => {
return;
}
- assert.equal(xml["w:test"].length, 0);
+ assert.isNull(xml["w:test"]);
});
});
});
diff --git a/src/file/xml-components/xml-component.ts b/src/file/xml-components/xml-component.ts
index b386c52c42..56a10bc323 100644
--- a/src/file/xml-components/xml-component.ts
+++ b/src/file/xml-components/xml-component.ts
@@ -17,7 +17,7 @@ export abstract class XmlComponent extends BaseXmlComponent {
if (c instanceof BaseXmlComponent) {
return !c.IsDeleted;
}
- return true;
+ return c !== undefined;
})
.map((comp) => {
if (comp instanceof BaseXmlComponent) {
@@ -26,8 +26,15 @@ export abstract class XmlComponent extends BaseXmlComponent {
return comp;
})
.filter((comp) => comp !== undefined); // Exclude undefined
+ // If we only have a single IXmlableObject in our children array and it
+ // represents our attributes, use the object itself as our children to
+ // avoid an unneeded XML close element. (Note: We have to use this
+ // function to get typescript to allow our check.)
+ // Additionally, if the array is empty, use null as our children to
+ // get an empty XML element generated.
+ const onlyAttrs = (c) => typeof c === "object" && c._attr;
return {
- [this.rootKey]: children,
+ [this.rootKey]: children.length ? (children.length === 1 && onlyAttrs(children[0]) ? children[0] : children) : null,
};
}
@@ -41,3 +48,12 @@ export abstract class XmlComponent extends BaseXmlComponent {
this.deleted = true;
}
}
+
+export abstract class IgnoreIfEmptyXmlComponent extends XmlComponent {
+ public prepForXml(): IXmlableObject | undefined {
+ const result = super.prepForXml();
+ if (result && result[this.rootKey]) {
+ return result;
+ }
+ }
+}
diff --git a/tslint.json b/tslint.json
index d6eb606eba..6c498e2957 100644
--- a/tslint.json
+++ b/tslint.json
@@ -15,7 +15,8 @@
"max-classes-per-file": [false],
"no-implicit-dependencies": false,
"no-submodule-imports": false,
- "no-null-keyword": true,
+ // We need null in order to get empty elements from the xml library
+ "no-null-keyword": false,
"return-undefined": true,
"prefer-readonly": true,
"no-duplicate-imports": true,