From c59c5350fdbd55ff5bc71506917c75fbfb202457 Mon Sep 17 00:00:00 2001 From: Lentyaev Pavel Date: Tue, 18 Apr 2023 15:15:38 +0300 Subject: [PATCH] fix: added unique numeric id creator to avoid numbering render errors --- src/file/drawing/doc-properties/doc-properties.ts | 4 +++- src/file/numbering/numbering.ts | 11 +++++++---- src/file/paragraph/links/bookmark.ts | 4 +++- src/util/convenience-functions.ts | 8 +++++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/file/drawing/doc-properties/doc-properties.ts b/src/file/drawing/doc-properties/doc-properties.ts index ab5145cd5d..423317d6c8 100644 --- a/src/file/drawing/doc-properties/doc-properties.ts +++ b/src/file/drawing/doc-properties/doc-properties.ts @@ -2,7 +2,7 @@ import { IContext, IXmlableObject, NextAttributeComponent, XmlComponent } from "@file/xml-components"; import { ConcreteHyperlink } from "@file/paragraph"; -import { uniqueNumericId } from "@util/convenience-functions"; +import { uniqueNumericIdCreator } from "@util/convenience-functions"; import { createHyperlinkClick } from "./doc-properties-children"; @@ -24,6 +24,8 @@ export interface DocPropertiesOptions { readonly title: string; } +const uniqueNumericId = uniqueNumericIdCreator(); + export class DocProperties extends XmlComponent { public constructor({ name, description, title }: DocPropertiesOptions = { name: "", description: "", title: "" }) { super("wp:docPr"); diff --git a/src/file/numbering/numbering.ts b/src/file/numbering/numbering.ts index b52d6ba56c..b8eeef2feb 100644 --- a/src/file/numbering/numbering.ts +++ b/src/file/numbering/numbering.ts @@ -2,7 +2,7 @@ // https://stackoverflow.com/questions/58622437/purpose-of-abstractnum-and-numberinginstance import { AlignmentType } from "@file/paragraph"; import { IContext, IXmlableObject, XmlComponent } from "@file/xml-components"; -import { convertInchesToTwip, uniqueNumericId } from "@util/convenience-functions"; +import { convertInchesToTwip, uniqueNumericIdCreator } from "@util/convenience-functions"; import { DocumentAttributes } from "../document/document-attributes"; import { AbstractNumbering } from "./abstract-numbering"; @@ -16,6 +16,9 @@ export interface INumberingOptions { }[]; } +const abstractNumUniqueNumericId = uniqueNumericIdCreator(); +const concreteNumUniqueNumericId = uniqueNumericIdCreator(1); // Setting initial to 1 as we have numId = 1 for "default-bullet-numbering" + // // // @@ -55,7 +58,7 @@ export class Numbering extends XmlComponent { }), ); - const abstractNumbering = new AbstractNumbering(uniqueNumericId(), [ + const abstractNumbering = new AbstractNumbering(abstractNumUniqueNumericId(), [ { level: 0, format: LevelFormat.BULLET, @@ -176,7 +179,7 @@ export class Numbering extends XmlComponent { this.abstractNumberingMap.set("default-bullet-numbering", abstractNumbering); for (const con of options.config) { - this.abstractNumberingMap.set(con.reference, new AbstractNumbering(uniqueNumericId(), con.levels)); + this.abstractNumberingMap.set(con.reference, new AbstractNumbering(abstractNumUniqueNumericId(), con.levels)); this.referenceConfigMap.set(con.reference, con.levels); } } @@ -209,7 +212,7 @@ export class Numbering extends XmlComponent { const firstLevelStartNumber = referenceConfigLevels && referenceConfigLevels[0].start; const concreteNumberingSettings = { - numId: uniqueNumericId(), + numId: concreteNumUniqueNumericId(), abstractNumId: abstractNumbering.id, reference, instance, diff --git a/src/file/paragraph/links/bookmark.ts b/src/file/paragraph/links/bookmark.ts index 5a74cb1c5d..d88bfd7f46 100644 --- a/src/file/paragraph/links/bookmark.ts +++ b/src/file/paragraph/links/bookmark.ts @@ -1,10 +1,12 @@ // http://officeopenxml.com/WPbookmark.php import { XmlComponent } from "@file/xml-components"; -import { uniqueNumericId } from "@util/convenience-functions"; +import { uniqueNumericIdCreator } from "@util/convenience-functions"; import { ParagraphChild } from "../paragraph"; import { BookmarkEndAttributes, BookmarkStartAttributes } from "./bookmark-attributes"; +const uniqueNumericId = uniqueNumericIdCreator(); + export class Bookmark { public readonly start: BookmarkStart; public readonly children: readonly ParagraphChild[]; diff --git a/src/util/convenience-functions.ts b/src/util/convenience-functions.ts index 64f451e066..8dac4a929b 100644 --- a/src/util/convenience-functions.ts +++ b/src/util/convenience-functions.ts @@ -1,12 +1,14 @@ import { nanoid } from "nanoid/non-secure"; -let currentCount = 0; - // Twip - twentieths of a point export const convertMillimetersToTwip = (millimeters: number): number => Math.floor((millimeters / 25.4) * 72 * 20); export const convertInchesToTwip = (inches: number): number => Math.floor(inches * 72 * 20); -export const uniqueNumericId = (): number => ++currentCount; +export const uniqueNumericIdCreator = (initial = 0): (() => number) => { + let currentCount = initial; + + return () => ++currentCount; +}; export const uniqueId = (): string => nanoid().toLowerCase();