我确实是只放了两行代码,
因为我看您的这篇帖子( DataviewJS 汇总全文及特定标题下内容并解决图片显示痛点 - 经验分享 - Obsidian 中文论坛)需求比我的多,我就试了试删掉那些我不需要的代码(具体删掉的代码见下)
let rgx = /\[.*?\]\((?!http)(.+)|\[\[(.+?)\|(.*?\d+)?/
function extract(str) { let r = []; str.replace(rgx, (m, p1, p2)=> {r.push(p1||p2)}); return r[0] }
files.map(async p=> {
let fc = app.metadataCache.getFileCache(app.vault.getAbstractFileByPath(p.file.path)).headings
.filter(p=> p.level == 2) // 二级标题数组
let i = fc.findIndex(p=> p.heading == term) // 获取标题等于 term 的索引
let A = ( await app.vault.readRaw(p.file.path) ).split('\n') // 分块
A = fc[i+1] ? A.slice(fc[i].position.end.line+1, fc[i+1].position.end.line) : A.slice(fc[i].position.end.line+1) // 截取
A = A.map(p=> p.split( /!|\)|\]\]/ ).map(p=> rgx.test(p) ? extract(p) : p) ) // 再分块
let B = p.file.outlinks.filter(p=> p.embed && !/\.md$/.test(p.path))
for (let i = 0; i < A.length; i++) { for (let j = 0; j < B.length; j++) { let b = B[j].path.split('/');
let dp = /.*?(?:\|)?(.*?)(?:\|)?(\d+)/.exec(B[j].display)
let src = encodeURI(`${app.vault.adapter.basePath}/${B[j].path}`)
A[i] = A[i].map(p=> {
let boo = p.replace( /\.\// ).includes('/') ? p.endsWith(b.slice(-2).join('/')) : p.endsWith(b.slice(-1))
if (boo) { return dp ? `<img width='${dp[2]}' src='${src}'>` : `<img src='${src}'>` } else { return p }
})}; A[i] = A[i].join('') // 合块
}; dv.paragraph(`##### ${p.file.link}\n${A.join('\n\n')}`) // 再合块、输出
})