看不见的 \u2028

今天准备把Rails中把一些markdown的文档导出到hexo的静态博客之中。

本来是一个很简单的任务,为此我写了个Rails的runner脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
require 'erb'
require 'ruby-pinyin'
Post.all.each do |post|
file = File.open("posts/#{ PinYin.of_string(post.title).join('-') }.md", 'w')
contents =<<EOS
---
title: '<%= post.title %>'
date: <%= post.created_at %>
tags: [<% post.categories.each do |tag| %>
"<%= tag.name %>",
<% end %>
]
---
<%= post.content %>
EOS
erb = ERB.new(contents)
file.write(erb.result(binding))
file.close
end

导出来的文本看似也很正常,可是一旦执行hexo g的时候瞬间就会出现类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Unexpected token ILLEGAL
at Function (native)
at Obj.extend._compile (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/nunjucks/src/environment.js:450:24)
at Obj.extend.compile (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/nunjucks/src/environment.js:433:18)
at null.<anonymous> (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/nunjucks/src/environment.js:378:22)
at Object.exports.withPrettyErrors (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/nunjucks/src/lib.js:24:16)
at Obj.extend.render (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/nunjucks/src/environment.js:374:20)
at Obj.extend.renderString (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/nunjucks/src/environment.js:261:21)
at /Users/victory/Documents/victoryxs.github.io/node_modules/hexo/lib/extend/tag.js:56:9
at tryCatcher (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/util.js:24:31)
at Promise._resolveFromResolver (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/promise.js:462:31)
at new Promise (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/promise.js:69:37)
at Tag.render (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/lib/extend/tag.js:55:10)
at Object.tagFilter [as onRenderEnd] (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/lib/hexo/post.js:253:16)
at /Users/victory/Documents/victoryxs.github.io/node_modules/hexo/lib/hexo/render.js:55:19
at tryCatcher (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/util.js:24:31)
at Promise._settlePromiseFromHandler (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/promise.js:489:31)
at Promise._settlePromiseAt (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/promise.js:565:18)
at Promise._settlePromises (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/promise.js:681:14)
at Async._drainQueue (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/async.js:123:16)
at Async._drainQueues (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/async.js:133:10)
at Immediate.Async.drainQueues [as _onImmediate] (/Users/victory/Documents/victoryxs.github.io/node_modules/hexo/node_modules/bluebird/js/main/async.js:15:14)
at processImmediate [as _immediateCallback] (timers.js:367:17)

之类的错误。

我甚至写了个插件去找到底哪篇文章生成出错了。

后来发现一切都是\u2028 这个看不见的字符的锅。一般来说,应该是编辑文档的人复制粘贴的时候不小心引入的。

我们把所有\u2028 删除,再次hexo g,果然世界变得清爽了。

这个问题以前遇到过,不过当时没重视,导致多少年后又浪费了自己小半个下午的时间。

其它参考