53 lines
1.4 KiB
Markdown
53 lines
1.4 KiB
Markdown
# grapheme-segmentation(子模块规范)
|
||
|
||
## 子模块名称
|
||
|
||
grapheme-segmentation(TC 字符簇分割)
|
||
|
||
## 目标描述
|
||
|
||
在 TC(中文/繁中)场景下,统一“按 grapheme cluster(字符簇)切分”的实现口径,确保:
|
||
|
||
- 不拆分 surrogate pair(代理对)
|
||
- 不拆分 ZWJ 序列(家庭 emoji 等)
|
||
- 不拆分 variation selector(VS16 等)
|
||
- 不拆分 skin tone modifier(肤色修饰符)
|
||
- 不拆分 regional indicator flags(国旗)
|
||
- 覆盖组合字符(如 `é`)
|
||
|
||
优先使用平台级 segmentation(如 ICU / 系统 API / `Intl.Segmenter`),无库时提供最低可用兜底。
|
||
|
||
## 输入/输出定义
|
||
|
||
### 输入
|
||
|
||
- `text: string`(已完成空白归一化的文本,或原始文本)
|
||
- `mode: 'PREFERRED' | 'FALLBACK'`
|
||
|
||
### 输出
|
||
|
||
- `clusters: string[]`
|
||
- 每个元素为一个 grapheme cluster(用于 TC tokens)
|
||
- `meta?: { strategy: 'PLATFORM' | 'INTL_SEGMENTER' | 'FALLBACK'; hadFallback: boolean }`
|
||
|
||
## 验收标准(可验证)
|
||
|
||
至少通过以下回归样例(每个样例都必须“单 token 不拆”):
|
||
|
||
- `👨👩👧👦`
|
||
- `🇸🇬`
|
||
- `👍🏽`
|
||
- `😮💨`
|
||
- `é`
|
||
|
||
并满足:
|
||
|
||
- **确定性**:同输入同输出(clusters 顺序与内容完全一致)
|
||
- **边界一致**:任意换行断点只允许发生在 `clusters` 边界
|
||
|
||
## 依赖与关联
|
||
|
||
- **被依赖**:`core-contract`(TC token 生成)、`breakpoint-candidates`
|
||
- **不依赖其他模块**
|
||
|