#mdbook #cjk #line-break #space #fix #chinese #block

bin+lib mdbook-fix-cjk-spacing

mdbook 预处理,修复 CJK 行断行

2 个版本

0.1.1 2020 年 7 月 20 日
0.1.0 2020 年 7 月 20 日

文本处理 中排名第 988

MIT 许可证

22KB
302 行代码(不包括注释)

Github Actions Crates.io

mdbook 将渲染 CJK 字符连续行的额外空间。

.....中文结尾
中文顶格...

will result in

.....中文结尾 中文顶格...
             `- note the space here

此预处理器将修复此问题。

用法

  1. 发布页面 下载二进制文件并将其放入您的 PATH
    • 或者,从源代码构建: cargo install mdbook-fix-cjk-spacing
  2. 将以下配置添加到您的 book.toml
    [preprocessor.fix-cjk-spacing]
    command = "mdbook-fix-cjk-spacing"
    
  3. 完成

它是如何工作的?

此预处理器将在 markdown 文件的 AST 上工作

  1. 它将使用 pulldown-cmark 来解析 markdown 文件。
  2. 当遇到 SoftBreak 标记时,它将在前后搜索 Text 标记。
  3. 如果前面的文本以 CJK 结尾且下一个文本以 CJK 字符开头,则省略 SoftBreak

二进制有一个 "raw" 模式来显示处理后的输出

cat markdown.md | md-fix-cjk-spacing raw

问题

在 markdown 中,如果我们连续写几行,它将被解析为一个整体块

line 1
line 2
line 3

// will be parsed as

<p>line 1
line 2
line 3</p>

这意味着保留换行符,并将所有三行视为一个整体段落。

然而,浏览器会将 <p> 中的换行符转换为单个空格,所以当我们在一个浏览器中看到前面的内容时,它将看起来像

line 1 line 2 line 3

这很好,除了当我们使用中文时。中文没有空格的概念,所以当我们写

中文第一行
中文接上行

// will show as

中文第一行 中文接上行
//        `- not the space here

这真的很令人沮丧!因此有两个主要的解决方案

  1. 修复 markdown 解析代码以正确处理。
  2. 将整个段落写在一行中。

第一个选项实际上并不那么实用。这个 'bug' 已经存在很长时间,而且还没有修复。第二个将会很无聊,并且不友好。

因此,我们有了使用 mdbook 的解决方案:编写一个预处理器,在解析之前自动合并中文行!

用例

仅处理以下情况

...<chinese character>[should contains no spaces]
[zero or more spaces|tab]<chinese character>

.....中文结尾
中文顶格...

// are modified to
.....中文结尾中文顶格...
//           `- note no space here

请注意,代码块中的内容将不会被更改。

依赖项

~12-23MB
~325K SLoC