48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
|
const frontMatterRegex = /^---\n(([^\n]|\n)*?)---\n/;
|
||
|
const yamlKvRegex = /^\s*(\w+):\s*(.*)/;
|
||
|
const yamlListItemRegex = /^\s*-\s+(.+)/;
|
||
|
|
||
|
/**
|
||
|
* 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 lines = frontmatterText.split("\n");
|
||
|
let inTagsSection = false;
|
||
|
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.split(/,\s*/).includes("template")) {
|
||
|
return true;
|
||
|
}
|
||
|
} else {
|
||
|
inTagsSection = false;
|
||
|
}
|
||
|
}
|
||
|
const yamlListem = yamlListItemRegex.exec(line);
|
||
|
if (yamlListem && inTagsSection) {
|
||
|
// List item is 'template'? Yay!
|
||
|
if (yamlListem[1] === "template") {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// Or if the page text starts with a #template tag
|
||
|
if (/^\s*#template(\W|$)/.test(pageText)) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|