Hexo插件之Hexo-UUID

在我之前的博客搬迁纪录中,提到:

Hexo 每次 generate 后 post._id 会变化,导致和多说关联无效,评论无法显示

我的解决方法是给每篇文章手动增加了uuid属性,手动 不符合程序猿懒的个性,不如写个插件了。

有朋友也许会问为什么不用 permanent link 或者 创建时间戳 等作为关联媒介,我想这2个对于我来说都可能不是一直不变的,所以我更倾向于一个我不会去改变的属性,😄。

废话不多说,开始写代码,看完一遍 Hexo API 文档后,可以从 Hexo创建文章后的事件这里入手,Hexo创建文章后会触发new事件,同时携带文章的结构体作为参数:

1
2
3
4
{
"path": "/the/path/your/post/will/stored/in",
"content": "---\ntitle: some title\ndate: 2016-05-20 22:00\ntags:\n---\n"
}

解决方案就是修改此处post内容,并写入path指向的文件地址。

码代码开始,这里就只用ES2015语法写了:

index.js:

1
2
3
4
5
'use strict';
const HexoUuid = require('./lib/hexo-uuid');
hexo.on('new', HexoUuid);

lib/hexo-uuid.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'use strict';
const uuid = require('uuid');
const fs = require('fs');
module.exports = (post) => {
let lines = post.content.split('\n');
let index = lines.findIndex(item => item === 'uuid:');
if (index > -1) {
lines[index] += (' ' + uuid.v1());
} else {
lines.splice(1, 0, 'uuid: ' + uuid.v1());
}
post.content = lines.join('\n');
if (post.path !== false) {
fs.writeFile(post.path, post.content);
}
};

最后,tests/index.js:

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
'use strict';
const should = require('chai').should();
const Hexo = require('hexo');
const HexoUuid = require('../lib/hexo-uuid');
const hexo = new Hexo(__dirname, {
silent: true
});
hexo.on('new', HexoUuid);
describe('Post With User Pre-defined UUID Attribute', () => {
let post = {
path: false,
content: `---
title: I love Hexo!
uuid:
date: 2016-05-20 16:20
tags:
---
`
};
hexo.emit('new', post);
it('Post should have uuid', () => {
let uuidPresence = /uuid: .{36}\n/.test(post.content);
uuidPresence.should.equal(true);
});
});
describe('Post Without User Pre-defined UUID Attribute', () => {
let post = {
path: './tmp/test.md',
content: `---
title: I love Hexo!
date: 2016-05-20 16:20
tags:
---
`
};
hexo.emit('new', post);
it('Post should have uuid', () => {
let uuidPresence = /uuid: .{36}\n/.test(post.content);
uuidPresence.should.equal(true);
});
});

通过以上步骤,总体对Hexo的插件编写有了新的认知,毕竟我也是刚入门Hexo, 插件使用起来就更简单了:

1
npm install hexo-uuid --save

安装完成后,就和普通创建文章一样,hexo new whatever-your-fancy-title-is 就可以轻松拥有UUID属性了。

国际惯例 Github仓库在此

Keep on hacking!

本文使用「CC BY 4.0」创作共享协议,只要在使用时署名,您可以对本文进行转载、节选、混编、二次创作,并允许商业性使用。
本文为作者原创,如果您认为本文对您有帮助,欢迎打赏作者