86 lines
2.4 KiB
JavaScript
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,
|
|
};
|