import type { Token } from './types'; /** * EN tokenize(极简派) * * 口径: * - tokens 只包含 WORD,不生成 SPACE token * - 标点视为“词内字符”,不额外拆分(例如 "tired."、"Wait..."、"hello—world" 都是一个 token) * - 断点只允许发生在“词与词之间”(由上层生成 breakpoint 时遵守) * * start/end 索引以 normalizedText 为基准(建议先调用 normalizeWhitespace)。 */ export function tokenizeEN(normalizedText: string): Token[] { const s = String(normalizedText ?? ''); if (!s) return []; const tokens: Token[] = []; // 由于 NORMALIZE 模式下空白都折叠为单空格,这里按空格扫描即可。 // 为了稳健性,也允许出现意外多空格(会跳过空段)。 let i = 0; const n = s.length; while (i < n) { // 跳过空格(或其他空白字符) while (i < n && /\s/.test(s[i]!)) i++; if (i >= n) break; const start = i; while (i < n && !/\s/.test(s[i]!)) i++; const end = i; tokens.push({ text: s.slice(start, end), start, end }); } return tokens; }