hexo 使用 hexo-pangu-spacing 的坑

TLDR

不要使用 hexo-pangu-spacing,可以由主题配置文件打开 pangu

发现

这个坑是在写关于界面的时候发现的,当时想使用 markdown 中的删除线,然后发现发布的时候有一半波浪线变成了中文,让我深感疑惑

现象

一番测试之后发现,出现在中文后的波浪线就会变为中文符号,而那些保持为英文的符号会和紧邻的中文中出现一个空格

你好

会处理成

** 你好 **

而加了空格之后在 html 中是不会加粗的

排查

当时首先怀疑是不是 pandoc 解析的问题,加了一些 log 后发现 pandoc 拿到的 data 已经不对了。单独使用 pandoc 将 md 转为 html 也没有问题

然后怀疑是不是 pangu 的问题,在主题配置文件中把 pangu 设为了 false 依然有这个问题,这让我直接排除了 pangu 这个正确答案

定位

经过一番加日志的操作,最终定位到了 node_modules/hexo/lib/hexo/post.js 文件中的如下代码

1
2
3
4
5
6
7
return promise.then(content => {
data.content = content;
// Run "before_post_render" filters
return ctx.execFilter('before_post_render', data, { context: ctx });
}).then(() => {
data.content = cacheObj.escapeCodeBlocks(data.content);
// Escape all Nunjucks/Swig tags

我发现在 execFilter 之前 data 还是正确的,但之后就不正确了,说明问题出在 execFilter

我搜索到了好几个 before_post_render 场景中出现的 filter,最终发现问题出在 node_modules/hexo-pangu-spacing/index.js 的如下代码中

1
2
3
4
5
hexo.extend.filter.register('before_post_render', function(data) {
data.title = pangu.spacing(data.title);
data.content = pangu.spacing(data.content);
});

正是这句 spacing 导致了问题,注释掉之后就正常了

看到这里有人可能会说不对啊之前把 pangu 关了不是没问题吗???

我对此也产生了疑问,于是我把 next 主题配置中的 pangu 关了又试了一次,惊奇地发现关了之后居然输出了加在 pangu 里的日志!!!

这说明主题配置中的 pangu 和 hexo-pangu-spacing 插件没有关系

解决

查阅相关 pangu 文档后发现 pangu 不支持直接对 markdown 使用

github-pangu-issue91

hexo-pangu-spacing 在 render 之前直接调用 pangu 是有问题的,于是我把这个插件卸载了

如果要用 pangu 的话直接在主题配置文件里打开即可

经验

这番排查给了我一些找渲染问题的经验,在此记录如下

  • 可以使用 hexo render 指令渲染文件(但在此例中没有用处,因为是 filter 而非 renderer 出了问题,所以单独渲染反而没有问题)

  • generate 时可以加上 --debug 参数获得更多日志