Hexo自动填充id

记录一下如何修改url为XXX.1.html后,新建博文能够自动填入最新的id。

EN doc

1、背景概述

在最开始搭建博客的时候,为了美观我就把网址的URL改成了纯数字,具体的修改过程详见修改文章访问路径。所以每次在新写一篇文章的时候都要手动填入最新的id。

我每次也记不住最新的id是多少,都打开博客首页然后打开最新发布的一篇文章,看看当前的最大id为多少,然后设置新文章为最大id+1。

这个过程实在是太繁琐并且毫无必要了。我就思考能不能在我新建文章的时候自动填充id。

2、解决思路

思路其实很简单,新建一个文件,里面保存当前最大的id号。

然后写一个脚本。在每次新建完文章后调用这个脚本。

这个脚本的功能也很简单,首先获取id文件里面的当前最大id,然后将新建文章的id修改为最大id+1,然后将最大id+1写入id文件。

但是比较麻烦的是我对前端很不熟悉,不知道怎么在新建文章的时候调用一个脚本,也不清楚怎么读取、格式化新建的文章。

幸运的是我在谷歌的时候搜到了一个Hexo自增id的插件,给我提供一个如何注册事件和如何格式化的思路。

3、试用插件

插件叫hexo-incremental-id, GitHub地址

是一个已经集成好的插件,思路很简单,在每次新建文章的时候去扫描sources文件夹下的文件去获取最大id,然后将新建文章的id修改为最大id+1。

在使用的时候遇到了几个问题,如文档所说,在文章较多的时候会有性能问题,因为会去遍历所有的文章获取最大id。同时对于老的文章会被修改,识别不到设置的id。

同时由于这是一个插件,所以更换写作环境的时候都需要重新安装,有些麻烦。

基于上述问题,我对插件进行了一些改造。非常感谢KagamiChan,给我提供了思路如何注册事件和格式化文章等。

4、插件改造

修改的思路如上

核心文件为index.js,可以看到注册事件的代码为:

1
hexo.on('new', setId)

也就是文章被创建完成之后会调用setId方法。同时使用了hexo-front-matter对文章进行格式化。

只需要修改setId方法即可,修改完的代码比较简单就不赘述了:

文件位置为 themes/icarus/scripts/incremental.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs = require('fs-extra')
const path = require('path')
const fm = require('hexo-front-matter')

const setId = (post) => {
// 这里修改为你想要存放id文件的目录
let idFile = path.join(process.cwd(), 'themes/icarus/scripts/id')
// 当前最大id为取出id+1
let maxId = parseInt(fs.readFileSync(idFile, "utf8")) + 1
// 写回最大id
fs.writeFileSync(idFile, maxId)
// 读取新建文章的内容,这里hexo-front-matter组件会对文章参数进行格式化
let content = fm.parse(fs.readFileSync(post.path, "utf8"))
// 设置新建文章id
content.id = maxId
// 写回文章内容
fs.writeFileSync(post.path, fm.stringify(content))
}

// 注册事件
hexo.on('new', setId)

注意 要新建themes/icarus/scripts/id文件,将里面的值修改为当前系统的最大id。

5、测试总结

执行hexo n “test”后,可以看到新建的文章中已经自动填充了id,同时id文件的值也+1了,成功运行,后续就不需要再手动记最大id了。


# Hexo

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×