惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Threatpost
GbyAI
GbyAI
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
U
Unit 42
B
Blog
量子位
Scott Helme
Scott Helme
P
Proofpoint News Feed
NISL@THU
NISL@THU
Y
Y Combinator Blog
L
LINUX DO - 热门话题
T
The Exploit Database - CXSecurity.com
PCI Perspectives
PCI Perspectives
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
AI
AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cloudbric
Cloudbric
L
LangChain Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cisco Talos Blog
Cisco Talos Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
S
Secure Thoughts
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
AWS News Blog
AWS News Blog
C
Check Point Blog
Hacker News: Ask HN
Hacker News: Ask HN
雷峰网
雷峰网
F
Full Disclosure
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
V2EX - 技术
V2EX - 技术
Webroot Blog
Webroot Blog
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The Cloudflare Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
O
OpenAI News
博客园 - 叶小钗
N
News | PayPal Newsroom
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Vercel News
Vercel News
小众软件
小众软件

半方池水半方田

小球称重问题及其引申的思考 蓝色的结构色 病毒是不是生物? 把博客发布交给 GitHub Actions 省外居民身份证的补换领(苏州) Vercel 应用实践学习 通过与 Keycloak 配合实现博客文章的受限访问功能 非公开的文章 Soft Mode 非公开的文章 Strict Mode 试试用代码块在 Hexo 中插入实况照片 动态图片测试 Hexo-Butterfly 主题 Preloader 加载页定制 Keycloak 的部署以及 Hexo-Butterfly 网页应用的接入 随机访问文章的实现(Sitemap+本地缓存优化) Authentik 的部署记录 Waline 自建 Auth 认证 记一次行李托运理赔流程(南航) Docker 镜像的制作、拉取与运行 Hexo-Butterfly 主题中对 Algolia 搜索框 Power By 的定制 Hexo 动态加载配置(钩子函数) 设计原则 VSCode 中的配置
hexo-filter-titlebased-link:构建你的数字花园
wuanqin · 2026-04-25 · via 半方池水半方田

3 年前(2023 年),为了尽可能弥补 Obsidian 与 Hexo 之间语法功能适配的隔阂,我探索及开发了 站内文章多款插件,试图缩小两个强大软件的语法隔阂。其中,对于双链功能的语法适配插件 hexo-filter-titlebased-link 最为核心。当时的插件已经可以识别双链的语法结构,并正确链接到文章;后来,自定义链接 HTML 模板功能为链接样式提供更多客制化选项。实质上,这个插件的潜力还没有发挥出来:我们可以读取文章 Front-Matter 中的信息注入到渲染后的双链中;也可以把插件工作时整理的双链信息提取出来,供网站所有者进行数据洞察和数据分析,实现更多有趣的功能。

hexo-filter-titlebased-link v0.3.0 版本之后,插件支持 Front-Matter 信息注入;提供双链信息的获取方式,为 Hexo 主题定制提供页面信息,也可以导出全局 JSON 数据。

Readme Card

项目地址:uuanqin/hexo-filter-titlebased-link

本文可以看做是 hexo-filter-titlebased-link 插件的(非正规的)中文文档,介绍了插件的基本功能,并通过一些示例介绍这些功能可能的玩法。同时欢迎大家提供插件相关的建议,或展示更多有趣的奇思妙想~

通过使用这个插件,每个人都可以打造属于自己的数字花园!我也把一些相关功能的实现思路写了出来。由于代码量以及修改点、个人定制项比较多,所以文章可能不会出现保姆级的详细代码实现,敬请谅解!如有疑问,可留下评论或邮件咨询~

插件的安装与配置

博客项目下打开终端输入并运行以下命令:

1
npm install hexo-filter-titlebased-link --save

然后在 _config.yaml 中加入以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
titlebased_link:
enable: true
attribute_mapping: {}
custom_html:
link_attributes: ""
before_tag: ""
after_tag: ""
before_text: ""
after_text: ""
backlinks:
enable: false
inject_to_post: false
generate_json: ""
export_local: ""

在接下来的章节中,我将会对这些主要的功能进行说明。

