38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
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;
|
||
}
|
||
|