hexo-url-link-wikilink-obsidian-解决方案
2021年2月23日大约 4 分钟
前言
网上的各种插件都不太好用,自己写了一个
因为过程中用到了hexo的辅助函数,所以只能给hexo用,但是内部逻辑是一样的,欢迎大佬移植
源代码
编辑站点目录下,新建一个scripts
文件夹
cd myblog/scripts
新建一个001_fix_link_cdn.js
"use strict";
const ob = hexo.config.obsidian_link;
// [label](path%20) [ label](wikilink%20) 后面的 label可有可无
const reg_wiki = /\[\[\s*([^\x00-\x1f\x7f]*?)\s*(\|\s*(.+?)\s*)?\s*\]\]/g;
// 匹配 [](xx.md) 形式
const reg_posts =
/\[\s*([^\x00-\x1f\x7f]*?)\s*\]\(\s*(?!\S+:\/\/)(.+?)\.md\s*\)/g;
/*
匹配 [](xxxxx) 形式
*/
// origin: var reg = /\[\s*([^\x00-\x1f\x7f]*?)\s*\]\(\s*(?!\S+:\/\/)((.+?)\.(medias))\s*\)/g;
const medias = ob.assets ? ob.assets.join("|") : "";
const reg_assets = new RegExp(
"\\[\\s*([^\\x00-\\x1f\\x7f]*?)\\s*\\]\\(\\s*(?!\\S+:\\/\\/)((.+?)\\." +
"(" +
medias +
")" +
")\\s*\\)",
"g"
);
/*
匹配 ![]() 形式
*/
const reg_img = /!\[\s*([^\x00-\x1f\x7f]*?)\s*\]\(\s*(?!\S+:\/\/)(.+?)\s*\)/g;
/**
* 结果字符串处理,处理不合格的url链接
*/
const reg_url_format = [
/\\/g, // ^ \ 替换为 /
/(?<!:)(\/\/)/g, //^ //替换为/ ,忽略://格式的超链接
/\s+/g, //^ 各种空格替换成%20
];
/**
* 文章渲染之前批处理 替换链接,修复路径
*/
hexo.extend.filter.register("before_post_render", (data) => {
// 加 url_fix 以避免在首页预览时链接错误
const url_fix = ob.url_fix_enable
? new URL(data.permalink).pathname + "../"
: "";
/**
* 为[wiki link](wiki%20link)做处理,wiki link to md link,
* wiki link可以是.md .png .pdf .cn .com等等形式,所以先转为普通md link,
* 保留.md .png等后缀不做处理,在后面再做处理
* ^ [label](path%20) [ label](wikilink%20) 后面的 label可有可无
* ^ split_label --> `| label`
*/
data.content = data.content.replace(
reg_wiki,
(_match_str, path, _split_label, label) => {
return result_format("", url_fix, chooseLabel(label, path), path, "");
}
);
/**
* 为[](xxx.md)做处理去除.md后缀
* ^ [](xxx.md) [label](path)
*/
data.content = data.content.replace(reg_posts, (_match_str, label, path) => {
return result_format(
ob.posts_prefix,
url_fix,
chooseLabel(label, path),
path,
ob.posts_extend
);
});
/**
* 为附件assets: pdf/json等做处理,修改为cdn
* 不处理md link /wiki link
* ^ [xxx.pdf](https://webdav-1309345210.file.myqcloud.com/assert/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/path)格式,修改为cdn
* ^ ![label](https://webdav-1309345210.file.myqcloud.com/images/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
文件末尾,加入如下内容(默认):
# ================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,另外一部分是为了配合脚本使用
# 请带一个'/'前缀,修复hexo自己的链接问题
# 请带一个`/`后缀,或者以.html为后缀,即必须需要有后缀
# 中间是啥都可以,随便给出一些可选项
# '/:year/:month/:day/:title/' | '/:abbrlink/' | '/:name/' | '/:slug/' | <another link>
permalink: "/:name/"
# 建议设置:美化 URL
# 注意,同时需要更改markdown 渲染器的设置 markdown-it
pretty_urls:
# 是否在永久链接中保留尾部的 index.html,设置为 false 时去除
trailing_index: false
# 是否在永久链接中保留尾部的 .html, 设置为 false 时去除 (对尾部的 index.html无效)
trailing_html: false
# 图片文件夹 see https://hexo.io/zh-cn/docs/asset-folders
# 因为编写了脚本,用不着这个了,为避免冲突设置为false
post_asset_folder: false
# relative_link的意思是相对链接
# 默认情况下,Hexo 生成的超链接都是绝对地址。
#
# 通常情况下,建议使用绝对地址(设置为 false)。
relative_link: false
# hexo-renderer-markdown-it
markdown:
plugins:
# 将其他同类型插件给注释掉
正则表达式解释
/*
\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