你希望增加或改进什么?
希望增加一组中文排版美化工具:三个彼此独立、可选、可一键撤销的一键操作,解决中英混排笔记里空格缺失、标点半角/全角混乱的问题。
目前编辑器里没有这类能力:既没有 pangu 式的中英文自动加空格,也没有标点规范化,连 Tiptap 自带的 @tiptap/extension-typography 都未启用。唯一相关的既有能力是 FirstLineIndentExtension(段落首行缩进 2em)。
1. 中英文 / 数字之间自动加空格
- 作用域:有选区时只作用于选区;无选区时作用于整篇。
- 例:
使用PostgreSQL数据库 → 使用 PostgreSQL 数据库;2024年10月1日 → 2024 年 10 月 1 日。
- 只在「汉字类字符」与「拉丁字母/数字」之间补空格,不在标点两侧补,避免把
hello, world、(参见图1) 这类结构改坏。
- 跳过保护区:围栏代码块、行内代码、行内/块级数学公式、URL 与邮箱、HTML 标签、Markdown 链接地址。
2. 按上下文规范化标点(不是简单的双向互转)
不做「全文统一成中文标点」或「统一成英文标点」,而是按片段的主体语言决定用哪种标点:
- 整段以中文为主、只有零星英文单词 → 中文标点
,。;:?!()
- 整段纯英文 → 英文标点
,.;:?!()
- 中文段落中引用的英文片段(例:
他说,Hello, world! 然后离开了。)→ 该片段内部保留英文标点,片段之外仍用中文标点
必须避开的误伤:小数点 3.14、千分位 1,000、时间 10:30、域名 example.com、版本号 v1.0、省略号 ...。同样跳过第 1 条的保护区。
3. 弯引号 → 直角引号(可选)
"" → 「」,'' → 『』,嵌套时自然形成 「外层『内层』」。英文撇号(don't、students')必须排除。
这一项主观性较强(大陆数字排版主流仍是弯引号),所以做成默认关闭的可选项,只提供转换能力。
三条共同约定
- 手动触发:只在用户点击时生效,不在输入时自动改写,不做任何默认开启的行为。
- 可撤销:每次操作作为单个编辑事务提交,
Cmd/Ctrl+Z 一键回退。
- 双引擎覆盖:富文本(Tiptap)与 Markdown(CodeMirror 6)都支持。
实现建议(可调整)
- 不引入新依赖:核心约 60 行正则,内联为
frontend/src/lib/cjkTypography.ts 纯函数(仓库有 verify:bundle 体积门禁,且 MarkdownEnhancements.ts 也注明倾向不新增依赖)。
- 富文本侧参照
frontend/src/components/extensions/RichTextLayoutExtensions.ts 的 Extension.create + addCommands 写法。
- Markdown 侧参照
frontend/src/lib/markdownCommands.ts。
主要用在哪?
全平台
截图、录屏或参考产品(可选)
- pangu.js —— 中英文间加空格的事实标准(仅参考其正则思路,不引依赖)
- 中文文案排版指北(chinese-copywriting-guidelines)—— 中英文之间加空格、全角标点使用约定
- Obsidian 插件 Pangu、Typora 的排版习惯
备注:已在本地完成实现与单元测试,暂未提交 PR,想先对齐上述定调(保护区范围、标点判定粒度、直角引号是否默认关闭)再推进,避免方向不一致导致返工。
你希望增加或改进什么?
希望增加一组中文排版美化工具:三个彼此独立、可选、可一键撤销的一键操作,解决中英混排笔记里空格缺失、标点半角/全角混乱的问题。
目前编辑器里没有这类能力:既没有 pangu 式的中英文自动加空格,也没有标点规范化,连 Tiptap 自带的
@tiptap/extension-typography都未启用。唯一相关的既有能力是FirstLineIndentExtension(段落首行缩进 2em)。1. 中英文 / 数字之间自动加空格
使用PostgreSQL数据库→使用 PostgreSQL 数据库;2024年10月1日→2024 年 10 月 1 日。hello, world、(参见图1)这类结构改坏。2. 按上下文规范化标点(不是简单的双向互转)
不做「全文统一成中文标点」或「统一成英文标点」,而是按片段的主体语言决定用哪种标点:
,。;:?!(),.;:?!()他说,Hello, world! 然后离开了。)→ 该片段内部保留英文标点,片段之外仍用中文标点必须避开的误伤:小数点
3.14、千分位1,000、时间10:30、域名example.com、版本号v1.0、省略号...。同样跳过第 1 条的保护区。3. 弯引号 → 直角引号(可选)
""→「」,''→『』,嵌套时自然形成「外层『内层』」。英文撇号(don't、students')必须排除。这一项主观性较强(大陆数字排版主流仍是弯引号),所以做成默认关闭的可选项,只提供转换能力。
三条共同约定
Cmd/Ctrl+Z一键回退。实现建议(可调整)
frontend/src/lib/cjkTypography.ts纯函数(仓库有verify:bundle体积门禁,且MarkdownEnhancements.ts也注明倾向不新增依赖)。frontend/src/components/extensions/RichTextLayoutExtensions.ts的Extension.create+addCommands写法。frontend/src/lib/markdownCommands.ts。主要用在哪?
全平台
截图、录屏或参考产品(可选)