点击在文件列表显示对应文件/文件夹。
效果 GIF,点击展开(240419 更新)
DataviewJS 代码
let para = dv.el(), isFile = false, folder, vs = [], r = []
const dc = (str, obj)=> Object.assign(document.createElement(str), obj||{})
, check = dc('input', {type: 'checkbox'}), inpu = dc('input', {style: 'width: 100px;'}), dd = dc('span')
, folders = app.vault.getAllLoadedFiles().filter(p=> !p.extension), sele = dc('datalist', {id: 'demo'})
, add = p=> {
const el = dc('span', {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))
})
inpu.setAttribute('list', 'demo'); folders.map(p=> { const el = dc('option'); el.value = p.path; sele.appendChild(el) })
dv.span(' 现在是 '); const btn = dv.el('button', '文件夹'); dv.span(' 是否多选 ')
btn.onclick = ()=> { isFile = isFile ? false : true; btn.textContent = isFile ? '文档' : '文件夹'; mk(1) }
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) : ['/'].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。