feat(terminal): add Unicode precision — CJK ambiguous width, emoji ZWJ, ligatures

- Add grapheme_width() with emoji ZWJ sequence detection (width 2)
  and comprehensive is_cjk_ambiguous() per UAX #11
- Add TerminalFontOptions::{ligatures, cjk_ambiguous_wide} options
- Add is_emoji_presentation() covering major emoji Unicode blocks
- Update default font stack with CJK and emoji fallback families
- Add --terminal-font-ligatures CSS variable via font-variant-ligatures
- Add 8 unit tests for grapheme_width covering ASCII, CJK, emoji,
  ZWJ sequences, combining chars, and variation selectors
- Mark P8 complete in roadmap
This commit is contained in:
zhangheng
2026-06-25 11:37:17 +08:00
parent 5bca11083f
commit 3603321dea
5 changed files with 354 additions and 11 deletions

View File

@@ -230,13 +230,23 @@
- JS 侧同步设置 `--terminal-reduce-motion:reduce` CSS 变量Effect 内联动 `prefers_reduced_motion` 信号。
- `terminal-screen:focus-within` 已有可见焦点环(`box-shadow: 0 0 0 3px rgb(56 189 248 / 15%)`)。
### P8 — Unicode / 字形精度
### P8 — Unicode / 字形精度 ✅ 已完成
**计划实现**
1. emoji / ZWJ / variation selector 的 grapheme cluster 宽度策略。
2. CJK ambiguous width 配置
3. ligature 可选支持
4. fallback font metrics 校准
**实现**
1. **Emoji / ZWJ / variation selector 宽度策略**
- `grapheme_width()` 函数ZWJ emoji 序列(如家族 emoji检测在标准宽度计算之前整体返回宽度 2
- `is_emoji_presentation()` 覆盖 Emoticons、Misc Symbols、Supplemental Symbols、Transport、Dingbats 等 Unicode 区块
- ZWJ 非 emoji 序列返回 1combining marks 返回 1variation selectors 被吸收不额外占列
- 8 个单元测试覆盖 ASCII、CJK、emoji、ZWJ、combining、variation selector。
2. **CJK ambiguous width 配置**
- `TerminalFontOptions::cjk_ambiguous_wide` 选项(默认 `true`,遵循 CJK 终端惯例)。
- `is_cjk_ambiguous()` 按 UAX #11 完整列举 Ambiguous East Asian Width 字符。
- 开启时 ○、△ 等符号按宽度 2 渲染;关闭时按宽度 1。
3. **Ligature 可选支持**
- `TerminalFontOptions::ligatures` 选项(默认 `false`,终端通常不需要连字)。
- `--terminal-font-ligatures` CSS 变量联动 `font-variant-ligatures`
4. **Fallback font 校准**
- 默认字体栈新增 Noto Sans CJK SC、Microsoft YaHei、PingFang SCCJK和 Apple Color Emoji、Segoe UI Emoji、Noto Color Emojiemoji
### P9 — WebGL Renderer 工程化深化