Files
mindfulness/spec_kit/Text Wrap/modules/grapheme-segmentation/tasks.md
2026-02-10 11:39:33 +08:00

127 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-segmentationTC 字符簇分割)`
- **验收**overview 能反映该子模块已完成,便于全局追踪。