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
  1. 正则表达式: /(?<=^---\n)(.)*?(?=\n---(\n|$))/gs
  2. 如果没有, 插入YAML, 并且返回位置为{ end: { line: 1 ,ch:3}, start: { line: 0,ch:0 } }
  3. 如果已经有的, 直接返回YAML从第二行到最后的---的位置
    1. 通过正则表达式匹配第二个---的位置
      1. 正则表达式: /(?<=\n|^)---(?=\n|$)/g, 匹配每个---
      2. 用js检测第二个---的位置, 保存为index
    2. 而end为index+3, 再转换成pos
    3. 返回位置的start依旧是0,0
    4. 二:
      1. 直接用上一步找到的中间字符串来计算最后---的位置
        1. 中间字符串的长度+字符串索引+3=所求位置
通过editor.getRange()获取YAML中的文本

先找有没有#从入链导入的标签:

如果没有, 就在最后插入
用正则表达式替换(?<!^)(?=---)
如果有
5. 用正则表达式匹配原YAML中的那两行或一行
  1. 正则:/(?<=\n|^)#从入链导入的标签:.*\n(tags:.*\n)?/g
用字符串:"#从入链导入的标签:\ntags: ["+用,拼接的标签数组+"]\n"替换匹配项
用新的YAML替换原来的YAML
  1. 通过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
  1. 标签元素字符串: 用’ ‘链接每个标签数组元素
如果没有, 就在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. 项目代办(项目完毕后再写)

  1. 编写匹配yaml标签的正则表达式
  2. 编写匹配yaml标签中指定声明后面的标签的正则表达式

6.