dataview:借助AI实现的,展示文本内容的画廊,以及类kanban视图

准备:

先看画廊效果:

AI的注释写的无敌清楚,跟着修改就行了,不行的话扔进去让它改
Pasted image 20250907192407
code:

// 配置参数
const targetFolder = "心情笔记"; // 要筛选的文件夹路径
const maxPreviewLength = 70; // 预览内容的最大字符数
const maxFilesToShow = 20; // 最多显示的文件数量

// 获取所有Markdown文件
const allFiles = app.vault.getMarkdownFiles();

// 筛选指定文件夹中的文件
const filteredFiles = allFiles.filter(file => file.path.includes(targetFolder));

// 如果没有找到匹配的文件,显示提示信息
if (filteredFiles.length === 0) {
    dv.paragraph(`在路径"${targetFolder}"中没有找到文件`);
    return;
}

// 显示标题
dv.paragraph(`#### "${targetFolder}" (共 ${filteredFiles.length} 个文件)`);

// 异步处理每个文件以获取内容预览
const filesWithPreview = await Promise.all(
    filteredFiles.slice(0, maxFilesToShow).map(async (file) => {
        try {
            // 读取文件内容
            let content = await app.vault.cachedRead(file);
            
            // 移除属性字段(frontmatter)
            const frontmatterRegex = /^---\s*[\s\S]*?---\s*/;
            content = content.replace(frontmatterRegex, '');
            
            // 创建内容预览(限制字数)
            let preview = content.replace(/#{1,6}\s/g, ''); // 移除标题标记
            preview = preview.replace(/\[\[.*?\]\]/g, ''); // 移除内部链接
            preview = preview.replace(/\n/g, ' '); // 替换换行符为空格
            preview = preview.trim(); // 去除首尾空格
            
            // 截断预览内容
            if (preview.length > maxPreviewLength) {
                preview = preview.substring(0, maxPreviewLength) + '...';
            }
            
            // 获取文件修改日期
            const modified = new Date(file.stat.mtime);
            const modifiedStr = modified.toLocaleDateString();
            
            // 获取文件大小
            const sizeKB = Math.round(file.stat.size / 1024);
            
            return {
                name: file.name,
                path: file.path,
                preview: preview || "[无文本内容]", // 如果预览为空,显示默认文本
                modified: modifiedStr,
                size: `${sizeKB} KB`
            };
        } catch (error) {
            console.error(`读取文件 ${file.name} 时出错:`, error);
            return {
                name: file.name,
                path: file.path,
                preview: "无法读取文件内容",
                modified: "未知",
                size: "未知"
            };
        }
    })
);

// 创建表格数据
const tableData = filesWithPreview.map(item => [
    // 文件名(带链接)
    `[[${item.name}]]`,
    // 修改日期
    item.modified,
    // 内容预览(排除属性字段后)
    item.preview
]);

// 渲染表格
dv.table(["文件名", "修改日期", "内容预览"], tableData);

// 如果文件数量超过显示限制,显示提示信息
if (filteredFiles.length > maxFilesToShow) {
    dv.paragraph(`*只显示前 ${maxFilesToShow} 个文件,共有 ${filteredFiles.length} 个文件*`);
}

类似看板的视图,只是简单排序

code:

TABLE rows.file.link AS "link"
FROM "Notion/Food"
GROUP BY tags

碎碎念:用的一直闲置的deepseek,现在有好多专业AI,或许它并不理想,但对我够了。base的出现,让我的notion转移大计又开始启动,虽然N年以前我就想转移了,那时候没有数据库真是让人烦躁,现在的base也不完美,但,等待时间吧,时间修正了技术问题,现在有AI,现在的notion比从前快了,导出也快了,bule topaz主题的设置好像也清晰多了,显得从前的我好蠢
发布的小框框看的好费劲啊

1 个赞