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参数获得更多日志