848211120c
Introduction of `tag` and `itags`
61 lines
1.6 KiB
TypeScript
61 lines
1.6 KiB
TypeScript
const yamlKvRegex = /^\s*(\w+):\s*["']?([^'"]*)["']?$/;
|
|
const yamlListItemRegex = /^\s*-\s+["']?([^'"]+)["']?$/;
|
|
const frontMatterRegex = /^---\n(([^\n]|\n)*?)---\n/;
|
|
|
|
/**
|
|
* Cheap YAML parser to determine tags (ugly, regex based but fast)
|
|
* @param yamlText
|
|
* @returns
|
|
*/
|
|
export function determineTags(yamlText: string): string[] {
|
|
const lines = yamlText.split("\n");
|
|
let inTagsSection = false;
|
|
const tags: string[] = [];
|
|
for (const line of lines) {
|
|
const yamlKv = yamlKvRegex.exec(line);
|
|
if (yamlKv) {
|
|
const [key, value] = yamlKv.slice(1);
|
|
// Looking for a 'tags' key
|
|
if (key === "tags") {
|
|
inTagsSection = true;
|
|
// 'template' there? Yay!
|
|
if (value) {
|
|
tags.push(
|
|
...value.split(/,\s*|\s+/).map((t) => t.replace(/^#/, "")),
|
|
);
|
|
}
|
|
} else {
|
|
inTagsSection = false;
|
|
}
|
|
}
|
|
const yamlListem = yamlListItemRegex.exec(line);
|
|
if (yamlListem && inTagsSection) {
|
|
tags.push(yamlListem[1].replace(/^#/, ""));
|
|
}
|
|
}
|
|
return tags;
|
|
}
|
|
|
|
/**
|
|
* Quick and dirty way to check if a page is a template or not
|
|
* @param pageText
|
|
* @returns
|
|
*/
|
|
export function isTemplate(pageText: string): boolean {
|
|
const frontmatter = frontMatterRegex.exec(pageText);
|
|
// Poor man's YAML frontmatter parsing
|
|
if (frontmatter) {
|
|
pageText = pageText.slice(frontmatter[0].length);
|
|
const frontmatterText = frontmatter[1];
|
|
const tags = determineTags(frontmatterText);
|
|
if (tags.includes("template")) {
|
|
return true;
|
|
}
|
|
}
|
|
// Or if the page text starts with a #template tag
|
|
if (/^\s*#template(\W|$)/.test(pageText)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|