hexo title 包含 : 冒号导致的错误

现象

在使用hexo渲染博客时,发现有个页面渲染报错,如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
INFO  Start processing
ERROR {
err: YAMLException: bad indentation of a mapping entry (1:22)

1 | title: hexo title 包含 : 冒号导致的错误
--------------------------^
2 | date: 2022-08-16 14:37:37
3 | tags:
at generateError (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:183:10)
at throwError (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:187:9)
at readBlockMapping (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1182:7)
at composeNode (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1441:12)
at readDocument (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1625:3)
at loadDocuments (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1688:5)
at Object.load (/Volumes/external/git/bivana_blog/node_modules/js-yaml/lib/loader.js:1714:19)
at parseYAML (/Volumes/external/git/bivana_blog/node_modules/hexo-front-matter/lib/front_matter.js:69:23)
at parse (/Volumes/external/git/bivana_blog/node_modules/hexo-front-matter/lib/front_matter.js:50:12)
at /Volumes/external/git/bivana_blog/node_modules/hexo/lib/plugins/processor/post.js:93:18
at tryCatcher (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:544:35)
at Promise._settlePromise (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromise0 (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:649:10)
at Promise._settlePromises (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:729:18)
at Promise._fulfill (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:673:18)
at PromiseArray._resolve (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:127:19)
at PromiseArray._promiseFulfilled (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:145:14)
at PromiseArray._iterate (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:115:31)
at PromiseArray.init [as _init] (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise_array.js:79:10)
at Promise._settlePromise (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:601:21)
at Promise._settlePromise0 (/Volumes/external/git/bivana_blog/node_modules/bluebird/js/release/promise.js:649:10) {
reason: 'bad indentation of a mapping entry',
mark: {
name: null,
buffer: 'title: hexo title 包含 : 冒号导致的错误\n' +
'date: 2022-08-16 14:37:37\n' +
'tags:\n' +
' - hexo\n' +
'categories:\n' +
' - 技术\n' +
'keywords:\n' +
' - 冒号\n' +
' - title\n',
position: 21,
line: 0,
column: 21,
snippet: ' 1 | title: hexo title 包含 : 冒号导致的错误\n' +
'--------------------------^\n' +
' 2 | date: 2022-08-16 14:37:37\n' +
' 3 | tags:'
}
}
} Process failed: %s _posts/技术/hexo/hexo_title_quato.md
INFO Files loaded in 3.38 s
INFO 0 files generated in 3.53 s

几个关键的错误信息为

1
2
3
4
err: YAMLException: bad indentation of a mapping entry (1:22)

snippet: ' 1 | title: hexo title 包含 : 冒号导致的错误\n' +
'--------------------------^\n' +

第一行告诉我们,这是YAML异常
第二行告诉我们,可呢个是title这里出错了

经过测试,在title里去除:冒号后正常,确认是:冒号导致的异常

原因

其实报错信息已经告诉我们了

  1. hexo的元数据title,date,tags这些,使用的是yaml语法描述
  2. yaml的kv使用的就是:冒号这个关键字,因此在value值这里,是禁用:冒号这个关键字的,想更加了解yaml,可以查看yaml官网,结构语法可以查看第 6 章结构产品,其中和本次错误相关在Indicator Characters这里.
  3. 由于在title文章标题里使用了:冒号,导致了yaml的解析异常

解决方案

知道了原因,解决方案就简单了,解决方案有2种

  1. 使用‘’单引号""双引号把title后面的值围起来即可
    1
    title: 'hexo title 包含 : 冒号导致的错误'
  2. 使用html字符替换,其中:冒号对应的html字符为:,其他的html字符体可以参考html转义字符大全
    1
    title: hexo title 包含 : 冒号导致的错误

本人推荐使用方案1

参考文章