quickaddjs 能否读取MD文件的内容

在capture format里,现在是这样:
let aTexts = [“待办:zap:”,“待办”,“灵感”,“消费”,“摘录” ,“留影”,“软件”,“账号”];
let choice = await this.quickAddApi.suggester(aTexts, aTexts);

想扩充时,总是修改quickadd的配置,较麻烦,打算改为从一个配置md里读入atexts的内容。
md可考虑的方式:
1, 取某heading下的内容作为数组

quickadd配置

dfdf
dkfjdk
dfjkdjf

2, 不能,就直接读取整个md,一行一个配置
dfdf
dkfjdk
dfjkdjf

1 个赞

能读任意指定文件, 比如有个配置笔记里是

### 任意标题

Choice: 灵感
Choice: 留影
...
Choice: 账号
...

```js quickadd
// let aTexts = ["待办 :zap:","待办","灵感","消费","摘录" ,"留影","软件","账号"];

const config_file = app.vault.getAbstractFileByPath("path/to/配置笔记.md");
const content = await app.vault.cachedRead(config_file);
let lines = await content.split("\n")
						    .filter(line => line.trim().startsWith("Choice: "))
						    .map(line => line.split(':')[1].trim());
let choice = await this.quickAddApi.suggester(lines, lines);
return choice;
```

可以列出所有的 Choice: 条目


读 “指定 heading 下的文本” 技术上肯定能做, 这跟读笔记的全文本没啥本质区别

只是我没找到完全合适的 API:
查到以 app.metadataCache.getCache() 虽可拿到 .headings / .sections … , 但返回数据都跟 “取得指定小标题下的所属段落文字” 的需求不一样

感觉还是直接处理全文吧, 或者简单正则匹配段落就完了

代码替换进去,执行quickadd的该项时,直接提示:未找到相关插件。

@Probe 你有在ob测试过吗? THX

测完了发给你的, 刚又试了一遍也正常

需要更详细的报错记录?

如何导出报错记录?

我输入的代码没有错误吧?

直接看 Ctrl+Shift+i 的 log 就行了吧, 简单错误这里直接就显示出来了

截图这里看着正常, 最后别忘了 return choice

是我犯了低级错误,配置文本里,我用了choice,不是Choice,修改后,可以了

如果不介意用dataview的话,可以用 dv.page(fileSelector)['Choice'] 替换手动截取
不过要用 Choice:: 的格式

### 任意标题

Choice:: 灵感
Choice:: 留影
...
Choice:: 账号
...
//dv.page()

dv.paragraph(dv.current()['Choice'].join(', '))

image


  1. Dataviewjs 基本用法 - 经验分享 - Obsidian 中文论坛
  2. Codeblock Reference - Dataview

哦哦, 对, 我的样例确实应该写健壮些, 一个没有匹配到怎么办, 拼写不对怎么办, 多了少了空格怎么办, 不想意外匹配的怎么注释掉, 等等

对, 用 dataview 抓取元数据, 通常比自己写解析要稳, 好办法~

因为是为了分类闪念录入,所以用的是quickadd
录入后,我再用dataview聚合。

quickadd里面的脚本也可以使用 dataview 的方法
代码
image

效果


  1. Overview - Dataview

代码里的(str) =>str 似乎无定义,不能运行

const lines = this.app.plugins.plugins.dataview.api.page("0 资料筛选/0筛取规则0.md")["choice"];
let choice = await this.quickAddApi.suggester((str) => str, lines);

改成这样,但似乎dataview不能返回yam属性数组,我在win运行的效果是空表

const lines = this.app.plugins.plugins.dataview.api.page("0 资料筛选/0筛取规则0.md")["choice"];
let choice = await this.quickAddApi.suggester(lines, lines);

md里的相关部分的内容是:

### 闪电日记选项列表
choice: 待办
choice: 摘录
...
let choice = await this.quickAddApi.suggester((str) => str, lines);

这里的 (string) => str 是 js 的 lambda表达式 (js也叫箭头函数),quickAddApi.suggester 这里接受这种 mapping 函数作为 displayItems

你遇到的问题是 md 里 元数据的格式不对,是 “choice::” 而不是 “choice:”,然后你的路径里有空格最好注意一下

到这个程度其实就是编程和阅读文档的能力了:joy:


https://blacksmithgu.github.io/obsidian-dataview/annotation/add-metadata

请教下:
为什么这个代码,sugest…的第一个参数是lines能正常运行

let lines = await content.split("\n")
            .filter(line => line.trim().startsWith("choice: "))
            .map(line => line.split(':')[1].trim());
let choice = await this.quickAddApi.suggester(lines, lines);

但换dataview取得的数组,传入lines,lines参数就运行不了,要改成这样才能运行:

const lines = this.app.plugins.plugins.dataview.api.page("0 资料筛选/0筛取规则0.md")["choice"];
let choice = await this.quickAddApi.suggester((str) => str,lines);

这是否表示,可以用quickadd获取dataview的静态内容输出,而不象dataview那样,每次都要聚合刷新?

把现在的dataviewjs代码,修改为js quickadd代码,能给出通用方法吗?

另外,若是只有一个选项时,dataview.api.page(。。。)[“dkfjdk”]取回的不是数组,而是串,如何简洁地加入处理这个例外的代码?

@iins
试修改了一段dataviewjs,把dv.都替换成 this.app.plugins.plugins.dataview.api.page
去掉dv.paragraph输出,改为return

把它放到js quickadd里,用quickadd作快速聚合输出,但不成功。
^^^^
修正,能返回内容。

现在要研究的是,dv.table,dv.list,dv.paragraph的输出,能否返回给quickadd