1. 多级需求和方案设想及其结论(项目根本)
1. 对已经有这种现象的库, 进行合并
1.1. 一键对全库进行合并
算法一:
获取库中所有的标签, 保存为数组
遍历库中所有的标签
如果该标签不用合并, 则do nothing
如果该标签要合并
- 检查该标签’是否存在’, 是就跳过
- 标记这些合并的标签们为’unexist’
- 使用map存储这些标记的键值对
- 在遍历数组后面追加合并出来的新标签们
- 收集新旧标签的Map对象中存储的所有键值
- 给这些键值去重, 得到不重复的新标签们
遍历到头即成功
算法二:
遍历全库的标签
检查该标签’是否已扫描’ , 是就跳过
如果不要合并, 则标记该标签为’已扫描’
如果要合并, 则
- 合并之后中止遍历
- 重新获取全库的标签
- 但不清除标记
- 重新开始遍历
遍历到头则成功
1.2. 二:
利用新建标签的机会, 每次合并库中的一部分, 久而久之就合并完了
2. 从根本解决产生这种现象
2.1. 每手动新添加一个标签, 就用该标签中的同义词去搜索相关标签, 并将其合并
2.2. 获取刚创建的标签
使用metadata下的onapi可以获取file和cache
获取该文件的所有标签, 转为标签数组
选择适合的触发时机, 只要保证创建完之后能够触发就行了
主要靠手动触发
2.2. 可选:
导入关键字的同时进行合并
3. 遍历文档中所有标签, 以一个文档中其中一个标签为单位, 去合并
4. 根据一个同义组标签能够找到与其有交集的同义组标签
4.1. 解析源标签, 得到多个关键字
解析得到代表
解析代表, 得到多个同义词
child::把同义词标签分割为多个关键字(完毕)
4.2. 根据这些同义词去找到目标标签组
4. 得到库中所有的标签
遍历每一个标签e
排除掉算法上已经不存在的标签
检查该标签是否已经被标记了不存在, 是就跳过遍历该标签
解析该标签, 去掉所有的父类, 只留下最后一层, 作为代表, 拿来给正则表达式判断
用split('/'), 去返回数组的最后一个元素作为代表
用正则表达式匹配代表, 成功就保存该原标签
用所有关键字拼装成一个或逻辑的正则表达式
遍历每一个关键字
- 把该关键字封装成一组正则
- 每一个关键字的正则:
(?<!([^()]*?)(?<=(|\/|#|^|-)关键字(?=-)(?![^()]*?))|(?<!([^()]*?)(?<=-)关键字(?=)|$|-|\/)(?![^()]*?))
- 每一个关键字的正则:
保存到每一个组正则到数组中
用或运算符链接每一组正则
- 用join(’|‘)方法
选择是否开启忽略大小写模式, 符号:i
5. 只要找到的同义组标签大于一个, 就需要合并
6. 能够合并一群有一个同义词完全重复的不同标签
6.1. 解析这些标签, 得到多组同义词数组✔
取标签的代表
用split('/'), 去返回数组的最后一个元素作为代表
遍历代表们, 用数组的split(’-‘)方法
6.2. 多组同义词数组去重
Set去重
6.3. 用这些同义词拼接成一个同义组代表标签
用join(’-‘)方法
6.4. 每个原标签都对应一个新标签
替换每个原标签的最后一层为新代表
用replace替换掉旧代表为新代表
用键值对把新旧对应起来, 保存在Map对象中
6.5. 替换这群标签为新的标签
遍历这些标签
调用tag-wrange的图形化界面
往图形化界面内添加新的标签名字
直接修改input标签的value为该标签所对应的新标签
程序点击确定
获取界面框:.page>.content-area>input
获取按钮, 选择器: [data-name=js-ok]
新建鼠标事件: let click = new MouseEvent('click');
3.5. 模拟点击:obj.dispatchEvent(click);
等待执行完成, 步进调用下一个修改标签api
child::等待标签重命名后, 再进行下一个重命名
7. 特殊情况处理:
7.1. 如果当前文档中就存在有交集的同义词组, 则需要rename的标签就可能重叠争✓
问题不大, 算了
7.2. 会导致其中一个标签重命名了其他标签, 而当前文档的另外某个标签也被重命名了, 万一再重命名已经不存在的标签会怎么样✓
有算法动态获取当前标签
7.3. 如果当前文档中有重复个标签, 会导致重复选这些相同标签✓
不要紧
1. 调研材料及结论(项目动力)
2. obsidian api
- 如果一个文档中有多个重复标签, 则通过getAlltags()返回的标签也会有重复个
3. obsidian的标签机制:
- 如果一个标签有父标签, 则它必定连同它的父标签一起出现, 不能单独出现子标签
- 如果单独指父标签, 则父标签不能有子标签
5. 调研代办(项目至始至终都要写):
6. 这个项目的与“一键插入同义词标签”的api:“根据一组关键词找相关同义词”的区别:
6.1. 结果同义词标签与关键词的关联
- 这个项目要找到包含一模一样(注释内容都一样)关键词的同义词标签
- 那个项目要找到的同义词标签中的关键词和原关键词在注释内容上可能有差异
6.2. 关键词组的区别
- 这个项目的关键词可能会带有注释内容
- 那个项目的关键词不可能带有注释内容
3. 随想(未整理, 灵点子)
1. 项目结论(用以回顾项目以学习)
1. 两个有交集的集合合并后任然可能与别的集合有交集
5. 项目代办(项目完毕后再写)
- 在这个项目中复用“一键导入同义词标签”中的api
- 传入原来的Set和传入数组,哪个性能好
- 性能评估手段(内存,速度)
- 开关:“是否传入场景标签”
- 传入原来的Set和传入数组,哪个性能好