基于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文档中都有此效果,大大提高了文档的阅读效率。