Skip to content

[Feature] 中文排版工具:中英文间加空格、按语境规范化标点、可选直角引号 #822

Description

@hf7751

你希望增加或改进什么?

希望增加一组中文排版美化工具:三个彼此独立、可选、可一键撤销的一键操作,解决中英混排笔记里空格缺失、标点半角/全角混乱的问题。

目前编辑器里没有这类能力:既没有 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')必须排除。

这一项主观性较强(大陆数字排版主流仍是弯引号),所以做成默认关闭的可选项,只提供转换能力。

三条共同约定

  1. 手动触发:只在用户点击时生效,不在输入时自动改写,不做任何默认开启的行为。
  2. 可撤销:每次操作作为单个编辑事务提交,Cmd/Ctrl+Z 一键回退。
  3. 双引擎覆盖:富文本(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,想先对齐上述定调(保护区范围、标点判定粒度、直角引号是否默认关闭)再推进,避免方向不一致导致返工。

Activity

  1. cropflre commented on Oct 10, 2026

    @cropflre
    Owner

    感谢这么具体的需求和边界说明,方向已经对齐。#822 属于目前缺少的编辑辅助能力,建议提供三项独立的手动操作,不做输入时自动格式化。

    我已经按这个方向提交了实现草案:#823(目标 release/v1.5.2,当前 Draft,待最终 CI/复杂笔记回归)。

    • 补空格:仅处理汉字与拉丁字母/数字交界,保护 Markdown 代码、公式、HTML 标签、链接地址、URL、邮箱等。
    • 标点规范化:保守识别中文上下文;英文片段、小数/时间/版本号/域名、省略号尽量保持原样。无法明确判断的片段宁可不改。
    • 直角引号:不默认开启,只通过菜单手动转换成 「」 / 『』;英文缩写撇号不作引号处理。
    • 双编辑器与撤销:Markdown 通过一次 CodeMirror transaction 修改,富文本通过一次 ProseMirror transaction 修改(保留 marks 与非文本节点),支持一次撤销。
    • 交互:桌面和移动端「更多 → 中文排版」下提供三项独立入口;只读或锁定时禁用。

    测试会覆盖受保护文本、选区/全文、代码与富文本 marks、单步撤销。由于语义标点无法完全靠正则判断,首版会偏向保守;欢迎继续补充真实语料。代码合并且验收后再关闭 issue。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions