增加文章时效性检测及更新时间修复

tsvico Lv5

近期查看历史文章时,发现有篇文章是 2018 年写的关于百度云网盘的,现在看来应该是已经失效了,如果增加时效性提示应该会更好一些,于是有了这篇文章

添加时效性检测 js

添加注入器

Hexo 提供了 注入器(Injector),可以将指定的静态代码片段注入到生成的静态页面中。

参考网上的文章,在根目录创建 scripts 文件夹,并创建 injector.js 文件,并添加如下代码

1
2
3
4
5
6
//注入文章过期提示
hexo.extend.injector.register(
"body_end",
`<script src="/js/outdate.js"></script>`,
"post"
);
  • body_end 代表注入到文章开头。
    由于注入的代码有点长,我们就用一个 Javascript 文件单独处理,作为注入的代码片段引入
    -post 代表只注入到文章详情页面中。

添加静态代码片段

在 Hexo 的 source 目录下新建 js 文件夹,新建一个名为 outdate.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
(function () {
//不同的日期显示不同的样式,200 天为黄色提示,400天为红色提示,可以自己定义。
let warningDay = 200;
let errorDay = 400;
// 确保能够获取到文章时间以及在文章详情页
let times = document.getElementsByTagName("time");
if (times.length === 0) {
return;
}
let posts = document.getElementsByClassName("post-body");
if (posts.length === 0) {
return;
}

const updateTime = times[1];
const createTime = times[0];

// 获取系统当前的时间
let pubTime = new Date(
updateTime ? updateTime.dateTime : createTime.dateTime
); /* 文章更新时间戳 */
let now = Date.now(); /* 当前时间戳 */
let interval = parseInt(now - pubTime);
let days = parseInt(interval / 86400000);
/* 发布时间超过指定时间(毫秒) */
//note warning 以及 note danger 是 Next 主题的自定义模板语法,如果使用其他主题,请自行更改样式以达到最佳显示效果
if (
interval > warningDay * 3600 * 24 * 1000 &&
interval < errorDay * 3600 * 24 * 1000
) {
posts[0].innerHTML =
'<div class="note warning">' +
"<h5>文章时效性提示</h5><p>这篇文章最后更新于 " +
days +
" 天前,部分信息可能已发生改变,请注意甄别。</p>" +
"</div>" +
posts[0].innerHTML;
} else if (interval >= errorDay * 3600 * 24 * 1000) {
posts[0].innerHTML =
'<div class="note danger">' +
"<h5>文章时效性提示</h5><p>这篇文章最后更新于 " +
days +
" 天前,部分信息可能已发生改变,请注意甄别。</p>" +
"</div>" +
posts[0].innerHTML;
}
})();

这里在原文基础上调整了代码,优先获取文章更新日期,其次是文章创建日期,此时我们的旧文章就有了时效性提示了

确保文章时间正确

时效性提示是有了,但是怎么保证文章日期的正确性呢,我们是用 git 管理的文章,可以采用 git 更新日期来解决这一问题

解决思路

在 CI checkout 代码时,使用文件最后一次涉及的 commit 时间作为文件的修改时间,进行 mtime 的恢复。

解决方案

1
2
3
4
5
6
7
8
9
10
# .github/workflows/action.yml
---
- uses: actions/checkout@v3
# 如果使用的是GithubAction的actions/checkout,记得加上下面的内容,对仓库历史进行完整的签出
with:
fetch-depth: 0
# 恢复文件修改时间
- name: Restore file modification time
run: |
find source/_posts -name '*.md' | while read file; do touch -d "$(git log -1 --pretty="@%ct" -- $file)" $file; done

代码解释

1
2
3
4
5
6
# 列出需要恢复修改时间的文件
find source/_posts -name '*.md'
# 循环
# 使用 git log -- $file 得到该文件最后修改的commit 并且使用pretty选项获取时间戳
# 使用 touch -d 来将文件的atime以及mtime修改为commit的时间戳
while read file; do touch -d "$(git log -1 --pretty="@%ct" -- $file)" $file; done

参考资料

  • 标题: 增加文章时效性检测及更新时间修复
  • 作者: tsvico
  • 创建于 : 2024-08-31 15:28:38
  • 更新于 : 2024-08-31 15:44:59
  • 链接: https://blog.tbox.fun/2024/1160155932.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论