From cfc7de7abf9f05d78f352e106fc34183cb8c00ff Mon Sep 17 00:00:00 2001 From: Artem Akymenko Date: Thu, 23 Jul 2026 08:35:58 +0000 Subject: [PATCH] refactor: unify PUNCTUATION constants in domain/split_pattern.py --- abogen/domain/split_pattern.py | 8 ++++++-- abogen/domain/subtitle_generation.py | 14 ++++---------- abogen/pyqt/conversion.py | 8 ++------ 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/abogen/domain/split_pattern.py b/abogen/domain/split_pattern.py index 27b9691..cdf6057 100644 --- a/abogen/domain/split_pattern.py +++ b/abogen/domain/split_pattern.py @@ -5,8 +5,12 @@ import re from abogen.domain.enums import Language, SubtitleMode -PUNCTUATION_SENTENCE = r".!?。!?" -PUNCTUATION_SENTENCE_COMMA = r".!?,。!?、," +# Canonical punctuation sets covering all supported scripts: +# ASCII (. ! ?), Arabic ؟, CJK (。!?), Devanagari । +PUNCTUATION_SENTENCE = r".!?؟。!?।" +# Commas: ASCII , CJK fullwidth ,CJK ideographic 、 +PUNCTUATION_SENTENCE_COMMA = r".!?,?。!?،,、।" +PUNCTUATION_COMMAS = ",,、" def get_split_pattern(language: str, subtitle_mode: str) -> str: diff --git a/abogen/domain/subtitle_generation.py b/abogen/domain/subtitle_generation.py index 1428f71..37ed0c6 100644 --- a/abogen/domain/subtitle_generation.py +++ b/abogen/domain/subtitle_generation.py @@ -11,11 +11,7 @@ import re from typing import List, Optional, Tuple from abogen.domain.enums import Language, SubtitleMode - - -# Punctuation constants for sentence splitting -PUNCTUATION_SENTENCE = ".!?\u061f\u3002\uff01\uff1f" # .!? .?. ?? -PUNCTUATION_SENTENCE_COMMA = ".!?,\u3001\u061f\u3002\uff01\uff0c\uff1f" # .!?, ,. ?? +from abogen.domain.split_pattern import PUNCTUATION_SENTENCE, PUNCTUATION_SENTENCE_COMMA def process_subtitle_tokens( @@ -87,7 +83,7 @@ def _process_karaoke_highlighting( fallback_end_time: Optional[float], ) -> None: """Process tokens for Sentence + Highlighting mode (karaoke effect).""" - separator = rf"[{re.escape(PUNCTUATION_SENTENCE)}]" + separator = rf"[{PUNCTUATION_SENTENCE}]" current_sentence = [] word_count = 0 @@ -247,11 +243,9 @@ def _process_regex_sentences( if subtitle_mode == SubtitleMode.LINE: separator = r"\n" elif subtitle_mode == SubtitleMode.SENTENCE: - # Use punctuation without comma - separator = rf"[{re.escape(PUNCTUATION_SENTENCE)}]" + separator = rf"[{PUNCTUATION_SENTENCE}]" else: # Sentence + Comma - # Use punctuation with comma - separator = rf"[{re.escape(PUNCTUATION_SENTENCE_COMMA)}]" + separator = rf"[{PUNCTUATION_SENTENCE_COMMA}]" current_sentence = [] word_count = 0 diff --git a/abogen/pyqt/conversion.py b/abogen/pyqt/conversion.py index 7632923..a8e75ba 100644 --- a/abogen/pyqt/conversion.py +++ b/abogen/pyqt/conversion.py @@ -78,6 +78,7 @@ from abogen.subtitle_utils import ( sanitize_name_for_os, split_text_by_voice_markers ) +from abogen.domain.split_pattern import PUNCTUATION_SENTENCE, PUNCTUATION_SENTENCE_COMMA, PUNCTUATION_COMMAS class CountdownDialog(QDialog): """Base dialog with auto-accept countdown functionality""" @@ -241,11 +242,6 @@ class ConversionThread(QThread): log_updated = pyqtSignal(object) # Updated signal for log updates chapters_detected = pyqtSignal(int) # Signal for chapter detection - # Punctuation constants for unified handling across languages - PUNCTUATION_SENTENCE = ".!?।。!?" - PUNCTUATION_SENTENCE_COMMA = ".!?,।。!?、," - PUNCTUATION_COMMAS = ",,、" - def __init__( self, file_name, @@ -932,7 +928,7 @@ class ConversionThread(QThread): # For Sentence + Comma mode, still split on commas within spaCy sentences if self.subtitle_mode == "Sentence + Comma": active_split_pattern = r"(?<=[{}]){}|\n+".format( - self.PUNCTUATION_COMMAS, spacing_pattern + PUNCTUATION_COMMAS, spacing_pattern ) else: active_split_pattern = (