1
0
2026-01-10 14:30:32 -06:00

86 lines
2.4 KiB
JavaScript

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,
};