# grapheme-segmentation(任务清单) > 对应计划:`spec_kit/Text Wrap/modules/grapheme-segmentation/plan.md` > > 状态含义:`[ ]` 未完成,`[x]` 已完成。 > 执行完本清单后,需要在 `spec_kit/overview.md` 的 `Text Wrap` 条目下补充“已完成编码/任务执行完毕”的标记(见最后一节)。 --- ## 0. 任务标记规则 - 用勾选框标记执行状态: - `[ ]` 未完成 - `[x]` 已完成 - 每个任务必须可独立验收(有明确产出与检查方式)。 - 所有代码注释必须为简体中文,且把“分割口径”写清楚,避免跨端实现漂移。 --- ## 1. 前置检查(环境能力与策略选择) - [x] 1.1 确认运行时是否支持 `Intl.Segmenter`(Expo/RN 当前引擎) - **方式**:在本地运行/测试环境中打印或断言 `globalThis.Intl?.Segmenter` 是否存在 - **验收**:记录结论:存在/不存在;若不存在,fallback 必须覆盖所有必测样例。 - [x] 1.2 确认 fallback 策略选择为“方案 A:`grapheme-splitter`” - **要求**:若项目明确禁止新增依赖,需要在本任务中写明原因并切换到“方案 B(手写最低可用)”,同时补齐更高测试覆盖 - **验收**:plan 与实际实现策略一致(不出现“文档写 A、代码做 B”的漂移)。 --- ## 2. 依赖与目录骨架(客户端侧实现) - [x] 2.1 新建目录 `client/src/features/textWrap/grapheme/` - **产出**(建议文件): - `segmentGraphemes.ts`(对外纯函数) - `strategies/intlSegmenter.ts` - `strategies/fallback.ts` - `types.ts`(返回结构与 meta 类型) - `__tests__/segmentGraphemes.test.ts` - **验收**:目录存在,TS 可正常 import(不报路径错误)。 - [x] 2.2(方案 A)新增依赖 `grapheme-splitter` 并锁定到 `client/package.json` - **验收**: - `npm install grapheme-splitter` 成功 - `npm test` 仍能通过(不破坏现有测试) --- ## 3. 纯函数实现(分割 + meta) - [x] 3.1 实现 `segmentGraphemes(text, mode)` 的返回契约 - **要求**: - 返回 `{ clusters, meta }` - `clusters.join('') === text`(不丢字符/不改顺序) - `text==''` 时 `clusters==[]` - **验收**:为上述约束写入单测并通过。 - [x] 3.2 实现优先策略 `Intl.Segmenter`(`mode='PREFERRED'` 时优先) - **要求**: - `meta.strategy='INTL_SEGMENTER'` - `meta.hadFallback=false` - **验收**:在支持该能力的环境中,至少 1 个常规输入能走到该策略(可通过 meta 断言)。 - [x] 3.3 实现 fallback 策略(满足所有必测“不拆”样例) - **触发条件**(任一满足即 fallback): - `mode='FALLBACK'` - `Intl.Segmenter` 不存在 - `Intl.Segmenter` 抛错/返回异常结果(空/丢字符) - **要求**: - `meta.strategy='FALLBACK'` - `meta.hadFallback=true` - **验收**:必测样例全部通过(见 4.2)。 --- ## 4. 单元测试(Vitest) - [x] 4.1 基础性质测试 - **覆盖**: - 可逆性:`clusters.join('') === input` - 确定性:同输入多次调用输出一致 - 空字符串:`'' -> []` - **验收**:测试通过且不会出现偶现失败。 - [x] 4.2 必测回归样例(文档要求:每个都必须“不拆”为 1 个 cluster) - **样例**: - `👨‍👩‍👧‍👦` - `🇸🇬` - `👍🏽` - `😮‍💨` - `e\u0301`(组合字符形式) - **断言**: - `clusters.length === 1` - `clusters[0] === input` - **验收**:在本地 `npm test` 中稳定通过。 - [x] 4.3 跨策略一致性测试(在支持 `Intl.Segmenter` 的环境中执行) - **内容**:同一输入在 `PREFERRED` 与强制 `FALLBACK` 下输出 clusters 一致 - **验收**:一致;若不一致,必须新增回归样例并在文档中写明差异与治理方式(`configVersion`)。 --- ## 5. 最终自检清单(合入前) - [x] 5.1 `npm test` 通过(包含本模块新增用例) - **验收**:不影响现有测试文件。 - [x] 5.2 `npx tsc --noEmit` 通过(或项目既有 TS 检查命令通过) - **验收**:无类型错误。 - [x] 5.3 注释与口径自检(简体中文) - **检查点**: - 明确“字符簇不拆”的边界意义(后续断点仅能在 clusters 边界) - 明确 fallback 触发条件与 meta 含义 - **验收**:后续模块开发者只看代码也不会产生歧义。 --- ## 6. 文档回写(任务清单执行完毕后必须做) - [x] 6.1 在 `spec_kit/overview.md` 的 `Text Wrap` 条目下补充执行状态 - **建议写法**: - 增加一行:`- **已完成编码(阶段性)**:grapheme-segmentation(TC 字符簇分割)` - **验收**:overview 能反映该子模块已完成,便于全局追踪。