【已解决】DataviewJS 提取符合条件的单行内容分割展示,但是图片无法展示,只展示出文件名

遇到的问题

从咖啡网站得到了一个js代码可以定位到文中的行内容并提取,但是实践以后发现无法展示图片,自己用GPT尝试进行修复无果,只能来论坛求助。

预期的效果

预期效果如图,希望可以通过对单行的检测来把一行的内容进行分割展示。

源码模式如下

从我的思考来说,不知道能不能检测"!“符号以前的标签放到dataview表格的标签栏。”!“到”]]"的图片放到dataview图片栏展示。后面部分的文字放到备注栏展示。能做到我预期的效果。

已尝试的解决方案

已尝试的方案只能达到如下效果

现有的代码如下

// 整个代码是先筛选符合标签的笔记,再筛选笔记中的行内容是否具有标签,然后将文件名和行显示在表中。 
// 参考用//注释开关指定查询范围
//tag1限定笔记文件,tag2限定行内容

// 获取指定文件夹中的所有md文件,支持二级目录
const files = app.vault.getMarkdownFiles().filter(file => file.path.includes("日记"))
// 预设标签1,从而限定笔记文件
const tag = "#转场"
// 将指定文件夹中,带有标签1的文件筛选出来
const taggedFiles = new Set(files.reduce((acc, file) => {
    const tags = app.metadataCache.getFileCache(file).tags
    if (tags) {
      let filtered = tags.filter(t => t.tag === tag)
      if (filtered) {
        return [...acc, file]
      }
    }
    return acc
}, []))

//创建一个包含文件名和包含所需标记的行的数组
let arr = files.map(async(file) => {
  // 读取限定后的文件,并将其所有内容作为字符串获取
  const content = await app.vault.cachedRead(file)
  //将所有内容转换为行的数组,并提取包含标签“#tag2”的行 
  let lines = await content.split("\n").filter(line => line.includes("#转场")) 
    // 删除行中的标记和前置空格,以便于在表中显示。其中“-”是为了删除行中的“-”,“#tag2”是为了删除行中的“#DEF”,“  ”是为了删除行中的空格。
  for(var i=0; i < lines.length; i++) { 
    lines[i] = lines[i].replace(/- /g, '');
    lines[i] = lines[i].replace(/  /g, '');
    lines[i] = lines[i].replace("#转场", '');
  }
  //删除被上步骤替换后形成的空行
  console.log(lines)
  // 返回包含标记的行的文件名和行的数组 
  return ["[["+file.name.split(".")[0]+"]]", lines]
})

//解析promises并构建表 
Promise.all(arr).then(values => {
console.log(values)
// 过滤掉没有“#tag2”的行
const exists = values.filter(value => value[1][0])
//构建表,显示文件名和行 
dv.table(["File", "Lines"], exists)
})
1 个赞

感谢回复,可能我还是需要单独去补一下js知识。。。

1 个赞

简单的思路我把示例文件传到“DataviewJS 的传参与复用”蓝奏云链接里了,名为“dv-标签.js”,同话题下有说明,供你参考。

一般的思路是用正则匹配到的图片作为 .split() 的值,将符合 tag 的行再切为两部分,return [第一部分, 符合正则匹配的部分, 第二部分],dv.table,这种不需要写在列表里。你可依此在简单的思路上作一些调整。

嗯嗯,感谢分享,我再研究研究你提供的js学习一下,感恩。