obsidian插件开发-链接的显示问题
问题
由于obsidian中插入的链接都是以文件名称作为显示,而hugo博客大部分页面都是index.zh-cn.md,真正的名称保存在front-matter以及父类名称里面。那么带来的问题就是所有插入的链接显示都是 index.zh-cn.md而不是真正的名称。
例如 [index.zh-cn](../../用obsidian管理hugo文章小技巧/index.zh-cn.md)
, 显示效果就是 index.zh-cn,但是实际上我们想要显示的名称是用obsidian管理hugo文章小技巧
。
为了解决这个问题,我想到了两个办法。
1 在插入链接的时候,修改链接标题
obsidian按下[[
时,会弹窗让你选择你要插入的文件,这个弹窗类对象我不清除具体是什么对象,但是参阅官方文档知道这是一个SuggestModal
相关的窗口
|
|
可以看到SuggestModal
实现了ISuggestOwner
接口,点进去看发现ISuggestOwner
有两个方法, 在注释中我们可以看到 selectSuggestion
会在做出选择的时候被调用,也就是说我们插入链接的时候,这个方法就会被调用。
|
|
但是知道这个有什么用呢?对我们插入链接有什么帮助?当然有用! 知道了什么方法被调用意味我们可以偷天换日!把原本调用的方法换成我们自己的!
1.1 js最基础的函数替换方法
js有个神奇的 apply()函数,它能够做到在不修改源函数的情况下处理参数。例如
|
|
对于selectSuggestion
,里面有两个参数,一个是泛型T
, 一个是MouseEvent
,我们就可以写成下面这样
|
|
为什么selectSuggestion
藏的这么深?obsidian官方文档中我没有查询到任何有关如何获取的方法,而是在社区论坛求助中得到了这位网友的指点
https://forum-zh.obsidian.md/t/topic/25546/6
2 不修改标题,而是修改显示效果(仅阅读模式生效)
官方示例 https://docs.obsidian.md/Plugins/Editor/Markdown+post+processing
点击右上角的书本图标进入阅读模式,通过Ctrl + I
找到链接的dom,发现链接里面是这样的
|
|
我们可以根据internal-link
获取到a标签,然后把标签的值设置成data-href
里面文档的名称。
可以看到data-href
中指向的目录为../../../编程/Linux2/Ubuntu/Ubuntu安装Samba/index.zh-cn.md
,利用正则表达式就可以提取标题。这里用到了组匹配。
.*\/
对应了../../../编程/Linux2/Ubuntu/
,因为没有加问好,所以会贪婪匹配(.*)
对应了Ubuntu安装Samba
的内容\/index.zh-cn.md
对应了/index.zh-cn.md
,其中/
用了反义符号
写成代码就是
|
|
总结
- 第一种方法虽然能够利用suggestion来替换标题,但是只能在首次插入的时候替换,当我们在obsidian中修改文档标题名称时候,并不会再次触发suggestion引发修改(路径会修改,但是标题不会,因为修改的方法是在suggestion中定义的),因此有一定的弊端。
- 第二种方法只能在阅读模式下生效,我们发布文档到hugo之后仍然显示的是index.zh-cn.md,除非手动修改hugo的渲染方式
render-link.html