1. 多级需求和方案设想及其结论(项目根本)
1. 重复的标签最终只出现一个
1.1. 把入链文件的所有标签都收集到一个数组中
1.2. child::数组去重
2. 获取所有入链的文件
2.1. 获取入链文件的路径
通过打开反向链接面板
通过HTML元素获取
二(⭐):
通过app.metadataCache.getBacklinksForFile(file)获取反链对象
反链对象.data的键名就是入链文件的路径
2.2. 根据入链路径得到入链文件
app.metadataCache.getFirstLinkpathDest(path, path)可以根据path路径获取文件
3. 根据文件得到标签
3.1. 获取对应文件的cache
通过metadataCache.getFileCache()获取
3.2. 通过cache获取所有该文件所有标签
通过全局下的getAllTags(cache: CachedMetadata): string[] | null;获取
4. 导入标签到YAML中, 并且标上为导入的标签
4.1. 如果没有YAML, 则先创建YAML
没有YAML的话, Cache中是没有frontmatter这个键名的
在文档最前面加上---\n---\n
使用editor.replaceRange({0,0},{0,0})来替换开头
4.2. 一: 在#从入链导入的标签:行下放置tags:[]
从cache得到frontmatter的起始位置
4.2. 获取YAML中的文本
获取YAML的位置
先通过正则表达式判断有没有YAML
- 正则表达式:
/(?<=^---\n)(.)*?(?=\n---(\n|$))/gs - 如果没有, 插入YAML, 并且返回位置为
{ end: { line: 1 ,ch:3}, start: { line: 0,ch:0 } } - 如果已经有的, 直接返回YAML从第二行到最后的
---的位置- 通过正则表达式匹配第二个
---的位置- 正则表达式:
/(?<=\n|^)---(?=\n|$)/g, 匹配每个--- - 用js检测第二个---的位置, 保存为index
- 正则表达式:
- 而end为index+3, 再转换成pos
- 返回位置的start依旧是0,0
- 二:
- 直接用上一步找到的中间字符串来计算最后---的位置
- 中间字符串的长度+字符串索引+3=所求位置
- 直接用上一步找到的中间字符串来计算最后---的位置
- 通过正则表达式匹配第二个
通过editor.getRange()获取YAML中的文本
先找有没有#从入链导入的标签:
如果没有, 就在最后插入
用正则表达式替换(?<!^)(?=---)
如果有
5. 用正则表达式匹配原YAML中的那两行或一行
- 正则:
/(?<=\n|^)#从入链导入的标签:.*\n(tags:.*\n)?/g
用字符串:"#从入链导入的标签:\ntags: ["+用,拼接的标签数组+"]\n"替换匹配项
用新的YAML替换原来的YAML
- 通过
editor.replaceRange()替换掉
4.3. 二: 在yaml标签块中插入指定声明的标签
5. 查看是否有标签块语法, 如果没有就创建
正则表达式查找: /((?<=\n|^)tags: *\n)((((?<=\n)- {1,}((.*?) {1,})*((.*?) *)(\n|$))|((?<=\n)#(?<annota>.*?)\n))*)/g
创建
替换---前面的空格为tags:\n
在标签块中查找有没有指定声明的标签块
正则表达式查找: /(#说明1)\n((?<=\n)- {1,}(([^ \n]*?) {1,})*([^ \n]*?) *\n)/g
如果有, 就用新的声明加标签替换掉原来的
用以下字符串替换: #声明:\n- 处理好的标签元素字符串\n
- 标签元素字符串: 用’ ‘链接每个标签数组元素
如果没有, 就在yaml标签块的最后追加声明+新标签
替换$为\n+#声明:\n- 处理好的标签元素字符串\n
1. 调研材料及结论(项目动力)
1. obsidianYAML语法:
child::YAML
2. 查看暴露的api方法:
child::前端查看暴露的api
3. obsidian官方api
child::obsidian官方api合集
4. 调研代办(项目至始至终都要写):
- 数组去重的算法
- 怎么获取入链的文件
- 看看别人的插件是怎么获取的
- 看看
find unlink file插件
- 看看
- 测试直接通过获取页面元素获得入链
- 用代码打开反向链接面板
- 执行打开反向链接面板的obsidian命令
- 折叠连接面板
- 看看别人的插件是怎么获取的
- YAML怎么为指定的标签加上文字说明
- 根据路径获取文件
- getFirstLinkpathDest(linkpath: string, sourcePath: string): TFile | null;
- getAbstractFileByPath(path: string): TAbstractFile | null;
- 怎么查看一个方法的参数
- 怎么修改YAML
- 更优雅地获取editor
- 怎么获取对象中的所有键名
- 正则表达式匹配时候的索引值是最后一个还是第一个
3. 随想(未整理, 灵点子)
4. 项目结论(用以回顾项目以学习)
5. 项目代办(项目完毕后再写)
- 编写匹配yaml标签的正则表达式
- 编写匹配yaml标签中指定声明后面的标签的正则表达式