/** * TextProcessor Module * Encapsulates text pre-processing steps required before layout calculation. */ export class TextProcessor { /** * Create a new TextProcessor * @param {Object} smartyPants - The SmartyPants library * @param {Function} [hyphenator] - Optional: The hyphenation function (can be set later) */ constructor(smartyPants, hyphenator = null) { // Make hyphenator optional this.smartyPants = smartyPants; this.hyphenator = hyphenator; this.hyphenationClass = '.hyphenatePipe'; // Default hyphenation class for Knuth-Plass with pipe character } /** * Process text with typographic enhancements and hyphenation * @param {string} text - The text to process * @returns {string} The processed text */ process(text) { // First apply SmartyPants for typographic enhancement const smartyPantsText = this.smartyPants.smartypantsu(text, 1) // Remove these replacements that were causing the spacing issues // .replace(/\.\s*$/g, '.') // .replace(/\?\s*$/g, '?') // .replace(/!\s*$/g, '!') // Instead, ensure proper spacing between sentences .replace(/\.\s+/g, '. ') // Normalize spaces after periods .replace(/\?\s+/g, '? ') // Normalize spaces after question marks .replace(/!\s+/g, '! '); // Normalize spaces after exclamation marks // Then apply hyphenation if available if (typeof this.hyphenator === 'function') { return this.hyphenator(smartyPantsText, this.hyphenationClass); } else { console.warn('TextProcessor: Hyphenator not set, skipping hyphenation.'); return smartyPantsText; // Return text without hyphenation if not set } } /** * Set the hyphenator function after initialization. * @param {Function} hyphenatorFunction - The hyphenation function provided by Hyphenopoly. */ setHyphenator(hyphenatorFunction) { if (typeof hyphenatorFunction === 'function') { this.hyphenator = hyphenatorFunction; } else { console.error('TextProcessor: Invalid hyphenator function provided.'); } } /** * Set the hyphenation class * @param {string} className - The CSS class for hyphenation */ setHyphenationClass(className) { this.hyphenationClass = className; } /** * Get the current hyphenation class * @returns {string} The current hyphenation class */ getHyphenationClass() { return this.hyphenationClass; } }