基于Hexo的wiki文档
在obsidian建立wiki文档,在使用了Hexo的网站中发布。双中括号不是markdown的语言,因此需要自己写代码进行转换。 ## 问题 以multigrid文件夹下的基本定义.md
文档为例,hexo会为它生成链接www.example.com/wiki/multigrid/基本定义.html
,因此,wiki格式写成[[基本定义#定义1|定义4]]
,md格式写成[定义1](基本定义.html#定义1)
均可生成正确的跳转链接,生成的链接为%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E5%AE%9A%E4%B9%89html#%E5%AE%9A%E4%B9%891"
,它是基本定义.html#定义1
的转码。 ## 方法 现在,我要为hexo-stellar主题加入这一功能,在hexo渲染文档之前将[[基本定义#定义1|定义5]]
替换换为[定义1](基本定义.html#定义5)
,hexo就能正确渲染文档了。当wiki链接两端带有符号"`"时,要求显示源码,因此忽略wiki链接的替换,例如[[基本定义#定义1|定义2]]
。 ## 代码 在文件scripts/main.js
加入如下代码即可。
function wikiprocess(data) {
content = data.content;
var items = content.match(/(?<![`])\[\[(.*?)\]\](?![`])/g);
console.log(content.content);
if (!items) return;
var items_new = [];
for (var i = 0; i < items.length; i++) {
item = items[i];
item = item.slice(2, item.length - 2);
a = item.split('|');
link = a[0];
if (a.length == 2) {
var name = a[1];
} else {
var name = link;
}
items_new.push(`<a href="${link}">${name}</a>`);
}
for (let i = 0; i < items_new.length; i++) {
item = items[i];
item_new = items_new[i];
console.log(item);
console.log(item_new);
content = content.replace(item, item_new);
}
data.content = content;
return data;
}
var processSite = function (data) {
return wikiprocess.call(this, data);
};
hexo.extend.filter.register('before_post_render', processSite);
## 效果将文档中的语句[[2023-02-08-零碎笔记#清理仓库历史|清理仓库历史]]
转换成了超链接清理仓库历史,达到了想要的效果。
有待改进
- 鼠标悬停预览目标页面。很多wiki文档中都有此效果,大大提高了文档的阅读效率。