点击在文件列表显示对应文件/文件夹。
效果 GIF,点击展开(240419 更新)
DataviewJS 代码
let para = dv.el(), isFile = false, folder, vs = [], r = []
const dc = str=> document.createElement(str), check = dc('input'), inpu = dc('input'), sele = dc('datalist'), dd = dc('span')
, folders = app.vault.getAllLoadedFiles().filter(p=> !p.extension).map(p=> {
const el = dc('option'); el.value = p.path; sele.appendChild(el); return p
})
, add = p=> {
const el = dc('span'); el.textContent = ` ${p.name||'全库'}`; el.style.cursor = 'pointer'; vs.push(p); dd.appendChild(el)
el.ondblclick = ()=> { vs = vs.filter(item=> item !== p); el.remove(); mk(1) }
}
, tra = items=> items.map(p=> { r.push([p.path, p.name]);
isFile ? (p.extension || tra(p.children)) : tra(p.children?.filter(p=> !p.extension))
})
dv.span(' 现在是 '); const btn = dv.el('button', '文件夹'); dv.span(' 是否多选 ')
btn.onclick = ()=> { isFile = isFile ? false : true; btn.textContent = isFile ? '文档' : '文件夹'; mk(1) }
check.type = 'checkbox'; inpu.style.width = '100px'; inpu.setAttribute('list', 'demo'); sele.id = 'demo'
inpu.onchange = ()=> { folder = folders.find(p=> p.path == inpu.value)
if (vs.includes(folder)) { inpu.placeholder = '已选啦'; inpu.value = ''; return }; folder && mk()
}; [check, inpu, sele, dd].map(p=> dv.container.appendChild(p))
const mk = isClick=> { para.empty(); r = []; inpu.placeholder = ''
if (check.checked) { isClick || add(folder); tra(vs) } else { dd.empty(); vs = []
folder ? add(folder) : ['NV'].map(path=> add(app.vault.getAbstractFileByPath(path))); tra(vs)
}; para = dv.paragraph(
'```markmap\n---\nmarkmap:\n height: 900\n---\n'
+ r.map(p=> `${' '.repeat((p[0].split('/').length-1)*4)}- [[${p[0]}|${p[1]}]]`).join('\n')
+ '\n```'
); inpu.value = ''
}; mk()
/
表示根目录。因此,代码中['/'].map(path=>
这部分代表指定默认目录为根目录。
可根据需要自行修改为['文件目录']
或['目录1', '目录2']
等。- 切换到文档层级时可能会卡,需等待。
修改 main.js
const link = `<a href=\"${url}\">${linkText}</a>`; /* 改为
const bta = path=> app.internalPlugins.getEnabledPluginById('file-explorer').revealInFolder(app.vault.getAbstractFileByPath(path))
, link = `<button onclick="(${bta})('${linkPath}')">${linkText}</button>`
如果你有 Hover Editor 插件,也可修改 Mindmap NextGen 插件的 main.js 为下面代码:
代码
const bta = path=> { const item = app.vault.getAbstractFileByPath(path)
item.extension == 'md' ? app.plugins.plugins['obsidian-hover-editor'].spawnPopover().openFile(item)
: app.internalPlugins.getEnabledPluginById('file-explorer').revealInFolder(item)
}, link = `<button onclick="(${bta})('${linkPath}')">${linkText}</button>`
效果是点击 MD 文档出现小弹窗:
保存 main.js,重启 Ob。