关于中文博客格式的思考

警告
本文最后更新于 2023-10-22,文中内容可能已过时。

关于中文博客格式的思考

起源

一开始看到这个话题,是在阮一峰大佬的 Github 开源项目:GitHub - ruanyf/document-style-guide: 中文技术文档的写作规范,在文本这一章节,我第一次注意到了中英文字符之间应该添加空格这个问题。因为经常看阮一峰大佬的博客,所以我也会不自觉地模仿他的博客风格,他的博客主要以短句为主,而且非常美观,阅读起来非常地轻松和流畅,其中阅读体验舒服流畅这一条,就是中英文字符之间添加了空格的功劳。

自动化插件 - 盘古之白

有了空格,好看是好看,但是在写作过程中保持手动添加空格的习惯实在是太过强人所难,写博客都没啥时间,更不用说还要注重排版,直到我在通过 hugo 创建个人静态博客的时候,通过使用FixIt主题,发现了盘古之白这个插件,这个插件的开源地址为:GitHub - vinta/pangu.js: Paranoid text spacing in JavaScript,专门用来处理中英文等各种情况之中添加空白字符的问题。

pangu.js 的原理其实也不复杂,就是通过正则的分组匹配,匹配到需要添加空格的位置然后通过替换,添加空格

pangu.js 穷举了所有的需要添加空格的情况,一个一个得匹配然后替换,简单、粗暴、有效

而且因为足够简单,所以很容易提供多种客户端,支持多个场景下的使用

  • 支持在代码中使用,比如 js、go、Java、python

  • 支持在命令行中使用

  • 支持浏览器插件

  • 支持 vscode 查看

  • 支持 Jetbrain 系列 IDE 插件

其中最方便的是支持在代码中使用,这样我们就可以编写自己的脚本批量格式化待处理的文本,实际上我也是这样用的。

其中,在使用 pangu.js 的Python 版本进行脚本开发的时候,我发现了一个问题,即,在通过$ pip install -U pangu下载 pangu.js 之后,直接通过命令行pangu -f xxx.txt格式化文件,或者,编写 python 脚本,引入 pangu 模块之后,调用 spacing_file 方法格式化文件,都是无法正常读取 utf-8 编码格式的文件的,需要到包文件(site-packages\pangu.py)中的 162 行,修改脚本内容为with open(os.path.abspath(path),encoding='UTF-8') as f才可以。

此外 pangu.js 还有一个比较大的缺陷,就是不支持在 markdown 中添加空格,具体的讨论如下,正確地處理 Markdown · Issue #127 · vinta/pangu.js · GitHub

而且盘古之白这个项目好长时间都没更新了,指望作者来修复这些问题是指望不上了。

换成 autocorrect

鉴于 pangu.js 的各种问题,我最终采用的是AutoCorrect,项目开源地址为:GitHub - huacnlee/autocorrect: A linter and formatter to help you to improve copywriting, correct spaces, words, and punctuations between CJK (Chinese, Japanese, Korean).,线上体验地址为:autocorrect—editor

这个开源项目跟 pangu.js 相比比较进步的地方就是针对不同的文档类型进行了适配,其中就包括 markdown。

跟 pangu.js 的适配场景差不多

  • 支持在代码中使用,比如 js、go、Java、python

  • 支持在命令行中使用

  • 支持 vscode 查看

  • 支持 Jetbrain 系列 IDE 插件

在代码中使用的方式也很简单,以python 为例

先下载

1
$ pip install autocorrect-py

然后使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import autocorrect_py as autocorrect

autocorrect.format("Hello 你好。")
# => "Hello 你好。"

autocorrect.format_for("let title = 'Hello 你好。'", "js")
# => "let title = 'Hello 你好。'"

result = autocorrect.lint_for("<h1>这是 Heading 标题</h1>", "html")
print result
# => LintResult(filepath='html', lines=[LineResult { line: 1, col: 5, new: "这是 Heading 标题", old: "这是 Heading 标题", severity: Error }], enable=true)

# Load config
autocorrect.load_config('{ textRules: { "你好 hello": 0 } }')
autocorrect.format("Hello 你好。")
# => "Hello 你好。"
autocorrect.format("你好 hello.")
# => "你好 hello."

# Ignorer, if /path/to/workdir contains .autocorrectignore or .gitignore
ignorer = autocorrect.Ignorer('/path/to/workdir');
ignorer.is_ignored('README.md');

对于文件的格式化,可以一次性将文件内容读取到字符串中,然后通过autocorrect.format_for方法格式化即可。

而且最重要的一点是,其生效逻辑是在文件保存的时候自动格式化,不需要像 pangu.js 一样额外使用格式化动作来进行格式化,真正做到了无感使用。在实际的使用中,体验非常好。

总结

建议所有的中文博客作者都安装这个插件,来提升自己的博客的阅读体验。

同时为了实现无感格式化,建议将手头使用的所有的编辑器都安装同一种类型的插件,比如我本地就是 Jetbrain 系列的 IDE 和 vscode,我都安装了 autocorrect,这样就能获得一致的连续的格式化体验。

0%