Changes
3 changed files (+56/-46)
-
-
@@ -34,9 +34,31 @@ (node.path.length === 1 && node.name.endsWith(".ts"));}, }); const metadataParser = new VaultParser({ language(node) { return node.parent.type === "root" && node.type === "directory" && /^[a-z]+(-[a-z]+)*$/.test(node.name); override(node) { if ( node.parent.type !== "root" || node.type !== "directory" || !(/^[a-z]+(-[a-z]+)*$/.test(node.name)) ) { return null; } switch (node.name) { case "ja": return { title: "日本語", language: node.name, }; case "en": return { title: "English", language: node.name, }; default: { return { language: node.name, }; } } }, }); const pageBuilder = new DefaultThemeBuilder("© 2024 Shota FUJI");
-
-
-
@@ -220,7 +220,7 @@ },); }); Deno.test("Should use the language returned by user provided function", async () => { Deno.test("Should overrides", async () => { const fs = new MemoryFsReader([ { path: "en/Foo Bar.md",
-
@@ -236,9 +236,15 @@ const root = await fs.getRootDirectory();const [en, ja] = await root.read(); const parser = new VaultParser({ language(node) { return node.type === "directory" && node.path.length === 1 && /^(en|ja)$/.test(node.name); override(node) { if (node.type !== "directory" || !(/^(en|ja)$/.test(node.name))) { return null; } return { title: node.name === "ja" ? "日本語" : "English", language: node.name, }; }, });
-
@@ -246,7 +252,7 @@ assertObjectMatch(await parser.parse(en as DirectoryReader), { name: "en", title: "en", title: "English", language: "en", }, );
-
@@ -255,7 +261,7 @@ assertObjectMatch(await parser.parse(ja), { name: "ja", title: "ja", title: "日本語", language: "ja", }, );
-
-
-
@@ -45,16 +45,13 @@ */readFrontMatter?: boolean; /** * A optional function to determine the language of a directory or a file. * Macana does not check whether the resulted language tag is valid. * @returns If this function returned a falsy value, Macana treat the directory or the file * has no specified language. If this function returned `true`, Macana uses the file * name or directory name as a language. If this function returned string, Macana * uses the string as a language. * An optional function to override default parsing behaviour. * If this function returned partial of metadata, Macana prefers it over default parsed metadata. * Metadata extracted from YAML frontmatters overrides the metadata this function returned. */ language?( override?( node: FileReader | DirectoryReader, ): string | true | null | undefined | false; ): Partial<DocumentMetadata> | false | null | undefined; } /**
-
@@ -65,21 +62,23 @@ * and lowercased escaped one as document name.*/ export class VaultParser implements MetadataParser { #readFrontMatter: boolean; #language: VaultParserOptions["language"]; #override: VaultParserOptions["override"]; constructor({ readFrontMatter = false, language }: VaultParserOptions = {}) { constructor({ readFrontMatter = false, override }: VaultParserOptions = {}) { this.#readFrontMatter = readFrontMatter; this.#language = language; this.#override = override; } async parse( node: FileReader | DirectoryReader, ): Promise<DocumentMetadata | Skip> { const overrides = this.#override?.(node) || null; if (node.type === "directory") { return { name: escapeNodeName(node.name), title: node.name, language: this.#getLanguage(node), name: overrides?.name || escapeNodeName(node.name), title: overrides?.title || node.name, language: overrides?.language, }; }
-
@@ -89,9 +88,9 @@switch (ext) { case ".md": { const fromFileName: DocumentMetadata = { name: escapeNodeName(basename), title: basename, language: this.#getLanguage(node), name: overrides?.name || escapeNodeName(basename), title: overrides?.title || basename, language: overrides?.language, }; if (this.#readFrontMatter) {
-
@@ -108,9 +107,9 @@ return fromFileName;} case ".canvas": { return { name: escapeNodeName(basename), title: basename, language: this.#getLanguage(node), name: overrides?.name || escapeNodeName(basename), title: overrides?.title || basename, language: overrides?.language, }; } // Not an Obsidian document.
-
@@ -120,23 +119,6 @@ skip: true,}; } } } #getLanguage(node: FileReader | DirectoryReader): string | undefined { if (!this.#language) { return undefined; } const result = this.#language(node); if (!result) { return undefined; } if (typeof result === "string") { return result; } return node.name; } async #parseFrontMatter(
-