用途
该工具用于验证 Plate 编辑器的自动格式化输入规则是否按声明工作。具体来说,它会检查以下属性:在三个段落(x、光标段落、y)中逐键输入时,BasicMarksKit 和 AutoformatKit 声明的每个简写是否完整地产生声明结果(替换符号,或内容带有正确标记且无残留分隔符);单词内部的标记简写是否保持字面(下标和上标除外);任何按键序列是否不会改变上方或下方段落;当某次按键触发规则时,一次撤销是否恢复该按键前的文档状态。
主要能力
- 从 autoformat.tsx 读取 createTextSubstitutionInputRule 常量及其 pattern 的 format 与 match。
- 从 basic-marks.tsx 读取每个 <Mark>Rules.markdown() 调用及其 variant 或 value。
- 通过 getPlateRuntime 统计编辑器中运行的实际文本输入规则数量,若与脚本读取的规则数不一致则退出码 2。
- 枚举字母表(a 及标记语法和替换源中的非字母数字字符,共 15 个字符)上长度不超过三键的所有序列,共 3,615 个序列,对每个序列在段落开头输入并检查段落数量、x 和 y 是否变化。
- 检查每次按键是否触发规则,以及一次撤销能否恢复。
- 将发现与只减不增的基线文件 autoformat-input-rules-baseline.json 比对,输出三类发现:autoformat-declared(简写未完整生效)、autoformat-blocks(改变其他段落)、autoformat-undo(撤销无法恢复)。
- 支持 --length=4 扩展为四键序列、--typed='<keys>' 显示单个序列结果、--jobs=<n> 设置工作进程数。
使用方式
从仓库根目录运行:
pnpm check:autoformat-rules
该命令执行门限(三键)检查,约 6 秒完成 3,910 次运行和 352 项声明检查,输出一行 JSON 摘要及基线未列出的每个发现。也可通过 pnpm check autoformat-rules 或 pnpm check --affected 运行。
--length=4 会检查最多四键的序列,约 80 秒完成 54,535 次运行;它跳过基线,任何发现都会以退出码 1 结束。--typed='<keys>' 在门限的各个上下文中运行一个序列并打印所有发现而不读取基线。--jobs=<n> 设置工作进程数,默认取机器核心数,最多 8。
修复移除已知发现后,需运行 pnpm check:autoformat-rules --lower 以删除基线中不再存在的条目;基线永不增长。
适用场景
适用于修改自动格式化规则、标记简写、规则匹配与应用逻辑、历史合并策略或插件解析顺序后,确认没有引入回归。也可用于排查用户报告的简写未生效、分隔符残留或撤销异常等问题。
限制
该工具不覆盖 EditorKit 其他工具包的输入规则(如块级简写、列表、引用、代码围栏、水平线、链接自动格式化),不覆盖浏览器端的 beforeinput、composition、IME、移动键盘、粘贴及光标 DOM 显示,不覆盖规则触发后的光标位置和标记延续(除后续按键体现的之外),不覆盖重做、撤销超过最后一键及删除时撤销,不覆盖多字符内容、光标后文本、加粗以外的标记、单词内的替换或智能引号,不覆盖超过三键的序列及 15 字符字母表之外的按键(如 (tm)、1/2、© 仅作为声明简写输入),也不判断共享按键的两个规则中哪个应胜出(由规范决定)。已知发现的结果若变化,因身份只记录按键和上下文,不会变红。
当前发现
门限检查发现 160 项:74 项 autoformat-declared、86 项 autoformat-blocks、0 项 autoformat-undo。--length=4 发现相同的 74 项 autoformat-declared、0 项 autoformat-undo 和 1,976 项 autoformat-blocks。文档列出了每类发现的具体原因(如 ==a== 产生 ≡a≡、!>= 产生 ≯=、<= 产生 ⇐、a 产生加粗而非下划线、~0~ 产生 ₀~、单词内下标不上标不生效、单字符分隔符合并下一段落等)及对应问题编号。