DataviewJS 查询空文件、空文件夹、断裂双链、特定目录未链接文件

实例一

image image

  • 空文档包括:
    • 大小为 0 的文件(全部后缀)。
    • 仅有空白字符的 MD 文档。
    • 复选框控制是否查询仅有 YAML 的 MD 文档。默认前加“☆”标识,可自行更换标识。
  • 删除按钮默认至系统回收站,方便原路径还原反悔。任何疑问请查看系统回收站。
代码
const KD = (dv)=> {
  const { app } = dv
  const trash = async dFile=> await app.vault.trash(dFile, !0)
  let isFile = !0
  /**
  dv.el('button', '清空').onclick = ()=> items.filter(
    dFile=> isFile === !!dFile.extension
  ).map(dFile=> trash(dFile))
  */
  dv.el('button', '切换').onclick = ()=> { isFile = !isFile; lookup() }

  const items = []
  const check = dv.container.createEl('input', {type: 'checkbox'})
  const form = (dFile, note)=> {
    items.push(dFile)
    const btn = dv.el('button', '删除')
    btn.onclick = ()=> { trash(dFile); btn.textContent = '已删' }
    const emptyFile = `${note||''}[[${dFile.name}]]`
    return isFile
      ? [dFile.parent.path, emptyFile, btn]
      : [dFile.path, btn]
  }
  const table = dv.el('div')
  const lookup = ()=> {
    items.length = 0
    table.empty(); const tdata = []
    app.vault.getAllLoadedFiles().map(dFile=> {
      if (isFile) {
        const fc = app.metadataCache.getFileCache(dFile)
        if (!fc) return
        const { sections: secs, frontmatter } = fc
        if (
          dFile.stat?.size == 0 || dFile.extension == 'md' && !secs
        ) tdata.push(form(dFile))
        if (
          check.checked && dFile.extension && frontmatter && !secs[1]
        ) tdata.push(form(dFile, '☆'))
      }
      else if (!dFile.extension && !dFile.children[0]) {
        tdata.push(form(dFile))
      }
    })
    const thead = isFile ? ['路径', '空文档', ''] : ['空文件夹', '']
    dv.api.table(thead, tdata, table, dv.component)
  }; lookup(); check.onchange = lookup
}
KD(dv)

注释掉的一项为清空空档按钮,按需启用。

实例二

image

  • 始终查找全库断裂双链(灰链、未创建链…),如示意图左上角。默认前加“:warning:︎”标识。
    排除 Templater 模板使用语法的双链。
  • 未选择时默认查找当前活动文档所在文件目录未被引文件(全部后缀)。
    故可把代码放在附件文件夹;
    也可把代码所在文档开在旁边,迅速查看多个文件夹。
代码
const genInputList = (inpu, items)=> {
  const inli = createEl('datalist', {attr: {id: 'demo'}})
  inpu.setAttribute('list', 'demo')
  for (const item of items)
    inli.createEl('option', {value: item.path})
  return inli
}
const BY = (dv)=> {
  const { app } = dv
  const inpu = createEl('input', {attr: {style: 'width: 120px;'}})
  const folders = app.vault.getAllLoadedFiles().filter(p=> !p.extension)
  const inli = genInputList(inpu, folders)
  dv.container.append(inpu, inli)

  let folder
  inpu.onchange = ()=> {
    folder = folders.find(p=> p.path == inpu.value)
    if (folder) lookup()
  }
  const table = dv.el('div')
  const lookup = ()=> {
    table.empty()
    if (!folder || folder == folders[0])
      folder = app.workspace.getActiveFile().parent
    const fdPath = folder.path
    inpu.placeholder = `来源: ${fdPath}`; inpu.value = ''

    const unlinked = Object.entries(
      app.metadataCache.unresolvedLinks
    ).map(([rPath, unlinks])=> {
      const aoa = Object.keys(unlinks)
        .filter(link=> !link.startsWith('<\%'))
      return aoa[0] ? ['⚠︎'+rPath, aoa] : []
    })
    const linked = Object.values(
      app.metadataCache.resolvedLinks
    ).reduce((acc, obj)=> ({...acc, ...obj}), {})

    const tdata = app.vault.getFiles().filter(p=> {
      const sameLevel = p.path.includes('/')
        ? p.path.slice(0, fdPath.length) == fdPath
        : fdPath == '/' // the first level
      return sameLevel && !linked[p.path]
    }).map(p=> [p.parent.path, `[[${p.path}|${p.name}]]`])
    dv.api.table(
      ['路径', '未被引'],
      [...unlinked, ...tdata],
      table, dv.component
    )
  }; lookup()
}
BY(dv)
5 个赞

请教下,断裂双链那段代码,想要限制结果数量,应该怎样加命令呢?谢谢

功能已经足够,只是单纯地限制结果数量,因为库比较大,一下子出来几千条结果,太卡了

image

在最后输出的时候限制一下就行。

1 个赞

谢谢 ,原来slice我放错地方了

求助:我2段代码都不显示具体内容,如图:
image

代码直接复制过来,改为dateview的
image

image

谢谢 终于找到原因了,是「Supercharged Links」插件导致的

这个对我来说还挺有用的,看链接就能大致知道笔记类型、状态等
dataviewjs代码这边能简单修改解决这个冲突吗?不然就只能记得使用代码时暂时关闭插件了

「Supercharged Links」插件没有经过任何设置,一打开,就会让本贴的代码结果空白


插件的GitHub下载链接:Releases · mdelobelle/obsidian_supercharged_links · GitHub
我机翻后的中英双语版:
https://pan.baidu.com/s/1StasbEjqwdSX25-13BLoXQ?pwd=r7C3

它的主要功能是改变库中链接的样式

  • 改变依据:链接指向的笔记的属性值、含的tag、文件路径
  • 变幻样式的地方包括:左侧面板的文件树、顶部的标签页、笔记顶部的属性区、笔记内部的双链
  • 变幻的类型包括:文字的颜色、添背景颜色、添前缀/后缀(可emoji符号)

大佬有兴趣的话请试试

这个我懂,qh() 在后面定义这样也行,学到了:+1:

大佬, dv 的 table 的列距可以控制吗,比如说,某一列不超过一半的空间,或者多少px,因为某一列文字过多,其他列的空间太少,换行后不好看