From fc6820d41065b1e18061c96c42279257b9074242 Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 15:42:08 +0100 Subject: [PATCH 01/99] Version 0.13.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 68b0f2b..9e5e4ad 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "greek-conversion", "author": "Antoine Boquet", "license": "agpl-3.0", - "version": "0.12.3", + "version": "0.13.0", "description": "A small library to convert a polytonic greek string from/into various representations.", "keywords": [ "greek", From b144475a61c31e5b0d33f733be49bcadeac06ea8 Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 16:33:15 +0100 Subject: [PATCH 02/99] Update dependencies --- package-lock.json | 96 +++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index 739ee0e..4eb98b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "greek-conversion", - "version": "0.12.3", + "version": "0.13.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "greek-conversion", - "version": "0.12.3", + "version": "0.13.0", "license": "agpl-3.0", "devDependencies": { "@parcel/packager-ts": "^2.11.0", @@ -2813,9 +2813,9 @@ } }, "node_modules/@swc/core": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.4.tgz", - "integrity": "sha512-P88AHGWM8xPY3Tjj5360V6vqKCS5UfsyffPJVnr7BKSr45rlG4/pjEGGmFYQjg6ztgPyrGLYz1jSyzajTqTVIA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.5.tgz", + "integrity": "sha512-4/JGkG4b1Z/QwCGgx+Ub46MlzrsZvBk5JSkxm9PcZ4bSX81c+4Y94Xm3iLp5Ka8NxzS5rD4mJSpcYuN3Tw0ceg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -2830,16 +2830,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.4", - "@swc/core-darwin-x64": "1.4.4", - "@swc/core-linux-arm-gnueabihf": "1.4.4", - "@swc/core-linux-arm64-gnu": "1.4.4", - "@swc/core-linux-arm64-musl": "1.4.4", - "@swc/core-linux-x64-gnu": "1.4.4", - "@swc/core-linux-x64-musl": "1.4.4", - "@swc/core-win32-arm64-msvc": "1.4.4", - "@swc/core-win32-ia32-msvc": "1.4.4", - "@swc/core-win32-x64-msvc": "1.4.4" + "@swc/core-darwin-arm64": "1.4.5", + "@swc/core-darwin-x64": "1.4.5", + "@swc/core-linux-arm-gnueabihf": "1.4.5", + "@swc/core-linux-arm64-gnu": "1.4.5", + "@swc/core-linux-arm64-musl": "1.4.5", + "@swc/core-linux-x64-gnu": "1.4.5", + "@swc/core-linux-x64-musl": "1.4.5", + "@swc/core-win32-arm64-msvc": "1.4.5", + "@swc/core-win32-ia32-msvc": "1.4.5", + "@swc/core-win32-x64-msvc": "1.4.5" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -2851,9 +2851,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.4.tgz", - "integrity": "sha512-goSHS8yvDgha93RHIV2Vn50neYasqbc4K1g/nKOV6T8kiKVv4w/rmqNJu9Aa0mPGVJtjcr0NvX6bBwE0T4HIzg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.5.tgz", + "integrity": "sha512-toMSkbByHNfGXESyY1aiq5L3KutgijrNWB/THgdHIA1aIbwtrgMdFQfxpSE+INuuvWYi/Fxarv86EnU7ewbI0Q==", "cpu": [ "arm64" ], @@ -2867,9 +2867,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.4.tgz", - "integrity": "sha512-PLfgL355qsl5c5kUPsFGITgVXoaqjp9sCd0Y5Z5uN7RtSOvwIX28e23eCxj02dOr7OBr8sq6qBlEMDV03T24Iw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.5.tgz", + "integrity": "sha512-LN8cbnmb4Gav8UcbBc+L/DEthmzCWZz22rQr6fIEHMN+f0d71fuKnV0ca0hoKbpZn33dlzUmXQE53HRjlRUQbw==", "cpu": [ "x64" ], @@ -2883,9 +2883,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.4.tgz", - "integrity": "sha512-BVEZVOGnaZvEcHm//KyYzhte46vdF67wLVtmQEXPAlrkRgZ3b/JSySeLXqeocAcOANWb1/SPHlEmPK5azP+JvQ==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.5.tgz", + "integrity": "sha512-suRFkhBWmOQxlM4frpos1uqjmHfaEI8FuJ0LL5+yRE7IunNDeQJBKujGZt6taeuxo1KqC0N0Ajr8IluN2wrKpA==", "cpu": [ "arm" ], @@ -2899,9 +2899,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.4.tgz", - "integrity": "sha512-ZbOJfVbCjVMKdfvvJDOTpa3tGqU6tfxng1CDjA62RUcqa7sRbovrjSiw6mq5/4EoOF4zK8CtPIG+TlxKPapnuw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.5.tgz", + "integrity": "sha512-mLKxasQArDGmR6k9c0tkPVUdoo8VfUecocMG1Mx9NYvpidJNaZ3xq9nYM77v7uq1fQqrs/59DM1fJTNRWvv/UQ==", "cpu": [ "arm64" ], @@ -2915,9 +2915,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.4.tgz", - "integrity": "sha512-+Gjo1W4tY/4kgEe5h22iuCWkpKcPMccXwYaSLNvgBCBQADB0zKFfF0lNf7y6U+81NFEjhRsdwXMsRGZtgTpUrg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.5.tgz", + "integrity": "sha512-pgKuyRP7S29U/HMDTx+x8dFcklWxwB9cHFNCNWSE6bS4vHR93jc4quwPX9OEQX5CVHxm+c8+xof043I4OGkAXw==", "cpu": [ "arm64" ], @@ -2931,9 +2931,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.4.tgz", - "integrity": "sha512-PR/VbGm0LEkhpm5qClovZWhE/jYoQSyIeyPh8XY39uUI1u2yEfuz5UCW2sJJIWOvNiAfu7+TjW+9H/I7zBBDJA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.5.tgz", + "integrity": "sha512-srR+YN86Oerzoghd0DPCzTbTp08feeJPSr9kkNdmtQWENOa4l/9cJV3+XY6vviw0sEjezPmYnc3SwRxJRaxvEw==", "cpu": [ "x64" ], @@ -2947,9 +2947,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.4.tgz", - "integrity": "sha512-poT9zub4CyVcH1cxwGdrGiZD3urfOaYs/Kd52ve3ymPPeQZq7qQwKqAB/9NxoSiJDaSzJv5OwTEfgaBYCyw0iw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.5.tgz", + "integrity": "sha512-aSf41LZtDeG5VXI4RCnzcu0UInPyNm3ip8Kw+sCK+sSqW9o7DgBkyqqbip3RZq84fNUHBQQQQdKXetltsyRRqw==", "cpu": [ "x64" ], @@ -2963,9 +2963,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.4.tgz", - "integrity": "sha512-29V5/fBd6XXFb7J/ri9ZeSS/GTqXfSWa3BiE0zTNbASpQbEXf+YPYiAtO6c1HqNyQobKB9ni+w7sa8KkAGhHXw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.5.tgz", + "integrity": "sha512-vU3k8JwRUlTkJMfJQY9E4VvLrsIFOpfhnvbuXB84Amo1cJsz+bYQcC6RSvY7qpaDzDKFdUGbJco4uZTRoRf7Mg==", "cpu": [ "arm64" ], @@ -2979,9 +2979,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.4.tgz", - "integrity": "sha512-2lKEGEjpBOq0z4Nk0tFP9wxVwxgz7FonmjCkzJ95GBb5KNvMrgQQrGNGX6L0hoBo/a1kE752I6V5pOaMyIq5xQ==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.5.tgz", + "integrity": "sha512-856YRh3frRK2XbrSjDOFBgoAqWJLNRkaEtfGzXfeEoyJlOz0BFsSJHxKlHAFkxRfHe2li9DJRUQFTEhXn4OUWw==", "cpu": [ "ia32" ], @@ -2995,9 +2995,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.4.tgz", - "integrity": "sha512-xuN0oJhAewga8jNJkT5Wx25RPVnIEMZCYf4irqA5jiK6GckOdcXB8jvEJhggOxnJSW8RDsAtY5q+zw5kNkU+eA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.5.tgz", + "integrity": "sha512-j1+kV7jmWY1+NbXAvxAEW165781yLXVZKLcoXIZKmw18EatqMF6w8acg1gDG8C+Iw5aWLkRZVS4pijSh7+DtCQ==", "cpu": [ "x64" ], @@ -3986,9 +3986,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.692", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz", - "integrity": "sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==", + "version": "1.4.693", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz", + "integrity": "sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==", "dev": true }, "node_modules/emittery": { From dafc8e31efaf4814ba4cbd08d6261904ed33d51d Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 16:33:53 +0100 Subject: [PATCH 03/99] Add transliteration options `beta_v`, `eta_i`, `phi_f` --- src/Mapping.ts | 64 ++++++++++++++++++++++++++++++++++------------- src/interfaces.ts | 3 +++ 2 files changed, 49 insertions(+), 18 deletions(-) diff --git a/src/Mapping.ts b/src/Mapping.ts index 2045d37..ab24bc8 100644 --- a/src/Mapping.ts +++ b/src/Mapping.ts @@ -482,25 +482,25 @@ export class Mapping { } } - const { useCxOverMacron, xi_ks, chi_kh, upsilon_y, lunatesigma_s } = - this.#transliterationStyle ?? {}; - - if (useCxOverMacron) { - this.CAPITAL_ETA.tr = 'Ê'; - this.SMALL_ETA.tr = 'ê'; - - this.CAPITAL_OMEGA.tr = 'Ô'; - this.SMALL_OMEGA.tr = 'ô'; - - if (this.CAPITAL_STIGMA?.tr) { - this.CAPITAL_STIGMA.tr = 'Ĉ'; - this.SMALL_STIGMA.tr = 'ĉ'; - } + const { + useCxOverMacron, + beta_v, + eta_i, + xi_ks, + chi_kh, + phi_f, + upsilon_y, + lunatesigma_s + } = this.#transliterationStyle ?? {}; + + if (beta_v) { + this.CAPITAL_BETA.tr = 'V'; + this.SMALL_BETA.tr = 'v'; + } - if (this.CAPITAL_SAMPI?.tr) { - this.CAPITAL_SAMPI.tr = 'Ŝ'; - this.SMALL_SAMPI.tr = 'ŝ'; - } + if (eta_i) { + this.CAPITAL_ETA.tr = 'Ī'; + this.SMALL_ETA.tr = 'ī'; } if (xi_ks) { @@ -513,6 +513,11 @@ export class Mapping { this.SMALL_CHI.tr = 'kh'; } + if (phi_f) { + this.CAPITAL_PHI.tr = 'F'; + this.SMALL_PHI.tr = 'f'; + } + if (upsilon_y) { this.CAPITAL_UPSILON.tr = 'Y'; this.SMALL_UPSILON.tr = 'y'; @@ -529,6 +534,29 @@ export class Mapping { } } + if (useCxOverMacron) { + if (eta_i) { + this.CAPITAL_ETA.tr = 'Î'; + this.SMALL_ETA.tr = 'î'; + } else { + this.CAPITAL_ETA.tr = 'Ê'; + this.SMALL_ETA.tr = 'ê'; + } + + this.CAPITAL_OMEGA.tr = 'Ô'; + this.SMALL_OMEGA.tr = 'ô'; + + if (this.CAPITAL_STIGMA?.tr) { + this.CAPITAL_STIGMA.tr = 'Ĉ'; + this.SMALL_STIGMA.tr = 'ĉ'; + } + + if (this.CAPITAL_SAMPI?.tr) { + this.CAPITAL_SAMPI.tr = 'Ŝ'; + this.SMALL_SAMPI.tr = 'ŝ'; + } + } + if (this.#isUpperCase) { for (const [k, v] of Object.entries(this)) { if (k.startsWith('CAPITAL') && v.tr?.length > 1 /* Th, Ph, etc */) { diff --git a/src/interfaces.ts b/src/interfaces.ts index a2ae3d2..2850b3e 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -33,8 +33,11 @@ export interface IMappingProperty { export interface ITransliterationStyle { useCxOverMacron?: boolean; + beta_v?: boolean; + eta_i?: boolean; xi_ks?: boolean; rho_rh?: boolean; + phi_f?: boolean; chi_kh?: boolean; upsilon_y?: boolean; lunatesigma_s?: boolean; From 15fc791f938a837bdddc8a0fe668cc59c8fa4163 Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 16:34:13 +0100 Subject: [PATCH 04/99] Typo --- src/presets.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/presets.ts b/src/presets.ts index be6a969..dba70b9 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -3,16 +3,16 @@ import { IConversionOptions, MixedPreset } from './interfaces'; const ALA_LC_OPTIONS = (): IConversionOptions => ({ removeDiacritics: true, - useAdditionalChars: [ - AdditionalChar.DIGAMMA, - AdditionalChar.ARCHAIC_KOPPA, - AdditionalChar.LUNATE_SIGMA - ], setTransliterationStyle: { rho_rh: true, upsilon_y: true, lunatesigma_s: true - } + }, + useAdditionalChars: [ + AdditionalChar.DIGAMMA, + AdditionalChar.ARCHAIC_KOPPA, + AdditionalChar.LUNATE_SIGMA + ] }); const BNF_OPTIONS = (): IConversionOptions => ({ From c8b08a955dbdc872f62f5b8a5020adb797f8c1f7 Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 16:35:14 +0100 Subject: [PATCH 05/99] Add `ISO` preset --- src/enums.ts | 1 + src/presets.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/enums.ts b/src/enums.ts index 7810fb1..38bfffa 100644 --- a/src/enums.ts +++ b/src/enums.ts @@ -19,6 +19,7 @@ export enum KeyType { export enum Preset { ALA_LC, BNF, + ISO, MODERN_BC, SBL //TLG diff --git a/src/presets.ts b/src/presets.ts index dba70b9..5410d98 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -27,6 +27,22 @@ const BNF_OPTIONS = (): IConversionOptions => ({ ] }); +const ISO_OPTIONS = (): IConversionOptions => ({ + removeDiacritics: true, + setTransliterationStyle: { + beta_v: true, + eta_i: true, + phi_f: true, + upsilon_y: true, + lunatesigma_s: true + }, + useAdditionalChars: [ + AdditionalChar.DIGAMMA, + AdditionalChar.YOT, + AdditionalChar.LUNATE_SIGMA + ] +}); + const MODERN_BC_OPTIONS = (): IConversionOptions => ({ removeDiacritics: false, useAdditionalChars: AdditionalChar.ALL @@ -65,6 +81,10 @@ export function applyPreset(preset: Preset | MixedPreset): IConversionOptions { options = BNF_OPTIONS(); break; + case Preset.ISO: + options = ISO_OPTIONS(); + break; + case Preset.MODERN_BC: options = MODERN_BC_OPTIONS(); break; From cb68f6bea0660f1fd08ecca2d3feee009a0a6a82 Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 17:23:33 +0100 Subject: [PATCH 06/99] Fix `ISO` preset --- src/presets.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/presets.ts b/src/presets.ts index 5410d98..912a251 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -28,7 +28,7 @@ const BNF_OPTIONS = (): IConversionOptions => ({ }); const ISO_OPTIONS = (): IConversionOptions => ({ - removeDiacritics: true, + removeDiacritics: false, setTransliterationStyle: { beta_v: true, eta_i: true, From e0e55dac648443f72b8b5e3fb18bbb31715c186a Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 17:48:15 +0100 Subject: [PATCH 07/99] Add coronis style/enum --- src/enums.ts | 6 ++++++ src/interfaces.ts | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/enums.ts b/src/enums.ts index 38bfffa..a7d2e54 100644 --- a/src/enums.ts +++ b/src/enums.ts @@ -10,6 +10,12 @@ export enum AdditionalChar { //SAN } +export enum Coronis { + PSILI, + APOSTROPHE, + NO +} + export enum KeyType { GREEK, BETA_CODE, diff --git a/src/interfaces.ts b/src/interfaces.ts index 2850b3e..d712451 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -1,4 +1,4 @@ -import { AdditionalChar, Preset } from './enums'; +import { AdditionalChar, Coronis, Preset } from './enums'; export interface IConversionOptions { removeDiacritics?: boolean; @@ -32,6 +32,7 @@ export interface IMappingProperty { } export interface ITransliterationStyle { + setCoronisStyle?: Coronis; useCxOverMacron?: boolean; beta_v?: boolean; eta_i?: boolean; From cecc1e7325955ffe2bc30367dcb3fb435a76b7bf Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 17:48:34 +0100 Subject: [PATCH 08/99] Add `setCoronisStyle` to the `ISO` preset --- src/presets.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/presets.ts b/src/presets.ts index 912a251..33c27b0 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -1,4 +1,4 @@ -import { AdditionalChar, Preset } from './enums'; +import { AdditionalChar, Coronis, Preset } from './enums'; import { IConversionOptions, MixedPreset } from './interfaces'; const ALA_LC_OPTIONS = (): IConversionOptions => ({ @@ -30,6 +30,7 @@ const BNF_OPTIONS = (): IConversionOptions => ({ const ISO_OPTIONS = (): IConversionOptions => ({ removeDiacritics: false, setTransliterationStyle: { + setCoronisStyle: Coronis.APOSTROPHE, beta_v: true, eta_i: true, phi_f: true, From 7ee15d6d6d47be30153bf1f8660f1f0ded773ed7 Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 18:09:53 +0100 Subject: [PATCH 09/99] Update tests --- tests/toBetaCode.test.ts | 22 ++++++++++ tests/toGreek.test.ts | 22 ++++++++++ tests/toTransliteration.test.ts | 78 +++++++++++++++++++++++++++++++-- 3 files changed, 119 insertions(+), 3 deletions(-) diff --git a/tests/toBetaCode.test.ts b/tests/toBetaCode.test.ts index e353451..250bff8 100644 --- a/tests/toBetaCode.test.ts +++ b/tests/toBetaCode.test.ts @@ -174,6 +174,28 @@ describe('From transliteration to beta code', () => { ${'Xenophỗn'} | ${'Cenofw=n'} `('Using circumflex on long vowels', ({ str, expected }) => { expect(toBetaCode(str, KeyType.TRANSLITERATION, { setTransliterationStyle: { useCxOverMacron: true } })).toBe(expected) }) + test('Applying beta_v', () => { + expect(toBetaCode('várvaros', KeyType.TRANSLITERATION, { setTransliterationStyle: { beta_v: true } })) + .toBe('ba/rbaros') + }) + + test('Applying eta_i', () => { + expect(toBetaCode('hīdonī́', KeyType.TRANSLITERATION, { setTransliterationStyle: { eta_i: true } })) + .toBe('h(donh/') + }) + + test('Applying eta_i', () => { + expect(toBetaCode('hîdonî́', KeyType.TRANSLITERATION, { setTransliterationStyle: { useCxOverMacron: true, eta_i: true } })) + .toBe('h(donh/') + }) + + test.each` + str | expected + ${'fantasía'} | ${'fantasi/a'} + ${'Fainṓ'} | ${'Fainw/'} + ${'FILOSOFIA'} | ${'FILOSOFIA'} + `('Applying phi_f', ({ str, expected }) => { expect(toBetaCode(str, KeyType.TRANSLITERATION, { setTransliterationStyle: { phi_f: true } })).toBe(expected) }) + test.each` str | expected ${'Ksenophȭn'} | ${'Cenofw=n'} diff --git a/tests/toGreek.test.ts b/tests/toGreek.test.ts index 4570e3a..b88bf5b 100644 --- a/tests/toGreek.test.ts +++ b/tests/toGreek.test.ts @@ -220,6 +220,28 @@ describe('From transliteration to greek', () => { ${'mármaros'} | ${'μάρμαρος'} `('Testing rho rules', ({ str, expected }) => { expect(toGreek(str, KeyType.TRANSLITERATION)).toBe(expected) }) + test('Applying beta_v', () => { + expect(toGreek('várvaros', KeyType.TRANSLITERATION, { setTransliterationStyle: { beta_v: true } })) + .toBe('βάρ\u03D0αρος') + }) + + test('Applying eta_i', () => { + expect(toGreek('hīdonī́', KeyType.TRANSLITERATION, { setTransliterationStyle: { eta_i: true } })) + .toBe('ἡδονή') + }) + + test('Applying eta_i', () => { + expect(toGreek('hîdonî́', KeyType.TRANSLITERATION, { setTransliterationStyle: { useCxOverMacron: true, eta_i: true } })) + .toBe('ἡδονή') + }) + + test.each` + str | expected + ${'fantasía'} | ${'φαντασία'} + ${'Fainṓ'} | ${'Φαινώ'} + ${'FILOSOFIA'} | ${'ΦΙΛΟΣΟΦΙΑ'} + `('Applying phi_f', ({ str, expected }) => { expect(toGreek(str, KeyType.TRANSLITERATION, { setTransliterationStyle: { phi_f: true } })).toBe(expected) }) + test.each` str | expected ${'Ksenophȭn'} | ${'Ξενοφῶν'} diff --git a/tests/toTransliteration.test.ts b/tests/toTransliteration.test.ts index f445458..590e75d 100644 --- a/tests/toTransliteration.test.ts +++ b/tests/toTransliteration.test.ts @@ -86,6 +86,36 @@ describe('From beta code to transliteration', () => { ${'ma/rmaros'} | ${'mármaros'} `('Testing rho rules, applying rho_rh', ({ str, expected }) => expect(toTransliteration(str, KeyType.BETA_CODE, { setTransliterationStyle: { rho_rh: true } })).toBe(expected)) + // Applying beta_v + + test('Applying beta_v', () => { + expect(toTransliteration('ba/rbaros', KeyType.BETA_CODE, { setTransliterationStyle: { beta_v: true } })) + .toBe('várvaros') + }) + + // Applying eta_i + + test('Applying eta_i', () => { + expect(toTransliteration('h(donh/', KeyType.BETA_CODE, { setTransliterationStyle: { eta_i: true } })) + .toBe('hīdonī́') + }) + + // Applying eta_i, using circumflex + + test('Applying eta_i', () => { + expect(toTransliteration('h(donh/', KeyType.BETA_CODE, { setTransliterationStyle: { useCxOverMacron: true, eta_i: true } })) + .toBe('hîdonî́') + }) + + // Applying phi_f + + test.each` + str | expected + ${'fantasi/a'} | ${'fantasía'} + ${'Fainw/'} | ${'Fainṓ'} + ${'FILOSOFIA'} | ${'FILOSOFIA'} + `('Applying phi_f', ({ str, expected }) => { expect(toTransliteration(str, KeyType.BETA_CODE, { setTransliterationStyle: { phi_f: true } })).toBe(expected) }) + // Applying upsilon_y test.each` @@ -129,7 +159,7 @@ describe('From beta code to transliteration', () => { // Applying various diacritics order - // v0.13 - broken orders: `w|=(`, `w=(|`, `w=|(`. + // v0.14 - broken orders: `w|=(`, `w=(|`, `w=|(`. /*test.each` str | expected ${'w(|='} | ${'ᾧ'} @@ -268,6 +298,36 @@ describe('From greek to transliteration', () => { ${plato.gr} | ${plato.trCrx} `('Using circumflex on long vowels', ({ str, expected }) => expect(toTransliteration(str, KeyType.GREEK, { setTransliterationStyle: { useCxOverMacron: true } })).toBe(expected)) + // Applying beta_v + + test('Applying beta_v', () => { + expect(toTransliteration('βάρ\u03D0αρος', KeyType.GREEK, { setTransliterationStyle: { beta_v: true } })) + .toBe('várvaros') + }) + + // Applying eta_i + + test('Applying eta_i', () => { + expect(toTransliteration('ἡδονή', KeyType.GREEK, { setTransliterationStyle: { eta_i: true } })) + .toBe('hīdonī́') + }) + + // Applying eta_i, using circumflex + + test('Applying eta_i', () => { + expect(toTransliteration('ἡδονή', KeyType.GREEK, { setTransliterationStyle: { useCxOverMacron: true, eta_i: true } })) + .toBe('hîdonî́') + }) + + // Applying phi_f + + test.each` + str | expected + ${'φαντασία'} | ${'fantasía'} + ${'Φαινώ'} | ${'Fainṓ'} + ${'ΦΙΛΟΣΟΦΙΑ'} | ${'FILOSOFIA'} + `('Applying phi_f', ({ str, expected }) => { expect(toTransliteration(str, KeyType.GREEK, { setTransliterationStyle: { phi_f: true } })).toBe(expected) }) + // Applying xi_ks / chi_kh test.each` @@ -331,7 +391,7 @@ describe('From greek to transliteration', () => { expect(toTransliteration('Ῥόδος\nῬόδος\tῬόδος Ῥόδος', KeyType.GREEK)).toBe('Rhódos\nRhódos\tRhódos Rhódos') }) - // Applying preset ALA_LC (the following sentences are given by the ALA-LC romanization table). + // Applying preset ALA_LC (the following sentences are given by the ALA-LC romanization table) test.each` str | expected @@ -348,7 +408,7 @@ describe('From greek to transliteration', () => { ${'ὑϊκὸν πάσχειν'} | ${'hyikon paschein'} ${'εἶπε πρὸς τὸν ἄνδρα τὸν ἑωυτῆς'} | ${'eipe pros ton andra ton heōutēs'} ${'τί τοῦδ’ ἂν εὕρημ’ ηὗρον εὐτυχέστερον;'} | ${'ti toud’ an heurēm’ hēuron eutychesteron?'} - ${'Τοῦ Κατὰ πασῶν αἱρέσεων ἐλέγχου βιβλίον αʹ'} | ${'Tou Kata pasōn haireseōn elenchou biblion 1'} + ${'Τοῦ Κατὰ πασῶν αἱρέσεων ἐλέγχου βιβλίον αʹ'} | ${'Tou Kata pasōn haireseōn elenchou biblion 1'} ${'καλὸν κἀγαθόν'} | ${'kalon kagathon'} ${'ᾤχοντο θοἰμάτιον λαβόντες μου'} | ${'ōchonto thoimation labontes mou'} ${'Περὶ ἰλίγγων'} | ${'Peri ilingōn'} @@ -360,6 +420,18 @@ describe('From greek to transliteration', () => { ${'Πάτροϙλος'} | ${'Patroḳlos'} `('Applying preset ALA_LC', ({ str, expected }) => expect(toTransliteration(str, KeyType.GREEK, Preset.ALA_LC)).toBe(expected)) + + // Applying preset ISO (-> ISO 843 [1997]) + + test.each` + str | expected + ${'Ἡσιόδου τοῦ Ἀσκραίου Ἔργα καὶ ἡμέραι'} | ${'Hīsiódou toũ Askraíou Érga kaì hīmérai'} + ${'Ἡ τοῦ Ὁμήρου Ἰλιάς'} | ${'Hī toũ Homī́rou Iliás'} + ${'Φίληβος ἢ Περὶ ἡδονῆς'} | ${'Fílīvos ī̀ Perì hīdonī̃s'} + ${'Ἀγνώστῳ θεῷ'} | ${'Agnṓstō̧ theō̧̃'} + ${'κεῖται παρ’ Ἅιδῃ'} | ${'keĩtai par’ Háidī̧'} + `('Applying preset ISO (-> ISO 843 [1997])', ({ str, expected }) => expect(toTransliteration(str, KeyType.GREEK, Preset.ISO)).toBe(expected)) + }) describe('Self conversion', () => { From 8fad99ad4c85051cd44c06465a285da649df871a Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Wed, 6 Mar 2024 18:17:23 +0100 Subject: [PATCH 10/99] Typo --- src/interfaces.ts | 2 +- src/presets.ts | 2 +- src/toTransliteration.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/interfaces.ts b/src/interfaces.ts index d712451..66fdebf 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -15,7 +15,7 @@ export interface IInternalConversionOptions extends IConversionOptions { export type MixedPreset = [Preset, IConversionOptions]; -// v0.13 +// v0.14 /*export interface IBetaCodeStyle { useTLGStyle?: boolean; }*/ diff --git a/src/presets.ts b/src/presets.ts index 33c27b0..1d26db1 100644 --- a/src/presets.ts +++ b/src/presets.ts @@ -94,7 +94,7 @@ export function applyPreset(preset: Preset | MixedPreset): IConversionOptions { options = SBL_OPTIONS(); break; - // v0.13 + // v0.14 /*case Preset.TLG: options = TLG_OPTIONS(); break;*/ diff --git a/src/toTransliteration.ts b/src/toTransliteration.ts index 46d41db..35c3a77 100644 --- a/src/toTransliteration.ts +++ b/src/toTransliteration.ts @@ -189,7 +189,7 @@ function bcConvertBreathings( match.toUpperCase() === match ? 'RRH' : 'rrh' ) .replace(/(?<=\p{P}|\\s|^)(r)(?!h)/gimu, (match) => - // @fixme(v0.13): case should be checked against the current word. + // @fixme(v0.14): case should be checked against the current word. isUpperCase ? match + 'H' : match + 'h' ); } @@ -220,7 +220,7 @@ function bcFlagRoughBreathings( return betaCodeStr .replace(/([aehiouw]{1,2})\(/gi, (match, vowelsGroup) => { - // @fixme(v0.13): case should be checked against the current word too. + // @fixme(v0.14): case should be checked against the current word too. if (isUpperCase) return '$$' + vowelsGroup; else { return vowelsGroup.charAt(0).toUpperCase() === vowelsGroup.charAt(0) @@ -282,7 +282,7 @@ function grConvertBreathings( .normalize('NFD') .replace(reInitialSmooth, '$1') .replace(reInitialRough, (match, vowelsGroup) => { - // @fixme(v0.13): case should be checked against the current word too. + // @fixme(v0.14): case should be checked against the current word too. if (isUpperCase) return 'H' + vowelsGroup; else { return vowelsGroup.charAt(0).toUpperCase() === vowelsGroup.charAt(0) From 0f98c5cd15470c3e4ab77bf3b1ee3859752307a2 Mon Sep 17 00:00:00 2001 From: antoineboquet Date: Thu, 7 Mar 2024 10:31:00 +0100 Subject: [PATCH 11/99] Add more transliteration options --- examples/playground.html | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/examples/playground.html b/examples/playground.html index f4b84cb..61fba96 100644 --- a/examples/playground.html +++ b/examples/playground.html @@ -236,7 +236,7 @@

Playground example

- +
Common options + + + + + +
+ +
+ Beta code style + +
+
Transliteration style + + - - + +
-
Conversion results will be displayed here...
+

 
 
 

From 0d800f0e994be3a27119575b5332b72cb30e86f7 Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 18:18:27 +0100
Subject: [PATCH 60/99] Self conversion: fix case checking for `xi_ks` &
 `chi_kh`

---
 src/toTransliteration.ts | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/toTransliteration.ts b/src/toTransliteration.ts
index a8bec18..b03df1d 100644
--- a/src/toTransliteration.ts
+++ b/src/toTransliteration.ts
@@ -73,16 +73,16 @@ export function toTransliteration(
       }
 
       if (xi_ks) {
-        str = str.replace(/x/gi, (match) => {
+        str = str.replace(/x/gi, (m) => {
           if (options.isUpperCase) return 'KS';
-          else return match.charAt(0).toUpperCase() === match ? 'Ks' : 'ks';
+          else return m.charAt(0).toUpperCase() === m.charAt(0) ? 'Ks' : 'ks';
         });
       }
 
       if (chi_kh) {
-        str = str.replace(/ch/gi, (match) => {
+        str = str.replace(/ch/gi, (m) => {
           if (options.isUpperCase) return 'KH';
-          else return match.charAt(0).toUpperCase() === match ? 'Kh' : 'kh';
+          else return m.charAt(0).toUpperCase() === m.charAt(0) ? 'Kh' : 'kh';
         });
       }
 

From 524eb19490de3af2fbd4512d5c65c83192d34972 Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 19:24:13 +0100
Subject: [PATCH 61/99] Self conversion: add `beta_v`, `eta_i` & `phi_f`

---
 src/toTransliteration.ts | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/toTransliteration.ts b/src/toTransliteration.ts
index b03df1d..da8dc15 100644
--- a/src/toTransliteration.ts
+++ b/src/toTransliteration.ts
@@ -38,7 +38,10 @@ export function toTransliteration(
   const {
     setCoronisStyle,
     useCxOverMacron,
+    beta_v,
+    eta_i,
     xi_ks,
+    phi_f,
     chi_kh,
     rho_rh,
     upsilon_y,
@@ -72,6 +75,18 @@ export function toTransliteration(
         str = str.normalize('NFD').replace(re, `$1${CIRCUMFLEX}`).normalize();
       }
 
+      if (beta_v) {
+        str = str.replace(/b/gi, (match) =>
+          match.toUpperCase() === match ? 'V' : 'v'
+        );
+      }
+
+      if (eta_i) {
+        str = str.replace(/ē/gi, (match) =>
+          match.toUpperCase() === match ? 'Ī' : 'ī'
+        );
+      }
+
       if (xi_ks) {
         str = str.replace(/x/gi, (m) => {
           if (options.isUpperCase) return 'KS';
@@ -79,6 +94,12 @@ export function toTransliteration(
         });
       }
 
+      if (phi_f) {
+        str = str.replace(/ph/gi, (m) =>
+          m.charAt(0).toUpperCase() === m.charAt(0) ? 'F' : 'f'
+        );
+      }
+
       if (chi_kh) {
         str = str.replace(/ch/gi, (m) => {
           if (options.isUpperCase) return 'KH';

From 89da5dc76b5f32671eb01fa449a68d6da9afd842 Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 19:50:32 +0100
Subject: [PATCH 62/99] Update tests

---
 tests/toGreek.test.ts | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/tests/toGreek.test.ts b/tests/toGreek.test.ts
index 8d10ee9..257b147 100644
--- a/tests/toGreek.test.ts
+++ b/tests/toGreek.test.ts
@@ -4,6 +4,7 @@ import { AdditionalChar, Coronis, KeyType, Preset, toGreek } from '../src/index'
  * Special characters:
  *   - \u03D0 = Greek Beta Symbol
  *   - \u03F2 = Greek Lunate Sigma Symbol
+ *   - \u037E = Greek Question Mark
  */
 
 const aristotle = {
@@ -20,7 +21,7 @@ const thucydides = {
 const plato = {
   tr: 'Chalepón gé se elénxai, ō̃ Sṓkrates; all\' ouchì ka̓̀n paĩs se elénxeien hóti ouk alēthē̃ légeis?',
   trCx: 'Chalepón gé se elénxai, ỗ Sốkrates; all\' ouchì ka̓̀n paĩs se elénxeien hóti ouk alêthễ légeis?',
-  gr: 'Χαλεπόν γέ σε ἐλέγξαι, ὦ Σώκρατες· ἀλλ\' οὐχὶ κἂν παῖς σε ἐλέγξειεν ὅτι οὐκ ἀληθῆ λέγεις\u037E'
+  gr: 'Χαλεπόν γέ σε ἐλέγξαι, ὦ Σώκρατες· ἀλλ\' οὐχὶ κἂν παῖς σε ἐλέγξειεν ὅτι οὐκ ἀληθῆ λέγεις;'
 }
 
 describe('From beta code to greek', () => {
@@ -392,6 +393,20 @@ describe('Self conversion', () => {
     expect(toGreek('βάρ\u03D0αρος', KeyType.GREEK, options)).toBe('βάρβαρος')
   })
 
+  // Using greek question mark
+
+  test('Using greek question mark', () => {
+    const options = {
+      setGreekStyle: {
+        useGreekQuestionMark: true
+      }
+    }
+    expect(toGreek('πῶς;', KeyType.GREEK)).toBe('πῶς;')
+    expect(toGreek('πῶς\u037E', KeyType.GREEK)).toBe('πῶς;')
+    expect(toGreek('πῶς;', KeyType.GREEK, options)).toBe('πῶς\u037E')
+    expect(toGreek('πῶς\u037E', KeyType.GREEK, options)).toBe('πῶς\u037E')
+  })
+
   // Using lunate sigma
 
   test('Using lunate sigma', () => {

From 60d28e4ff4f779380d7c83151f8bf710075afac1 Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 19:51:00 +0100
Subject: [PATCH 63/99] Refactor greek normalization

---
 src/Mapping.ts | 16 ++--------------
 src/utils.ts   | 25 ++++++++++++++++++-------
 2 files changed, 20 insertions(+), 21 deletions(-)

diff --git a/src/Mapping.ts b/src/Mapping.ts
index 4d1f35a..68ca084 100644
--- a/src/Mapping.ts
+++ b/src/Mapping.ts
@@ -4,7 +4,7 @@ import {
   IMappingProperty,
   ITransliterationStyle
 } from './interfaces';
-import { sanitizeRegExpString } from './utils';
+import { normalizeGreek, sanitizeRegExpString } from './utils';
 
 export const GRAVE_ACCENT = '\u0300';
 export const ACUTE_ACCENT = '\u0301';
@@ -601,7 +601,7 @@ export class Mapping {
     }
 
     if (fromType === KeyType.GREEK) {
-      fromStr = Mapping.#grBypassUnicodeEquivalences(fromStr);
+      fromStr = normalizeGreek(fromStr, true, true);
     }
 
     const mappingProps = this.#getPropsMapOrderByLengthDesc(fromType, toType);
@@ -752,18 +752,6 @@ export class Mapping {
     return new Map(sortedChars);
   }
 
-  /**
-   * Returns a string for which the wrong Unicode canonical equivalences
-   * have been replaced by the right Unicode points.
-   *
-   * @param NFDGreekStr - Expects an `NFD` normalized greek string.
-   */
-  static #grBypassUnicodeEquivalences(NFDGreekStr: string): string {
-    return NFDGreekStr.replace(new RegExp(LATIN_TILDE, 'g'), GREEK_TILDE)
-      .replace(new RegExp(MIDDLE_DOT, 'g'), ANO_TELEIA)
-      .replace(new RegExp(';', 'g'), GREEK_QUESTION_MARK);
-  }
-
   /**
    * Returns a string for which some diacritical marks have been joined back
    * to their letter as they should not be treated separately (e. g. when
diff --git a/src/utils.ts b/src/utils.ts
index 4014cc0..b3df0e8 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -166,13 +166,24 @@ export function isUpperCase(str: string, type: KeyType): boolean {
  * (2) Due to the poor Unicode canonical equivalences, any subsequent
  * normalization may break the replacements made by this function.
  */
-export function normalizeGreek(greekStr: string): string {
-  return greekStr
-    .normalize('NFD')
-    .replace(new RegExp(LATIN_TILDE, 'g'), GREEK_TILDE)
-    .normalize()
-    .replace(new RegExp(MIDDLE_DOT, 'g'), ANO_TELEIA)
-    .replace(new RegExp(';', 'g'), GREEK_QUESTION_MARK);
+export function normalizeGreek(
+  greekStr: string,
+  useGreekQuestionMark: boolean = false,
+  skipUnicodeNormalization: boolean = false
+): string {
+  if (!skipUnicodeNormalization) greekStr = greekStr.normalize('NFD');
+
+  greekStr = greekStr.replace(new RegExp(LATIN_TILDE, 'g'), GREEK_TILDE);
+
+  if (!skipUnicodeNormalization) greekStr = greekStr.normalize();
+
+  greekStr = greekStr.replace(new RegExp(MIDDLE_DOT, 'g'), ANO_TELEIA);
+
+  if (useGreekQuestionMark) {
+    greekStr = greekStr.replace(new RegExp(';', 'g'), GREEK_QUESTION_MARK);
+  }
+
+  return greekStr;
 }
 
 /**

From da035cb25353ce5fd7fa01285714615a4ab1f6eb Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 19:51:14 +0100
Subject: [PATCH 64/99] Clean code

---
 src/toTransliteration.ts | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/toTransliteration.ts b/src/toTransliteration.ts
index da8dc15..7d2af04 100644
--- a/src/toTransliteration.ts
+++ b/src/toTransliteration.ts
@@ -16,7 +16,6 @@ import {
   bcReorderDiacritics,
   fromTLG,
   handleOptions,
-  normalizeGreek,
   removeDiacritics as utilRmDiacritics,
   removeExtraWhitespace as utilRmExtraWhitespace,
   removeGreekVariants as utilRmGreekVariants
@@ -65,7 +64,6 @@ export function toTransliteration(
       str = grConvertBreathings(str, options);
       if (removeDiacritics) str = utilRmDiacritics(str, KeyType.GREEK);
       str = utilRmGreekVariants(str);
-      str = normalizeGreek(str);
       str = mapping.apply(str, KeyType.GREEK, KeyType.TRANSLITERATION);
       break;
 

From cb3c6183b6145d9e4455df2ff12e3cf524d00b29 Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 19:51:32 +0100
Subject: [PATCH 65/99] Update preset `BNF`

---
 src/presets.ts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/presets.ts b/src/presets.ts
index 18590e7..31b1d07 100644
--- a/src/presets.ts
+++ b/src/presets.ts
@@ -17,6 +17,9 @@ const ALA_LC_OPTIONS = (): IConversionOptions => ({
 
 const BNF_OPTIONS = (): IConversionOptions => ({
   removeDiacritics: false,
+  setGreekStyle: {
+    useGreekQuestionMark: true
+  },
   useAdditionalChars: [
     AdditionalChar.DIGAMMA,
     AdditionalChar.YOT,

From 6b189cabdd01c010c9af389742e34b5dd5a5043d Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 19:52:03 +0100
Subject: [PATCH 66/99] Implement `setGreekStyle.useGreekQuestionMark`

---
 src/toGreek.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/toGreek.ts b/src/toGreek.ts
index cba4d82..afb2038 100644
--- a/src/toGreek.ts
+++ b/src/toGreek.ts
@@ -76,7 +76,7 @@ export function toGreek(
   str = applyGreekVariants(str, setGreekStyle);
   if (removeExtraWhitespace) str = utilRmExtraWhitespace(str);
 
-  return normalizeGreek(str);
+  return normalizeGreek(str, setGreekStyle?.useGreekQuestionMark);
 }
 
 /**

From 99f1d8e0444c3142effa1055a463a6f3a043e293 Mon Sep 17 00:00:00 2001
From: antoineboquet 
Date: Fri, 8 Mar 2024 20:03:46 +0100
Subject: [PATCH 67/99] Add `setTransliterationStyle.setCoronisStyle`

---
 examples/playground.html | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/examples/playground.html b/examples/playground.html
index 72ebaae..38bf9a9 100644
--- a/examples/playground.html
+++ b/examples/playground.html
@@ -305,7 +305,7 @@ 

Playground example

Transliteration style