hexo-url-link-wikilink-obsidian-解决方案

前言

网上的各种插件都不太好用,自己写了一个

因为过程中用到了hexo的辅助函数,所以只能给hexo用,但是内部逻辑是一样的,欢迎大佬移植

源代码

编辑站点目录下,新建一个scripts文件夹

1
cd myblog/scripts

新建一个001_fix_link_cdn.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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

"use strict";
const ob = hexo.config.obsidian_link;

// [label](/hexo-url-link-wikilink-obsidian-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/../]/g;

/%20匹配%20[](xx) 形式
const reg_posts =
/\[\s*([^\x00-\x1f\x7f]*?)\s*\]\(\s*(?!\S+:\/\/)(.+?)\.md\s*\)/g;

/*
匹配 [](/hexo-url-link-wikilink-obsidian-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/../s+/g,%20/^%20各种空格替换成%20
];

/**
%20*%20文章渲染之前批处理%20替换链接,修复路径
%20*/
hexo.extend.filter.register("before_post_render",%20(data)%20=>%20{
%20/%20加%20url_fix%20以避免在首页预览时链接错误
%20const%20url_fix%20=%20ob.url_fix_enable
%20?%20new%20URL(data.permalink).pathname%20+%20"../"
%20:%20"";

%20/**
%20*%20为[wiki%20link](wiki%20link)做处理,wiki%20link%20to%20md%20link,
%20*%20wiki%20link可以是.md%20.png%20.pdf%20.cn%20.com等等形式,所以先转为普通md%20link,
%20*%20保留.md%20.png等后缀不做处理,在后面再做处理
%20*%20^%20[label](path%20)%20[%20label](wikilink%20)%20后面的%20label可有可无
%20*%20^%20split_label%20-->%20`|%20label`
%20*/
%20data.content%20=%20data.content.replace(
%20reg_wiki,
%20(_match_str,%20path,%20_split_label,%20label)%20=>%20{
%20return%20result_format("",%20url_fix,%20chooseLabel(label,%20path),%20path,%20"");
%20}
%20);

%20/**
%20*%20为[](xxx)做处理去除.md后缀
* ^ [xxx](/hexo-url-link-wikilink-obsidian-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/../xxx) [label](https://webdav-1309345210.file.myqcloud.com/assert/hexo-url-link-wikilink-obsidian-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/../path)
%20*/
%20data.content%20=%20data.content.replace(reg_posts,%20(_match_str,%20label,%20path)%20=>%20{
%20return%20result_format(
%20ob.posts_prefix,
%20url_fix,
%20chooseLabel(label,%20path),
%20path,
%20ob.posts_extend
%20);
%20});

%20/**
%20*%20为附件assets:%20pdf/json等做处理,修改为cdn
%20*%20不处理md%20link%20/wiki%20link
%20*%20^%20[](xxx.pdf) [label](path)
* path xxx.pdf xxx.docx xxx.json etc.
*/
data.content = data.content.replace(reg_assets, (_match_str, label, path) => {
return result_format(
ob.assets_prefix,
url_fix,
chooseLabel(label, path),
path,
ob.assets_extend
);
});

/**
* 替换掉所有的![label](https://webdav-1309345210.file.myqcloud.com/images/hexo-url-link-wikilink-obsidian-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/../path)格式,修改为cdn
* ^ ![label](https://webdav-1309345210.file.myqcloud.com/images/hexo-url-link-wikilink-obsidian-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/../path)
*/
data.content = data.content.replace(reg_img, (_match_str, label, path) => {
return (
"!" +
result_format(
ob.img_prefix,
url_fix,
chooseLabel(label, path),
path,
ob.img_extend
)
);
});

return data;
});

function chooseLabel(label, path) {
//如果label不为空, return label
return label ? label : path;
}

function result_format(prefix, url_fix, label, path, extend) {
var fianl_link = (prefix + url_fix + path + extend)
.replace(reg_url_format[0], "/")
.replace(reg_url_format[1], "/")
.replace(reg_url_format[2], "%20");
var result_str = "[" + label + "](" + fianl_link + ")";
return result_str;
}

配置参数

在站点目录下的_config.yml文件末尾,加入如下内容(默认):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ================custom scripts==============================
# cdn提供商存储设置 see https://github.com/lzuliuyun/hexo-image-cdn
# prefix 静态文件访问的前缀,用于标签解析解析。例如:http://7xo6lp.com1.z0.glb.clouddn.com/images
# extend 用于生成缩略图或加水印等操作的参数。具体请参考https://developer.qiniu.com/dora/manual/3683/img-directions-for-use
# 注意link应当不以`/`结尾
obsidian_link:
# 修复首页预览链接出错的问题
url_fix_enable: true
# 指定到images目录,例如https://webdav-1309345210.file.myqcloud.com/images
img_prefix: "https://webdav-1309345210.file.myqcloud.com/images"
# 默认: ""
img_extend: ""
# 指定pdf json等文章内引用的附件类型
assets:
- doc
- pdf
- json
- docx
assets_prefix: "https://webdav-1309345210.file.myqcloud.com/assert"
assets_extend: ""
posts_prefix: ""
posts_extend: ""
# ================end custom scripts==============================

修改hexo配置

在站点目录下的_config.yml文件,有几个参数需要设置。

这些参数,有一部分是为了解决hexo自己年久失修的bug,另外一部分是为了配合脚本使用

1
2
3
4
5
# 请带一个'/'前缀,修复hexo自己的链接问题
# 请带一个`/`后缀,或者以.html为后缀,即必须需要有后缀
# 中间是啥都可以,随便给出一些可选项
# '/:year/:month/:day/:title/' | '/:abbrlink/' | '/:name/' | '/:slug/' | <another link>
permalink: "/:name/"
1
2
3
4
5
6
7
8
# 建议设置:美化 URL
# 注意,同时需要更改markdown 渲染器的设置 markdown-it
pretty_urls:
# 是否在永久链接中保留尾部的 index.html,设置为 false 时去除
trailing_index: false
# 是否在永久链接中保留尾部的 .html, 设置为 false 时去除 (对尾部的 index.html无效)
trailing_html: false

1
2
3
# 图片文件夹 see https://hexo.io/zh-cn/docs/asset-folders
# 因为编写了脚本,用不着这个了,为避免冲突设置为false
post_asset_folder: false
1
2
3
4
5
# relative_link的意思是相对链接
# 默认情况下,Hexo 生成的超链接都是绝对地址。
#
# 通常情况下,建议使用绝对地址(设置为 false)。
relative_link: false
1
2
3
4
# hexo-renderer-markdown-it
markdown:
plugins:
# 将其他同类型插件给注释掉

正则表达式解释

1
2
3
4
5
6
7
8
/* 
\s* 去除两侧的空格
[^\x00-\x1f\x7f] --> \x00-\x1f去除乱码的控制字符,x7f也是一个乱码字符
path: ([^\x00-\x1f\x7f]*?) --> 除乱码字符外的所有字符,*?代表label可能为空
label: (.+?) --> 除换行符外的其他字符
链接中包含 :// 的不匹配,来排除超链接
*/

写作方法

图片都放在一个固定文件夹内,我自己放在source/images

(可选):将这个文件夹images上传到腾讯云cos,配置img_prefix还解决了图床问题

感谢

感谢 https://github.com/lzuliuyun/hexo-image-cdn

感谢 https://github.com/2-3-5-7/hexo-relative-link

此代码参考了 hexo-image-link、hexo-asset-link