cnenlinter:中英混排格式命令行清理工具

这是我自己用的一个简陋的 Python 程序,用来检查文本文件中(例如 markdown 文件)的中英混排的句子不符合要求的地方 —— 其实,它只不过是一个批处理工具。

理论上它可以用来检查任何基于纯文本的文档(如 markdown、html、json、ipynb 等等),只不过是需要更换 rules.yml 文件中的正则表达式而已。匹配全角字符的正则表达式是:[\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD]

程序很简单:

  1. 针对文本文件中非纯 ascii 字符构成的每一行逐一进行操作;
  2. 读取 rules.yml 文件中的规则(正则表达式),逐一应用到该行;
  3. 检查过程中允许使用 verbose 模式决定是否进行修正。

安装方法

  1. git clone https://github.com/selfteaching/markdown-writing-with-mixed-cn-en
  2. cd markdown-writing-with-mixed-cn-en/cnenlinter
  3. pip install virtualenv
  4. virtualenv venv
  5. . venv/bin/activate
  6. pip install -e .

使用帮助

  1. cnenlinter --help
  2. Usage: cnenlinter [OPTIONS] [FILES]...
  3. Options:
  4. -c, --config-path PATH Specify directory that contains rules file.
  5. -l, --log-file TEXT Specify file name for log, default: "log.txt".
  6. -f, --fix-directly BOOLEAN Fix file(s) directly, rather than save to
  7. "/linted" directory. Default: True.
  8. -r, --rules-file-name TEXT Specify rules file name. Default: rules.yml
  9. -v, --verbose BOOLEAN Ask permission before fix. Default: True.
  10. --help Show this message and exit.

基本命令

  1. cnenlinter *.md

也可以通过添加参数关闭 verbosefix-directly 模式

  1. cnenlinter -v False *.md
  2. cnenlinter -f False *.md

还可以指定规则文件及其存放的目录:

  1. cnenlinter -c <path-of-rules-file> -r <rules-file-name> -v False -f False *.md
  2. # 随后可以打开 log.txt 文件查看可修订记录

在处理单个文件的时候,我通常会使用 cnenlinter <file>,因为即便是总监不小心操作出错(比如,在不应该的地方顺手敲了 y),也可以通过 log.txt 文件查找哪里出了问题。

但是,在处理多个文件的时候,我会使用 cnenlinter -f False *.md,即,修改过的文件将另存在 linted 目录中。

关于规则,以及 rules.yml

rules.yml 文件里保存着搜索(pattern)和替换(expected)的正则表达式。

每个规则由 --- 作为起始,而后一个 expected 再加上一个 pattern,比如:

  1. ---
  2. # conver half-width puntuations in Chinese sentences to full-width ones.
  3. # 中文前后的半角标点符号字符更换为全角标点符号
  4. 'expected': /\1,/
  5. 'pattern': /([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD”’])\,/
  6. ---
  7. 'expected': /\1。/
  8. 'pattern': /([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD”’])\./
  9. ---
  10. 'expected': /\1:/
  11. 'pattern': /([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD”’])\:/
  12. ---
  13. 'expected': /\1;/
  14. 'pattern': /([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD”’])\;/
  15. ---
  16. 'expected': /\1?/
  17. 'pattern': /([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD”’])\?/
  18. ---
  19. 'expected': /\1!/
  20. 'pattern': /([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD”’])\!/
  21. ---
  22. 'expected': /\1)/
  23. 'pattern': /([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD”’])\s*[\))]/
  24. ---
  25. 'expected': /(\1/
  26. 'pattern': /[(\(]\s*([\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC\uF900-\uFAAD‘“])/

正则表达式前后,使用 / 标记。

pattern 中允许使用三个 flagail —— 分别对应着 re.Are.Ire.L

  1. /<regex>/<flag>

expected 中,使用 \1 \2… 来替换 pattern 中的捕获。

注意

此程序只在 Mac OSX 环境下测试运行过。