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

实例一

image image

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

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

实例二

得益于 交流向实验性 QuickAdd 批量重命名小标题防止双链断裂 发现的 API。

  • 始终查找全库断裂双链(灰链、未创建链…),如示意图左上角。默认前加“:warning:︎”标识。
    排除 Templater 模板使用语法的双链。

  • 未选择时默认查找当前活动文档所在文件目录未被引文件(全部后缀)。
    故可把代码放在附件文件夹;
    也可把代码所在文档开在旁边,迅速查看多个文件夹。

    示例 GIF,点击展开

    20240305_190155

  • 240418 更新查找框 image

代码
const genSele = (inpu, items)=> {
  const sele = createEl('datalist', {attr: {id: 'demo'}})
  inpu.setAttribute('list', 'demo')
  for (const item of items)
    sele.createEl('option', {value: item.path})
  return sele
}
const inpu = createEl('input', {attr: {style: 'width: 120px;'}})
const folders = app.vault.getAllLoadedFiles().filter(p=> !p.extension)
const sele = genSele(inpu, folders)
dv.container.append(inpu, sele)
let whole = !1, folder
inpu.onchange = ()=> {
  folder = folders.find(p=> p.path == inpu.value)
  if (folder) lookup()
}
/**
dv.el('button', '全库').onclick = ()=> {
  whole = !0; lookup(); whole = !1
  inpu.placeholder = `来源: 全库`
}*/
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
  ).flatMap(([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)=> Object.assign(acc, obj), {})
  const tdata = app.vault.getFiles().filter(p=> {
    if (whole) return p
    else {
      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()

注释掉的一项为查找全库未被引文件按钮,按需启用。

彩蛋

使用 QuickAdd 正则保值替换选单 便捷格式化双链,主要适用于非嵌入的 Wiki 链接。

会,可在原帖示例代码上继续添加新项;

不会,将下面给出的 rgxform 组合分别覆盖替换原帖代码 sus[0]sus[1] 后面的内容。

1、imageimage [[文件路径/Wiki]][[文件路径/Wiki|Wiki]]

rgx = /(?<!!)\[\[([^\|]+?)]]/gm; form = (m, p1)=> `[[${p1}|${p1.split('/').slice(-1)}]]`

2、imageimage

rgx = /(?<!!)\[\[(.+?)]]/gm; form = (m, p1)=> p1.split('|').slice(-1)
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,因为某一列文字过多,其他列的空间太少,换行后不好看