[已解决] 当一篇文章中有多个相同词语时,通过quick add插件的insert after无法插入到特定某行字符之后

遇到的问题

我想要在日记中的“###今日任务”后通过quickadd插件插入待办,但我上文有“### 今日任务总揽”及dataview代码块中引用的三级标题“### 今日任务”,通过修改quickadd插件中的选项,只能在“### 今日任务总揽”这个子标题下插入待办,而无法在“### 今日任务”这个子标题下插入待办。

预期的效果

通过quickadd,将待办插入到“### 今日任务”这个子标题下方

已尝试的解决方案

更改quickadd设置中的选项

PixPin_2024-12-01_12-34-19

原因是 QuickAdd 的这个 Insert after 关键词, 它是这么检测的:

  1. 把用户的 Insert after 关键词去掉换行, 填补前后空白字符, 做成正则表达式
  2. 把原文全都按行拆分
  3. 然后把原文逐行找第一次能匹配到这个 Insert after 字串的行号, 见 ref

所以根据这逻辑, 笔记中只要 “同一行文本的其中一部分, 能符合 Insert after 关键词”, 该行就被视为命中, 此后用户的数据就添加到这个 section


所以目前觉得, 最好就是绕开这麻烦就完了,
把真正感兴趣的 ### 今日任务 稍微改动一下文字, 别让 QuickAdd 提前找到有相同字样的行, 就行


如果确实不打算动笔记框架,
必须要在前面有 ### 今日任务xxx 的情况下, 仍然要匹配后面的准确 ### 今日任务

那需要改 .obsidian/plugins/quickadd/main.js 里的判断逻辑, 这脚本里应该有

// 在第42行左右
async insertAfterHandler(I){let l=await this.format(this.choice.insertAfter.after),b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*`),Z=GW(this.fileContent),

// 在 b=new RegExp 这一句里, 最后给加一个 $ 其余都不动
async insertAfterHandler(I){let l=await this.format(this.choice.insertAfter.after),b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*$`),Z=GW(this.fileContent),

解释:

b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*`)

// 对应源代码的 构造 targetRegex 
const targetRegex = new RegExp(`\\s*${escapeRegExp(targetString.replace("\\n", ""))}\\s*`, );
// 随后 targetRegex 是这么用的
fileContentLines.findIndex((line) => targetRegex.test(line))

// 正则里加个 $ 表示这里要匹配行末, 
b=new RegExp(`\\s*${U0(l.replace("\\n",""))}\\s*$`)
// 于是现在可以匹配到 ### 今日任务 但不能匹配 ### 今日任务总览
1 个赞

谢谢大佬!成了!