import type { Token } from './types'; /** * 从 token 区间 `[start..end)` 重组回文本(跨端口径)。 * * - 默认:用单空格 join(适用于 whitespacePolicy=NORMALIZE) * - 若传入 rawSeparators:按原始分隔符拼接(适用于 whitespacePolicy=PRESERVE) * * 说明: * - `start/end` 为半开区间 * - 空区间返回空字符串;上层需要用硬约束避免空行 */ export function joinTokens(tokens: Token[], start: number, end: number, rawSeparators?: string[]): string { const s = Math.max(0, start | 0); const e = Math.max(0, end | 0); if (!Array.isArray(tokens) || tokens.length === 0) return ''; if (s >= e) return ''; const slice = tokens.slice(s, e).map((t) => t.text); if (!rawSeparators) { return slice.join(' '); } // rawSeparators[i] 表示 tokens[i] 与 tokens[i+1] 之间的分隔符 // 这里只实现最小可用:若 separators 缺失则回退到单空格。 let out = ''; for (let idx = s; idx < e; idx++) { const t = tokens[idx]; if (!t) continue; out += t.text; if (idx < e - 1) { out += rawSeparators[idx] ?? ' '; } } return out; }