Obsidian Dataview 插件的常用 DataviewJS 代码片段集合,可直接复制到笔记中使用。

分栏

将带有指定标签的页面按两列分栏嵌入显示,使用 ad-flex callout 实现并排布局。

const pages = dv.pages("#tool/type").sort(p => p.tool_type_id);
let counter = 0;
let output = "";
 
for (let page of pages) {
    if (counter % 2 === 0) {
        // 如果是偶数(包括0),开始一个新的 ad-flex 段落
        if (counter > 0) {
            output += "</div>\n</div>\n````\n\n";
        }
        output += "````ad-flex\n<div>\n";
    } else {
        // 如果是奇数,添加第二个 div
        output += "</div>\n<div>\n";
    }
    
    output += `\n![[${page.file.path}]]\n`;
    counter++;
}
 
// 处理最后一个 ad-flex 段落
if (counter > 0) {
    output += "</div>\n</div>\n````\n";
}
 
dv.paragraph(output);

利用 MetaEdit 添加按钮

结合 MetaEdit 和 Metadata Menu 插件,在 Dataview 表格中为每行生成可点击的评分按钮,点击后弹出选择器并自动更新 frontmatter 中的 grade 字段。

const { fieldModifier: f } = this.app.plugins.plugins["metadata-menu"].api;
const { update, autoprop, createYamlProperty } = this.app.plugins.plugins["metaedit"].api;
// 评级按钮
const gradeButton = (grade, file) => {
    if (grade === undefined) {
        grade = "⭐⭐⭐";
        createYamlProperty("grade", `'${grade}'`, file.path);
    }
    const btn = this.container.createEl('button', { "text": grade });
    btn.addEventListener('click', async (evt) => {
        evt.preventDefault();
        try {
            const newGrade = await autoprop("grade");
            if (grade !== newGrade) {
                await update("grade", newGrade, file.path);
            }
            btn.textContent = newGrade;
        } catch (error) {
            console.error("更新评分时出错:", error);
            new Notice("更新评分失败,请查看控制台以获取详细信息", 2000);
        }
    });
    return btn;
}
const pages = dv.pages("#obsidian-plugin");
 
// 快捷工具
dv.table(["工具", "描述", "作者", "Github", "评分"], pages
    .sort(p => p.grade, 'description')
    .map(p => [
        p.file.link,
		p.description,
		p.author,
        p.github,
        gradeButton(p.grade, p.file)
    ]));