diff --git a/package-lock.json b/package-lock.json index baced985c1..e628f3a581 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@types/node": "^18.0.0", "jszip": "^3.1.5", - "nanoid": "^3.1.20", + "nanoid": "^3.3.4", "xml": "^1.0.1", "xml-js": "^1.6.8" }, diff --git a/package.json b/package.json index f9f24b47b1..aea48b2f46 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "dependencies": { "@types/node": "^18.0.0", "jszip": "^3.1.5", - "nanoid": "^3.1.20", + "nanoid": "^3.3.4", "xml": "^1.0.1", "xml-js": "^1.6.8" }, diff --git a/src/file/numbering/concrete-numbering.spec.ts b/src/file/numbering/concrete-numbering.spec.ts index ef73d18983..1239a2b4fc 100644 --- a/src/file/numbering/concrete-numbering.spec.ts +++ b/src/file/numbering/concrete-numbering.spec.ts @@ -12,9 +12,11 @@ describe("ConcreteNumbering", () => { abstractNumId: 1, reference: "1", instance: 0, - overrideLevel: { - num: 3, - }, + overrideLevels: [ + { + num: 3, + }, + ], }); const tree = new Formatter().format(concreteNumbering); @@ -44,16 +46,61 @@ describe("ConcreteNumbering", () => { }); }); + it("sets a new override level for two different level numbers", () => { + const concreteNumbering = new ConcreteNumbering({ + numId: 0, + abstractNumId: 1, + reference: "1", + instance: 0, + overrideLevels: [{ num: 3 }, { num: 5 }], + }); + + const tree = new Formatter().format(concreteNumbering); + + expect(tree).to.deep.equal({ + "w:num": [ + { + _attr: { + "w:numId": 0, + }, + }, + { + "w:abstractNumId": { + _attr: { + "w:val": 1, + }, + }, + }, + { + "w:lvlOverride": { + _attr: { + "w:ilvl": 3, + }, + }, + }, + { + "w:lvlOverride": { + _attr: { + "w:ilvl": 5, + }, + }, + }, + ], + }); + }); + it("sets the startOverride element if start is given", () => { const concreteNumbering = new ConcreteNumbering({ numId: 0, abstractNumId: 1, reference: "1", instance: 0, - overrideLevel: { - num: 1, - start: 9, - }, + overrideLevels: [ + { + num: 1, + start: 9, + }, + ], }); const tree = new Formatter().format(concreteNumbering); expect(tree).to.deep.equal({ @@ -90,15 +137,143 @@ describe("ConcreteNumbering", () => { }); }); + it("sets the startOverride element for several levels if start is given", () => { + const concreteNumbering = new ConcreteNumbering({ + numId: 0, + abstractNumId: 1, + reference: "1", + instance: 0, + overrideLevels: [ + { + num: 1, + start: 9, + }, + { + num: 3, + start: 10, + }, + ], + }); + const tree = new Formatter().format(concreteNumbering); + expect(tree).to.deep.equal({ + "w:num": [ + { + _attr: { + "w:numId": 0, + }, + }, + { + "w:abstractNumId": { + _attr: { + "w:val": 1, + }, + }, + }, + { + "w:lvlOverride": [ + { + _attr: { + "w:ilvl": 1, + }, + }, + { + "w:startOverride": { + _attr: { + "w:val": 9, + }, + }, + }, + ], + }, + { + "w:lvlOverride": [ + { + _attr: { + "w:ilvl": 3, + }, + }, + { + "w:startOverride": { + _attr: { + "w:val": 10, + }, + }, + }, + ], + }, + ], + }); + }); + + it("Mix of overrideLevels with start and without", () => { + const concreteNumbering = new ConcreteNumbering({ + numId: 0, + abstractNumId: 1, + reference: "1", + instance: 0, + overrideLevels: [ + { + num: 1, + start: 9, + }, + { + num: 3, + }, + ], + }); + const tree = new Formatter().format(concreteNumbering); + expect(tree).to.deep.equal({ + "w:num": [ + { + _attr: { + "w:numId": 0, + }, + }, + { + "w:abstractNumId": { + _attr: { + "w:val": 1, + }, + }, + }, + { + "w:lvlOverride": [ + { + _attr: { + "w:ilvl": 1, + }, + }, + { + "w:startOverride": { + _attr: { + "w:val": 9, + }, + }, + }, + ], + }, + { + "w:lvlOverride": { + _attr: { + "w:ilvl": 3, + }, + }, + }, + ], + }); + }); + it("sets the lvl element if overrideLevel.Level is accessed", () => { const concreteNumbering = new ConcreteNumbering({ numId: 0, abstractNumId: 1, reference: "1", instance: 0, - overrideLevel: { - num: 1, - }, + overrideLevels: [ + { + num: 1, + }, + ], }); const tree = new Formatter().format(concreteNumbering); expect(tree).to.deep.equal({ diff --git a/src/file/numbering/num.ts b/src/file/numbering/num.ts index 983544b447..597f7530d1 100644 --- a/src/file/numbering/num.ts +++ b/src/file/numbering/num.ts @@ -18,15 +18,17 @@ class NumAttributes extends XmlAttributeComponent<{ protected readonly xmlKeys = { numId: "w:numId" }; } +interface IOverrideLevel { + readonly num: number; + readonly start?: number; +} + export interface IConcreteNumberingOptions { readonly numId: number; readonly abstractNumId: number; readonly reference: string; readonly instance: number; - readonly overrideLevel?: { - readonly num: number; - readonly start?: number; - }; + readonly overrideLevels?: readonly IOverrideLevel[]; } // @@ -60,8 +62,10 @@ export class ConcreteNumbering extends XmlComponent { this.root.push(new AbstractNumId(decimalNumber(options.abstractNumId))); - if (options.overrideLevel) { - this.root.push(new LevelOverride(options.overrideLevel.num, options.overrideLevel.start)); + if (options.overrideLevels && options.overrideLevels.length) { + for (const level of options.overrideLevels) { + this.root.push(new LevelOverride(level.num, level.start)); + } } } } diff --git a/src/file/numbering/numbering.ts b/src/file/numbering/numbering.ts index 233fbeb95a..b52d6ba56c 100644 --- a/src/file/numbering/numbering.ts +++ b/src/file/numbering/numbering.ts @@ -164,10 +164,12 @@ export class Numbering extends XmlComponent { abstractNumId: abstractNumbering.id, reference: "default-bullet-numbering", instance: 0, - overrideLevel: { - num: 0, - start: 1, - }, + overrideLevels: [ + { + num: 0, + start: 1, + }, + ], }), ); diff --git a/src/file/paragraph/run/comment-run.spec.ts b/src/file/paragraph/run/comment-run.spec.ts index 1900f31c03..62d3a624b8 100644 --- a/src/file/paragraph/run/comment-run.spec.ts +++ b/src/file/paragraph/run/comment-run.spec.ts @@ -44,7 +44,7 @@ describe("Comment", () => { let clock: sinon.SinonFakeTimers; beforeEach(() => { - const now = new Date(1999, 0, 1); + const now = new Date("1999-01-01T00:00:00.000Z"); clock = sinon.useFakeTimers(now.getTime()); }); @@ -57,7 +57,7 @@ describe("Comment", () => { const component = new Comment({ id: 0, text: "test-comment", - date: new Date(1999, 0, 1), + date: new Date("1999-01-01T00:00:00.000Z"), }); const tree = new Formatter().format(component); expect(tree).to.deep.equal({ @@ -126,12 +126,12 @@ describe("Comments", () => { { id: 0, text: "test-comment", - date: new Date(1999, 0, 1), + date: new Date("1999-01-01T00:00:00.000Z"), }, { id: 1, text: "test-comment-2", - date: new Date(1999, 0, 1), + date: new Date("1999-01-01T00:00:00.000Z"), }, ], });