Add hyphenation support (#2678)

* Add hyphenation support

* Remove unneeded linebreaks

* Add documentation and fix eslint

* Add tests

---------

Co-authored-by: Dolan Miu <dolan_miu@hotmail.com>
This commit is contained in:
Bálint Táborszki
2024-11-21 11:41:31 +01:00
committed by GitHub
parent 05a3cf5b43
commit c6bb255641
8 changed files with 206 additions and 16 deletions

View File

@ -129,6 +129,74 @@ describe("Settings", () => {
});
});
it("should add autoHyphenation setting", () => {
const options = {
hyphenation: {
autoHyphenation: true,
},
};
const tree = new Formatter().format(new Settings(options));
expect(Object.keys(tree)).has.length(1);
expect(tree["w:settings"]).to.be.an("array");
expect(tree["w:settings"]).to.deep.include({
"w:autoHyphenation": {},
});
});
it("should add doNotHyphenateCaps setting", () => {
const options = {
hyphenation: {
doNotHyphenateCaps: true,
},
};
const tree = new Formatter().format(new Settings(options));
expect(Object.keys(tree)).has.length(1);
expect(tree["w:settings"]).to.be.an("array");
expect(tree["w:settings"]).to.deep.include({
"w:doNotHyphenateCaps": {},
});
});
it("should add hyphenationZone setting", () => {
const options = {
hyphenation: {
hyphenationZone: 200,
},
};
const tree = new Formatter().format(new Settings(options));
expect(Object.keys(tree)).has.length(1);
expect(tree["w:settings"]).to.be.an("array");
expect(tree["w:settings"]).to.deep.include({
"w:hyphenationZone": {
_attr: {
"w:val": 200,
},
},
});
});
it("should add consecutiveHyphenLimit setting", () => {
const options = {
hyphenation: {
consecutiveHyphenLimit: 3,
},
};
const tree = new Formatter().format(new Settings(options));
expect(Object.keys(tree)).has.length(1);
expect(tree["w:settings"]).to.be.an("array");
expect(tree["w:settings"]).to.deep.include({
"w:consecutiveHyphenLimit": {
_attr: {
"w:val": 3,
},
},
});
});
// TODO: Remove when deprecating compatibilityModeVersion
it("should add compatibility setting with legacy version", () => {
const settings = new Settings({

View File

@ -153,6 +153,18 @@ export type ISettingsOptions = {
readonly updateFields?: boolean;
readonly compatibility?: ICompatibilityOptions;
readonly defaultTabStop?: number;
readonly hyphenation?: IHyphenationOptions;
};
export type IHyphenationOptions = {
/** Specifies whether the application automatically hyphenates words as they are typed in the document. */
readonly autoHyphenation?: boolean;
/** Specifies the minimum number of characters at the beginning of a word before a hyphen can be inserted. */
readonly hyphenationZone?: number;
/** Specifies the maximum number of consecutive lines that can end with a hyphenated word. */
readonly consecutiveHyphenLimit?: number;
/** Specifies whether to hyphenate words in all capital letters. */
readonly doNotHyphenateCaps?: boolean;
};
export class Settings extends XmlComponent {
@ -204,6 +216,26 @@ export class Settings extends XmlComponent {
this.root.push(new NumberValueElement("w:defaultTabStop", options.defaultTabStop));
}
// https://c-rex.net/samples/ooxml/e1/Part4/OOXML_P4_DOCX_autoHyphenation_topic_ID0EFUMX.html
if (options.hyphenation?.autoHyphenation !== undefined) {
this.root.push(new OnOffElement("w:autoHyphenation", options.hyphenation.autoHyphenation));
}
// https://c-rex.net/samples/ooxml/e1/Part4/OOXML_P4_DOCX_hyphenationZone_topic_ID0ERI3X.html
if (options.hyphenation?.hyphenationZone !== undefined) {
this.root.push(new NumberValueElement("w:hyphenationZone", options.hyphenation.hyphenationZone));
}
// https://c-rex.net/samples/ooxml/e1/Part4/OOXML_P4_DOCX_consecutiveHyphenLim_topic_ID0EQ6RX.html
if (options.hyphenation?.consecutiveHyphenLimit !== undefined) {
this.root.push(new NumberValueElement("w:consecutiveHyphenLimit", options.hyphenation.consecutiveHyphenLimit));
}
// https://c-rex.net/samples/ooxml/e1/Part4/OOXML_P4_DOCX_doNotHyphenateCaps_topic_ID0EW4XX.html
if (options.hyphenation?.doNotHyphenateCaps !== undefined) {
this.root.push(new OnOffElement("w:doNotHyphenateCaps", options.hyphenation.doNotHyphenateCaps));
}
this.root.push(
new Compatibility({
...(options.compatibility ?? {}),