From 2bd4aacdd51ca8191cf5b4d607bb2ef8be60afac Mon Sep 17 00:00:00 2001 From: Dolan Date: Sun, 24 Dec 2023 03:37:36 +0000 Subject: [PATCH] #2388 - Add default tab stop (#2470) * #2388 - Check for undefined rather than falsey * Add default tab stop * Add back tab stop positions * Add test for default tab stop --- demo/75-tab-stops.ts | 1 + src/file/core-properties/properties.ts | 1 + src/file/file.ts | 1 + src/file/paragraph/properties.ts | 4 ++-- src/file/settings/settings.spec.ts | 17 +++++++++++++++++ src/file/settings/settings.ts | 8 +++++++- 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/demo/75-tab-stops.ts b/demo/75-tab-stops.ts index 4f8768a6c85..63600c5f0fb 100644 --- a/demo/75-tab-stops.ts +++ b/demo/75-tab-stops.ts @@ -18,6 +18,7 @@ const receiptTabStops = [ const twoTabStops = [{ type: TabStopType.RIGHT, position: TabStopPosition.MAX }]; const doc = new Document({ + defaultTabStop: 0, sections: [ { properties: {}, diff --git a/src/file/core-properties/properties.ts b/src/file/core-properties/properties.ts index b09b2d97d0c..d2628021428 100644 --- a/src/file/core-properties/properties.ts +++ b/src/file/core-properties/properties.ts @@ -39,6 +39,7 @@ export interface IPropertiesOptions { readonly compatibility?: ICompatibilityOptions; readonly customProperties?: readonly ICustomPropertyOptions[]; readonly evenAndOddHeaderAndFooters?: boolean; + readonly defaultTabStop?: number; } // diff --git a/src/file/file.ts b/src/file/file.ts index 136380be9fd..1046d874a57 100644 --- a/src/file/file.ts +++ b/src/file/file.ts @@ -77,6 +77,7 @@ export class File { evenAndOddHeaders: options.evenAndOddHeaderAndFooters ? true : false, trackRevisions: options.features?.trackRevisions, updateFields: options.features?.updateFields, + defaultTabStop: options.defaultTabStop, }); this.media = new Media(); diff --git a/src/file/paragraph/properties.ts b/src/file/paragraph/properties.ts index 87b17faa996..c427717115c 100644 --- a/src/file/paragraph/properties.ts +++ b/src/file/paragraph/properties.ts @@ -157,9 +157,9 @@ export class ParagraphProperties extends IgnoreIfEmptyXmlComponent { * Ensure there is only one w:tabs tag with multiple w:tab */ const tabDefinitions: readonly TabStopDefinition[] = [ - ...(options.rightTabStop ? [{ type: TabStopType.RIGHT, position: options.rightTabStop }] : []), + ...(options.rightTabStop !== undefined ? [{ type: TabStopType.RIGHT, position: options.rightTabStop }] : []), ...(options.tabStops ? options.tabStops : []), - ...(options.leftTabStop ? [{ type: TabStopType.LEFT, position: options.leftTabStop }] : []), + ...(options.leftTabStop !== undefined ? [{ type: TabStopType.LEFT, position: options.leftTabStop }] : []), ]; if (tabDefinitions.length > 0) { diff --git a/src/file/settings/settings.spec.ts b/src/file/settings/settings.spec.ts index 13666f4a840..4b647684f51 100644 --- a/src/file/settings/settings.spec.ts +++ b/src/file/settings/settings.spec.ts @@ -112,6 +112,23 @@ describe("Settings", () => { }); }); + it("should add defaultTabStop setting with version", () => { + const settings = new Settings({ + defaultTabStop: 100, + }); + + const tree = new Formatter().format(settings); + expect(Object.keys(tree)).has.length(1); + expect(tree["w:settings"]).to.be.an("array"); + expect(tree["w:settings"]).to.deep.include({ + "w:defaultTabStop": { + _attr: { + "w:val": 100, + }, + }, + }); + }); + // TODO: Remove when deprecating compatibilityModeVersion it("should add compatibility setting with legacy version", () => { const settings = new Settings({ diff --git a/src/file/settings/settings.ts b/src/file/settings/settings.ts index 76fe4c51fb7..ad89de7b497 100644 --- a/src/file/settings/settings.ts +++ b/src/file/settings/settings.ts @@ -1,4 +1,4 @@ -import { OnOffElement, XmlAttributeComponent, XmlComponent } from "@file/xml-components"; +import { NumberValueElement, OnOffElement, XmlAttributeComponent, XmlComponent } from "@file/xml-components"; import { Compatibility, ICompatibilityOptions } from "./compatibility"; @@ -152,6 +152,7 @@ export interface ISettingsOptions { readonly trackRevisions?: boolean; readonly updateFields?: boolean; readonly compatibility?: ICompatibilityOptions; + readonly defaultTabStop?: number; } export class Settings extends XmlComponent { @@ -198,6 +199,11 @@ export class Settings extends XmlComponent { this.root.push(new OnOffElement("w:updateFields", options.updateFields)); } + // https://c-rex.net/samples/ooxml/e1/Part4/OOXML_P4_DOCX_defaultTabStop_topic_ID0EIXSX.html + if (options.defaultTabStop !== undefined) { + this.root.push(new NumberValueElement("w:defaultTabStop", options.defaultTabStop)); + } + this.root.push( new Compatibility({ ...(options.compatibility ?? {}),