Changes
3 changed files (+105/-12)
-
-
@@ -50,7 +50,7 @@ - [x] Basic shape- [x] Arrow - [x] Colors - [ ] Label - [ ] Document sorting - [x] Document sorting - [ ] Search functionality - [ ] Creation / Update date - [ ] Tags
-
-
-
@@ -102,6 +102,77 @@ },}); }); Deno.test("Should sort by default", async () => { const fileSystemReader = new MemoryFsReader([ { path: "a/b.md", content: "" }, { path: "b.md", content: "" }, { path: "a/a.md", content: "" }, ]); const builder = new DefaultTreeBuilder({ defaultLanguage: "en" }); const tree = await builder.build({ fileSystemReader, contentParser, }); assertObjectMatch(tree, { nodes: [ { metadata: { title: "a" }, entries: [ { metadata: { title: "a.md" }, }, { metadata: { title: "b.md" }, }, ], }, { metadata: { title: "b.md" }, }, ], }); }); Deno.test("Should accept custom sorter", async () => { const fileSystemReader = new MemoryFsReader([ { path: "a/b.md", content: "" }, { path: "b.md", content: "" }, { path: "a/a.md", content: "" }, ]); const builder = new DefaultTreeBuilder({ defaultLanguage: "en", sorter(a, b) { return b.metadata.title.localeCompare(a.metadata.title, "en"); }, }); const tree = await builder.build({ fileSystemReader, contentParser, }); assertObjectMatch(tree, { nodes: [ { metadata: { title: "b.md" }, }, { metadata: { title: "a" }, entries: [ { metadata: { title: "b.md" }, }, { metadata: { title: "a.md" }, }, ], }, ], }); }); Deno.test("ignore() and ignoreDotfiles() should ignore files and directories", async () => { const fileSystemReader = new MemoryFsReader([ { path: "foo/bar/baz.md", content: "" },
-
@@ -125,14 +196,6 @@ assertEquals(tree.nodes.length, 2);assertObjectMatch(tree.nodes[0], { metadata: { name: "foo.md", title: "foo.md", }, file: { name: "foo.md" }, }); assertObjectMatch(tree.nodes[1], { metadata: { name: "bar", title: "bar", },
-
@@ -150,6 +213,14 @@ name: "foo.md",}, }, ], }); assertObjectMatch(tree.nodes[1], { metadata: { name: "foo.md", title: "foo.md", }, file: { name: "foo.md" }, }); });
-
-
-
@@ -138,15 +138,37 @@ * A list of callback functions that control whether a file or a directory should be* included in the document tree and override document metadata. */ strategies?: readonly TreeBuildStrategy[]; /** * Sort function for document and document directory. * This function is directly passed to `Array.prototype.toSorted`. * @default A function compares `metadata.title` using `String.prototype.localeCompare` with default language as a locale. */ sorter?( a: Document | DocumentDirectory, b: Document | DocumentDirectory, ): number; } export class DefaultTreeBuilder implements TreeBuilder { #defaultLanguage: string; #strategies: readonly TreeBuildStrategy[]; #sorter: ( a: Document | DocumentDirectory, b: Document | DocumentDirectory, ) => number; constructor({ defaultLanguage, strategies }: DefaultTreeBuilderConfig) { constructor( { defaultLanguage, strategies, sorter }: DefaultTreeBuilderConfig, ) { this.#defaultLanguage = defaultLanguage; this.#strategies = strategies || []; this.#sorter = sorter || ((a, b) => a.metadata.title.localeCompare( b.metadata.title, this.#defaultLanguage, )); } async build(
-
@@ -164,7 +186,7 @@ return {type: "tree", nodes: entries.filter((entry): entry is NonNullable<typeof entry> => !!entry ), ).toSorted(this.#sorter), defaultLanguage: this.#defaultLanguage, }; }
-
@@ -226,7 +248,7 @@ metadata,directory: node, entries: entries.filter((child): child is NonNullable<typeof child> => !!child ), ).toSorted(this.#sorter), path: [...parentPath, metadata.name], }; }
-