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 | return promise.then(content => { |
我发现在 execFilter
之前 data
还是正确的,但之后就不正确了,说明问题出在 execFilter
中
我搜索到了好几个 before_post_render
场景中出现的 filter,最终发现问题出在 node_modules/hexo-pangu-spacing/index.js
的如下代码中
1 | hexo.extend.filter.register('before_post_render', function(data) { |
正是这句 spacing 导致了问题,注释掉之后就正常了
看到这里有人可能会说不对啊之前把 pangu 关了不是没问题吗???
我对此也产生了疑问,于是我把 next 主题配置中的 pangu 关了又试了一次,惊奇地发现关了之后居然输出了加在 pangu 里的日志!!!
这说明主题配置中的 pangu 和 hexo-pangu-spacing
插件没有关系
解决
查阅相关 pangu 文档后发现 pangu 不支持直接对 markdown 使用
hexo-pangu-spacing
在 render 之前直接调用 pangu 是有问题的,于是我把这个插件卸载了
如果要用 pangu 的话直接在主题配置文件里打开即可
经验
这番排查给了我一些找渲染问题的经验,在此记录如下
可以使用 hexo render 指令渲染文件(但在此例中没有用处,因为是 filter 而非 renderer 出了问题,所以单独渲染反而没有问题)
generate 时可以加上 --debug 参数获得更多日志