我的博客几年前从 wordpress 迁出后, 就一直在使用 Hexo 框架.
不得不说 Hexo 确实非常省心, 我也还算成功地将主要精力集中在了内容创作上, 写了不少文章.
SSG 生成的静态页面直接托管到 Cloudflare Pages/GitHub Pages/Vercel 中任意一个, 就能实现免维护还免费的个人博客了.
最近心血来潮, 重新设计了一下我博客的主页, 关于页, 同时换到了新的 Cactus 主题, 在迁移中还是发现了新旧参半的一些小问题, 本文主要记录其中可能有一定通用性的解决方案, 一些根据个人偏好改 css 之类的琐事就不再赘述.
虽然 Hexo 及其主题用的是我不太熟悉的 ejs 和 stylus 框架, 只能改改简单的 bug, 但 Hexo 的插件脚本还是普通的 js, 比较容易上手.
Hexo 的所有插件以文件的形式写在博客根目录的 scripts/xxx.js
中即可, Hexo 会自动识别.
添加图片标题
在本博客以前的 Fluid 主题下, 图片下方会显示图片对应的标题, 类似下面这样:
我之前写博客时已经添加了不少这样的标题, 但 cactus 没有选项启用这个图片标题.
于是按照 Hexo 的 Extension API 写了如下脚本, 注册一个 post 渲染成 HTML 以后的 Hook, 此时正则匹配 img
标签, 往后追加一个 caption 说明即可.
1 | hexo.extend.filter.register('after_post_render', function(data) { |
与 Markdown 兼容的提醒块
Fluid 主题中, 可以使用 {% note success/info/warning... %}` 和 `{% endnote %}
块包裹一段文本, 实现下面的效果:
然而, 这个语法在我迁移到 cactus 后直接导致了生成错误, 因为 Hexo 不知道这个块该如何处理. 当然对于大部分 Markdown 编辑器, 也只能显示原本的内容, 不能正确地渲染标签.
有一些插件可以以各种不同的语法重新加入 Fluid 中的提醒块效果, 但和 Markdown 都不兼容, 并不理想.
我经过一番[搜索](How can I create a text box for a note in markdown?), 选择了 > ℹ️
和> ⚠️
这种方案. 也就是我直接在博客中写入 > ℹ️这是一条提醒
, 在原版 Markdown 中会被渲染成正常的引用块:
我再编写 Hexo 插件, 如果识别到这样的引用块, 就替换成更好看的形式, 如下:
这是一条提醒
具体代码全文较长, 关键部分是使用正则匹配 Markdown 文件中的 > ℹ️
和> ⚠️
, 并替换成对应的 div + css:
1 | var md = require('marked').marked; |
如此便实现了效果好看, 且和原版 Markdown 兼容的提示块效果.
版权提示
我写的文章选择使用 CC BY-NC-SA 4.0 发布, 所以可以在每篇文章末尾加个说明, 顺便也能放个打赏链接. 这个功能 cactus 也没有, 但自己实现起来非常简单:
1 | hexo.extend.filter.register('before_post_render', function(data) { |
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/hexo-config-plugin/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