插件可以识别页面或文章中的形如 [[Title]] [[Title#Anchor]] 或 [[Title|Alias]] 的双向链接(Wiki Links,Internal Links[1])语法,并将其渲染为指向实际文章的链接,就如同在 Obsidian 中展现的那样。

例子:

1
2
3
4
5
这是 文章 B, 

你可以点击 [[文章 A]],

或 [[文章 A|Any title]].

经过 Hexo 渲染后,HTML 将会为:

1
2
3
<p>这是 文章 B,  </p>
<p>你可以点击 <a href="/p/mypost1_permalink/">文章 A</a>,</p>
<p><a href="/p/mypost1_permalink/">Any title</a>.</p>

可见,插件就是把双向链接的语法直接「翻译」为指向正确链接的 <a> 标签。

插件会排除代码块、公式块、行内代码、行内公式中 Wiki Link 的识别和渲染。测试文章详见:站内文章双链渲染测试

自定义渲染后链接的 HTML 形式

为了能够渲染成更复杂的形式,插件预留有插槽供用户自主定制——通过 custom_html 参数进行配置:

1
2
3
4
5
6
7
8
9
`
${config.custom_html.before_tag}
<a ${config.custom_html.link_attributes} href="/p/mypost1_permalink/">
${config.custom_html.before_text}
my_post_1
${config.custom_html.after_text}
</a>
${config.custom_html.after_tag}
`

例如:

1
2
3
4
5
6
7
8
titlebased_link:  
enable: true
custom_html:
link_attributes: 'class="uuanqin-bilink" target="_blank"'
before_tag: ''
after_tag: ''
before_text: '<span class="bilink-pop-up">弹窗</span>'
after_text: ''

得到的链接是这样的:

1
2
3
4
<span class="bilink-pop-up">弹窗</span>
<a class="uuanqin-bilink" target="_blank" href="/p/mypost1_permalink/">
my_post_1
</a>

gif

关于这个「气泡链接」的小项目,详见 站内文章这篇文章。虽然文章中介绍的是另一个插件,但是自定义插槽的功能是一样的。

通过插槽的方式,我们可以实现链接前后 HTML 块的添加、<a> 属性的添加(如添加 class 属性以调整样式)。但如果我们要求根据文章的特征进行不同形式双链的渲染,那么可以考虑后面的 attribute_mapping 选项进行实现。

将文章 Front Matter 字段内容映射到链接中

通过配置 attribute_mapping,我们可以将文章的 Front-Matter 信息,以 data-xxx 的形式注入到链接中。示例配置如下:

1
2
3
4
titlebased_link:
enable: true
attribute_mapping:
"access.enable": auth

利用这一点我们可以生成不同样式的链接。比如:

img

更进阶地,我们可以将链接指向的文章封面和描述嵌入到相关属性中,并实现小窗预览效果:

little-window260424541dsf1s3df13sad2f.gif

通过多种形式获取/导出关系图谱信息

我认为导出图谱信息这个功能是插件最有用的地方。有了文章的双链信息,我们可以把握住网站文章之间的基本拓扑结构。更自然地,我们会想到实现文章关系拓扑图的绘制。

为博客主题提供文章的双向链接信息

当插件进行以下配置时,我们可以在博客构建时将双链信息存储在内存供主题使用:

1
2
3
4
5
titlebased_link:  
enable: true
backlinks:
enable: true
inject_to_post: true

例如,在 Hexo-Butterfly 主题源代码中,我们可以通过 page.bi_links 可获取当前文章的出链入链信息。其信息结构示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
inbounds:

- id: "project-2026-overview"
title: "Project Overview 2026"
path: "p/2026/04/01/overview/"
- id: "index-garden"
title: "Digital Garden Index"
path: "p/2026/01/15/index/"

outbounds:

- id: "hexo-plugin-guide"
title: "Hexo Plugin Guide"
path: "p/2024/04/12/plugin-dev/"

这里通过一个小小例子,展示如何将双链信息融入页面中。

image.png

在主题源代码目录下 \themes\butterfly\layout\includes\header\post-info.pug 相应位置增加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 双链信息页  
if page.bi_links
if page.bi_links.inbounds.length + page.bi_links.outbounds.length > 0
.meta-thirdline
span.post-meta-separator |
span.post-meta-outbounds
i.fa-solid.fa-right-from-bracket.fa-fw.post-meta-icon
span.post-meta-label= '出链:'
span= page.bi_links.outbounds.length
span.post-meta-separator |
span.post-meta-inbounds
i.fa-solid.fa-right-to-bracket.fa-fw.post-meta-icon
span.post-meta-label= '入链:'
span= page.bi_links.inbounds.length

然后根据需要,微调 \themes\butterfly\source\css\_layout\head.styl 的样式即可。

将双链信息以 JSON 的形式导出(博客输出目录/本地位置)

我们可以将这个双链信息以 JSON 的形式进行导出,可以导出到 Hexo 生成的 public 目录,或本地电脑中的其他位置。

当我们进行如下配置时:

1
2
3
4
5
6
titlebased_link:  
enable: true
backlinks:
enable: true
generate_json: "api/backlinks.json"
export_local: "D:\abc\Desktop\link.json"

JSON 文件将会输出到:

  • Hexo 的 public 目录下的 api/backlinks.json 中,博客发布时我们可以通过 https://your-domain.com/api/backlinks.json 进行访问。
  • 本地电脑的 D:\abc\Desktop\link.json 文件中。

JSON 格式示例:

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
{
"dht11 驱动程序": {
"id": "dht11 驱动程序",
"path": "p/c497cb3f/",
"isDraft": false,
"title": "DHT11 驱动程序",
"attrs": {
"data-category": "嵌入式"
},
"bi_links": {
"inbounds": [
{
"id": "实现阿里云温湿度监控及 led 点灯",
"title": "实现阿里云温湿度监控及 LED 点灯",
"path": "p/de31d8e3/"
}
],
"outbounds": [
{
"id": "stm32 延时函数(freertos)",
"title": "STM32 延时函数(FreeRTOS)",
"path": "p/c5d0cc56/"
}
]
}
}
}

hexo-filter-titlebased-link 插件对草稿箱的文章怎么处理?

对于草稿箱文章,其实处理起来很灵活,每个人都有不同的需求。插件实现了较为通用的形式,如果你有更多的定制化需求,或觉得当前这种形式不够好,欢迎 Issues & PRs!也欢迎直接邮件联系我~

目前插件处理草稿箱文章的方式:

  • 草稿箱中的文章中,JSON 保留节点。
  • 草稿箱文章节点本身将不会存储出链入链信息。
  • 非草稿箱的文章结点,不会将草稿箱文章计算到出链、入链信息中。
  • 在渲染文章双链时,渲染指向草稿箱中文章的链接,但默认路径为 draft_post/。如有此类「链接到草稿文章」情况,请博主处理好相应页面,或配置好 404 页面。

有了双链信息,我们可以轻松的使用各种可视化库绘制博客文章的关系图,比如本站的 站内文章关系图谱

image.png

或者在主题侧边栏中提供当前文章的关系视图:

image.png

首先我们通过插件的 generate_json 将双链信息导出,使其在网络环境下可以访问。为提高性能,可以在 CDN 端设置本地缓存减少网络请求。

全局关系图的实现方式为,在需要插入关系图的页面的 Markdown 中,写好 HTML+CSS+JavaScript 代码,使用 force-graph 库进行关系图绘制。

Hexo-Butterfly 主题的侧边栏关系图的实现不需要修改主题源代码,因为 Butterfly 主题原生自带自定义 widget 的方式进行定制,具体见 自定義側邊欄 | Butterfly。思路也是 HTML+CSS+JavaScript,使用 force-graph 库,通过判断当前路径从而确定显示哪个中心节点,并由此向外展示一级节点。

后记

目前无需在 highlight.exclude_languagesprismjs.exclude_languages 中添加额外配置,插件也正常运作。当然,为了保险起见,你也可以进行相应配置。

文章推荐

更多 Obsidian 语法在 Hexo 中的适配详见 站内文章这篇文章;Hexo+Obsidian 工作流协同请看 站内文章这篇文章

碎碎念

导出双链信息真的只是顺手的事情,想象中的 Obsidian Like 博客其实也没有那么难…

本文参考


  1. Internal links - Obsidian Help ↩︎