function fileHasTag(file, tag) { const cache = app.metadataCache.getFileCache(file); const allTags = (cache?.frontmatter?.tags ?? []).concat( cache?.tags?.map((t) => (t.tag[0] === "#" ? t.tag.slice(1) : t.tag)), ); return allTags.some((t) => t === tag || t?.startsWith(`${tag}/`)); } function fileInParentWithTag(file, tag) { return app.vault .getMarkdownFiles() .filter( (mdFile) => file.path.startsWith(mdFile.parent.path) && fileHasTag(mdFile, tag), )?.[0]; } function campaignData(file) { const campaignFile = fileInParentWithTag(file, "ttrpg/campaign") || app.vault.getFileByPath("index.md"); const data = {}; console.log("campaign file", campaignFile); if (campaignFile) { const cache = app.metadataCache.getFileCache(campaignFile); const fm = cache?.frontmatter; const settingFile = frontmatterLinksToTFiles(campaignFile, "setting")?.[0]; data.players = fm?.players; data.gm = fm?.gm; data.title = fm?.title || campaignFile.basename; data.system = fm?.system; data.setting = fm?.setting; data.settingFile = settingFile; data.file = campaignFile; data.link = app.fileManager.generateMarkdownLink( campaignFile, file.path, null, data.title, ); } return data; } function frontmatterLinksToTFiles(sourceFile, property) { const links = app.metadataCache.getFileCache(sourceFile)?.frontmatterLinks; if (links) { return app.metadataCache .getFileCache(sourceFile) ?.frontmatterLinks?.filter((l) => l.key.startsWith(property)) ?.map((l) => app.metadataCache.getFirstLinkpathDest(l.link, sourceFile.path), ) ?.filter((f) => f); } else { return []; } } function settingData(file) { const settingFile = fileInParentWithTag(file, "ttrpg/setting") || campaignData(file)?.settingFile || app.vault.getFileByPath("index.md"); const data = {}; if (settingFile) { const cache = app.metadataCache.getFileCache(settingFile); const fm = cache?.frontmatter; data.title = fm?.title || campaignFile.basename; data.file = settingFile; data.calendar = fm?.["fc-calendar"]; data.link = app.fileManager.generateMarkdownLink( settingFile, file.path, null, data.title, ); } return data; } module.exports = { campaignData: campaignData, settingData: settingData, };