近期查看历史文章时,发现有篇文章是 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 () { 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); 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
| --- - uses: actions/checkout@v3 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
|
参考资料