Repository: yamatoiizuka/palt-typesetting (ts)

Issue:
Remove thin spaces between English segments and brackets
<img width="235" alt="4E003989-7F1D-4955-A402-B6D40AA7348E" src="https://github.com/yamatoiizuka/palt-typesetting/assets/47804982/47fb5618-dc45-4983-915c-b6af829fed41">
<img width="193" alt="CA918B69-97B9-42F5-9687-FB3151DF2584" src="https://github.com/yamatoiizuka/palt-typesetting/assets/47804982/606d2967-6fda-41a0-82cb-9052a64a6759">

約物と英数との間に不要な四分アキが入ることがある。
これらは `hasLanguageTransition` で判定されてしまっているので、
セグメントに約物が含まれる場合には処理をスキップするようにする。

Pull request:
217 remove thin spaces between english segments and brackets
Fix #217 

Patch:
diff --git a/src/insert-separators.ts b/src/insert-separators.ts
index 1698e42..7240376 100644
--- a/src/insert-separators.ts
+++ b/src/insert-separators.ts
@@ -69,7 +69,9 @@ const shouldAddThinSpace = (current: string, next: string): boolean => {
   // 片方のセグメントが空白文字、制御文字であれば四分アキを追加しない
   if (whitespaceRegex.test(current) || whitespaceRegex.test(next)) return false
 
-  return LanguageClass.shouldAddThinSpace(current, next) || CharClass.shouldAddThinSpace(current, next)
+  return CharClass.includesPunctuation(current, next)
+    ? CharClass.shouldAddThinSpace(current, next)
+    : LanguageClass.shouldAddThinSpace(current, next)
 }
 
 /**
diff --git a/src/util-regex.ts b/src/util-regex.ts
index 17f68e8..a9661ad 100644
--- a/src/util-regex.ts
+++ b/src/util-regex.ts
@@ -59,3 +59,11 @@ export const noBreakRulesRegex = new RegExp(
  * 空白文字、制御文字
  */
 export const whitespaceRegex = /[\s\u00A0]/
+
+/**
+ * 約物を合成
+ */
+export const punctuationRegex = new RegExp(
+  `${latinCommaRegex.source}|${latinPeriodRegex.source}|${openingsRegex.source}|${closingsRegex.source}|${middleDotsRegex.source}|${commasRegex.source}|${periodsRegex.source}`,
+  'u'
+)
diff --git a/src/util-text-classes.ts b/src/util-text-classes.ts
index f0773fd..614bf46 100644
--- a/src/util-text-classes.ts
+++ b/src/util-text-classes.ts
@@ -63,17 +63,13 @@ const CharClass = {
   },
 
   /**
-   * 与えられた文字列の最初の文字が句読点に一致するかどうか判断します。
-   * @param {string} segment - 判断対象の文字列
-   * @return {boolean} 最初の文字が句読点であればtrueを返します。
+   * セグメントの少なくとも一方に約物が含まれているかどうかを判定します。
+   * @param {string} current - 現在のセグメント
+   * @param {string} next - 次のセグメント
+   * @return {boolean} 約物が含まれている場合はtrue、そうでない場合はfalse
    */
-  startsWithPunctuation: (segment: string): boolean => {
-    // periodsRegexとcommasRegexを組み合わせて一つの正規表現を作成
-    // 半角カンマ・ピリオドも含める
-    const combinedRegex = new RegExp(
-      `^[${util.periodsRegex.source}${util.commasRegex.source}${util.latinPeriodRegex.source}${util.latinCommaRegex.source}]`
-    )
-    return combinedRegex.test(segment)
+  includesPunctuation: (current: string, next: string): boolean => {
+    return util.punctuationRegex.test(current) || util.punctuationRegex.test(next)
   },
 }
 
@@ -119,7 +115,7 @@ const LanguageClass = {
    * @return 四分アキを追加すべきかどうか
    */
   shouldAddThinSpace: (current: string, next: string): boolean => {
-    return LanguageClass.hasLanguageTransition(current, next) && !CharClass.startsWithPunctuation(next)
+    return LanguageClass.hasLanguageTransition(current, next)
   },
 }
 


Test patch:
diff --git a/tests/insert-separators.test.ts b/tests/insert-separators.test.ts
index 4e8d3be..29944cb 100644
--- a/tests/insert-separators.test.ts
+++ b/tests/insert-separators.test.ts
@@ -41,7 +41,7 @@ describe('insertSeparators', () => {
 
   it('does not insert a thin space after a opening bracket', () => {
     const currentText = '（'
-    const nextText = '注'
+    const nextText = '3D'
     const expected = '（'
     expect(insertSeparatorsToText(currentText, nextText, options)).toEqual(expected)
   })
diff --git a/tests/text-classification.test.ts b/tests/text-classification.test.ts
index 42c1ebb..2d36e51 100644
--- a/tests/text-classification.test.ts
+++ b/tests/text-classification.test.ts
@@ -36,7 +36,7 @@ describe('LanguageClass.shouldAddThinSpace', () => {
     { current: '」', next: '日本語', expected: false },
     { current: '日本語', next: 'と', expected: false },
     { current: 'と', next: 'English', expected: true },
-    { current: 'English', next: '、', expected: false },
+    { current: 'English', next: '、', expected: true },
     { current: '、', next: '晴れ', expected: false },
     { current: '晴れ', next: '・', expected: false },
     { current: '・', next: '28', expected: true },