From 36a18c5af3b8574c369de5fb264eb964807f2c80 Mon Sep 17 00:00:00 2001 From: Andrey Savin Date: Mon, 26 Jul 2021 09:55:33 +0300 Subject: [PATCH 1/5] Use level.start for overrideLevel.start if possible Implemented via additional reference config map. --- src/file/numbering/numbering.ts | 37 +++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/file/numbering/numbering.ts b/src/file/numbering/numbering.ts index 8f37b386c5..0a532d4e76 100644 --- a/src/file/numbering/numbering.ts +++ b/src/file/numbering/numbering.ts @@ -29,6 +29,7 @@ export interface INumberingOptions { export class Numbering extends XmlComponent { private readonly abstractNumberingMap = new Map(); private readonly concreteNumberingMap = new Map(); + private readonly referenceConfigMap = new Map(); constructor(options: INumberingOptions) { super("w:numbering"); @@ -174,6 +175,7 @@ export class Numbering extends XmlComponent { for (const con of options.config) { this.abstractNumberingMap.set(con.reference, new AbstractNumbering(uniqueNumericId(), con.levels)); + this.referenceConfigMap.set(con.reference, con.levels); } } @@ -201,19 +203,28 @@ export class Numbering extends XmlComponent { return; } - this.concreteNumberingMap.set( - fullReference, - new ConcreteNumbering({ - numId: uniqueNumericId(), - abstractNumId: abstractNumbering.id, - reference, - instance, - overrideLevel: { - num: 0, - start: 1, - }, - }), - ); + const concreteNumberingSettings = { + numId: uniqueNumericId(), + abstractNumId: abstractNumbering.id, + reference, + instance, + }; + + const referenceConfigLevels = this.referenceConfigMap.get(reference); + const firstLevelStartNumber = referenceConfigLevels?.[0]?.start; + if (firstLevelStartNumber) { + concreteNumberingSettings.overrideLevel = { + num: 0, + start: firstLevelStartNumber, + }; + } else { + concreteNumberingSettings.overrideLevel = { + num: 0, + start: 1, + }; + } + + this.concreteNumberingMap.set(fullReference, new ConcreteNumbering(concreteNumberingSettings)); } public get ConcreteNumbering(): ConcreteNumbering[] { From 2fd4f064ae1bcf60b869a6c52d5de785172394c5 Mon Sep 17 00:00:00 2001 From: Andrey Savin Date: Mon, 26 Jul 2021 13:28:55 +0300 Subject: [PATCH 2/5] Simplify + TS related fix --- src/file/numbering/numbering.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/file/numbering/numbering.ts b/src/file/numbering/numbering.ts index 0a532d4e76..fd2bf0754a 100644 --- a/src/file/numbering/numbering.ts +++ b/src/file/numbering/numbering.ts @@ -29,7 +29,7 @@ export interface INumberingOptions { export class Numbering extends XmlComponent { private readonly abstractNumberingMap = new Map(); private readonly concreteNumberingMap = new Map(); - private readonly referenceConfigMap = new Map(); + private readonly referenceConfigMap = new Map(); constructor(options: INumberingOptions) { super("w:numbering"); @@ -208,6 +208,10 @@ export class Numbering extends XmlComponent { abstractNumId: abstractNumbering.id, reference, instance, + overrideLevel: { + num: 0, + start: 1, + }, }; const referenceConfigLevels = this.referenceConfigMap.get(reference); @@ -217,11 +221,6 @@ export class Numbering extends XmlComponent { num: 0, start: firstLevelStartNumber, }; - } else { - concreteNumberingSettings.overrideLevel = { - num: 0, - start: 1, - }; } this.concreteNumberingMap.set(fullReference, new ConcreteNumbering(concreteNumberingSettings)); From 0f531b2a9b2bd351924629a0dc85ab48bf66f0ae Mon Sep 17 00:00:00 2001 From: Andrey Savin Date: Mon, 26 Jul 2021 14:22:59 +0300 Subject: [PATCH 3/5] Additional demo on use of start & instance numbers --- ...numbering-instances-and-starting-number.ts | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 demo/68-numbering-instances-and-starting-number.ts diff --git a/demo/68-numbering-instances-and-starting-number.ts b/demo/68-numbering-instances-and-starting-number.ts new file mode 100644 index 0000000000..6bfda02e96 --- /dev/null +++ b/demo/68-numbering-instances-and-starting-number.ts @@ -0,0 +1,86 @@ +import * as fs from "fs"; +import { Document, Packer, Paragraph, PageNumberFormat} from "../build"; + +const doc = new Document({ + numbering:{ + config:[ + { + reference: 'ref1', + levels: [ + { + level: 0, + format: PageNumberFormat.DECIMAL, + text: '%1', + start: 10, + } + ], + }, + { + reference: 'ref2', + levels: [ + { + level: 0, + format: PageNumberFormat.DECIMAL, + text: '%1' + } + ], + }, + ] + }, + sections: [{ + children: [ + new Paragraph({ + text: "REF1 - inst:0 - lvl:0", + numbering : { + reference: 'ref1', + instance: 0, + level: 0, + } + }), + new Paragraph({ + text: "REF1 - inst:0 - lvl:0", + numbering : { + reference: 'ref1', + instance: 0, + level: 0, + } + }), + new Paragraph({ + text: "REF1 - inst:1 - lvl:0", + numbering : { + reference: 'ref1', + instance: 1, + level: 0, + }, + }), + new Paragraph({ + text: "REF1 - inst:1 - lvl:0", + numbering : { + reference: 'ref1', + instance: 1, + level: 0, + } + }), + new Paragraph({ + text: "REF2 - inst:0 - lvl:0", + numbering : { + reference: 'ref2', + instance: 1, + level: 0, + } + }), + new Paragraph({ + text: "REF2 - inst:0 - lvl:0", + numbering : { + reference: 'ref2', + instance: 1, + level: 0, + } + }) + ], + }] +}); + +Packer.toBuffer(doc).then((buffer) => { + fs.writeFileSync("My Document.docx", buffer); +}); \ No newline at end of file From d77397287755ab3d8bef65e394f3733f48bcd1b5 Mon Sep 17 00:00:00 2001 From: Andrey Savin Date: Fri, 30 Jul 2021 11:58:55 +0300 Subject: [PATCH 4/5] Test coverage issue fix --- src/file/numbering/numbering.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/file/numbering/numbering.ts b/src/file/numbering/numbering.ts index fd2bf0754a..599fc1c8a8 100644 --- a/src/file/numbering/numbering.ts +++ b/src/file/numbering/numbering.ts @@ -215,8 +215,8 @@ export class Numbering extends XmlComponent { }; const referenceConfigLevels = this.referenceConfigMap.get(reference); - const firstLevelStartNumber = referenceConfigLevels?.[0]?.start; - if (firstLevelStartNumber) { + const firstLevelStartNumber = referenceConfigLevels && referenceConfigLevels[0].start; + if (firstLevelStartNumber && Number.isInteger(firstLevelStartNumber)) { concreteNumberingSettings.overrideLevel = { num: 0, start: firstLevelStartNumber, From f378c37b62290fc8e67f4eeaca715ad9ee9d0f51 Mon Sep 17 00:00:00 2001 From: Andrey Savin Date: Fri, 30 Jul 2021 11:59:49 +0300 Subject: [PATCH 5/5] Test at spec.ts for referenceConfigMap --- src/file/numbering/numbering.spec.ts | 21 +++++++++++++++++++++ src/file/numbering/numbering.ts | 3 +++ 2 files changed, 24 insertions(+) diff --git a/src/file/numbering/numbering.spec.ts b/src/file/numbering/numbering.spec.ts index 6053a5e3cd..83314eabcd 100644 --- a/src/file/numbering/numbering.spec.ts +++ b/src/file/numbering/numbering.spec.ts @@ -112,5 +112,26 @@ describe("Numbering", () => { expect(numbering.ConcreteNumbering).to.have.length(2); }); }); + describe("#referenceConfigMap", () => { + it("should store level configs into referenceConfigMap", () => { + const numbering = new Numbering({ + config: [ + { + reference: "test-reference", + levels: [ + { + level: 0, + start: 10, + }, + ], + }, + ], + }); + numbering.createConcreteNumberingInstance("test-reference", 0); + const referenceConfig = numbering.ReferenceConfig[0]; + const zeroLevelConfig = referenceConfig[0]; + expect(zeroLevelConfig.start).to.be.equal(10); + }); + }); }); }); diff --git a/src/file/numbering/numbering.ts b/src/file/numbering/numbering.ts index 599fc1c8a8..998cd144a2 100644 --- a/src/file/numbering/numbering.ts +++ b/src/file/numbering/numbering.ts @@ -229,4 +229,7 @@ export class Numbering extends XmlComponent { public get ConcreteNumbering(): ConcreteNumbering[] { return Array.from(this.concreteNumberingMap.values()); } + public get ReferenceConfig(): object[] { + return Array.from(this.referenceConfigMap.values()); + } }