making the fics loader prettier
This commit is contained in:
		
							parent
							
								
									ebcc2bf819
								
							
						
					
					
						commit
						6a9ae7237d
					
				| @ -4,6 +4,8 @@ publishedAt: 2020-12-20T19:18:00 | |||||||
| notes: i wrote this in a fugue state while listening to [Waste by Oh Wonder](https://www.youtube.com/watch?v=Ar1grAdGkec) | notes: i wrote this in a fugue state while listening to [Waste by Oh Wonder](https://www.youtube.com/watch?v=Ar1grAdGkec) | ||||||
| --- | --- | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | 
 | ||||||
|   |   | ||||||
| 
 | 
 | ||||||
|   |   | ||||||
|  | |||||||
							
								
								
									
										39
									
								
								src/utils/ficsLoader.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/utils/ficsLoader.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | import { type Loader, type LoaderContext } from "astro/loaders"; | ||||||
|  | import { parseFrontmatter } from '@astrojs/markdown-remark'; | ||||||
|  | import { readdirSync } from "fs"; | ||||||
|  | import { glob } from "fs/promises"; | ||||||
|  | 
 | ||||||
|  | export function ficsLoader(options: { path: string }) { | ||||||
|  |   return { | ||||||
|  |     name: "fics", | ||||||
|  |     async load(context: LoaderContext) { | ||||||
|  |       const fics = readdirSync(options.path, { withFileTypes: true }) | ||||||
|  |         .filter(dirent => dirent.isDirectory()) | ||||||
|  |         .map(dirent => dirent.name); | ||||||
|  |        | ||||||
|  |       for (const fic of fics) { | ||||||
|  |         const { content } = parseFrontmatter(fic, { frontmatter: "empty-with-spaces" }); | ||||||
|  |         console.log(content); | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async function test(options: { path: string }) { | ||||||
|  |   const fics = readdirSync(options.path, { withFileTypes: true }) | ||||||
|  |     .filter(dirent => dirent.isDirectory()) | ||||||
|  |     .map(dirent => `${dirent.parentPath}/${dirent.name}`); | ||||||
|  |    | ||||||
|  |   for (const fic of fics) { | ||||||
|  |     const entries = await Array.fromAsync(glob([`${fic}/*.yaml`, `${fic}/*.yml`, `${fic}/*.toml`, `${fic}/*.json`])); | ||||||
|  |     console.log(entries); | ||||||
|  |     const chapterPaths = await Array.fromAsync(glob(fic + '/*.md')); | ||||||
|  |     const chapters = chapterPaths.map(chapter => chapter); | ||||||
|  |     // const files 
 | ||||||
|  |     // console.log("" + chapters)
 | ||||||
|  |     // const { content } = parseFrontmatter(fic, { frontmatter: "empty-with-spaces" });
 | ||||||
|  |     // console.log(content);
 | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | test({ path: "./src/content/fics" }); | ||||||
| @ -3,7 +3,11 @@ import { statSync } from "fs"; | |||||||
| export function modifiedTime() { | export function modifiedTime() { | ||||||
|   return function (_tree, file) { |   return function (_tree, file) { | ||||||
|     const path = file.history[0]; |     const path = file.history[0]; | ||||||
|     const result = statSync(path); |     try { | ||||||
|     file.data.astro.frontmatter.lastModified = result.mtime; |       const result = statSync(path); | ||||||
|  |       file.data.astro.frontmatter.lastModified = result.mtime; | ||||||
|  |     } catch (error) { | ||||||
|  |       return; | ||||||
|  |     }     | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @ -1,15 +1,8 @@ | |||||||
| import type { MarkdownInstance } from "astro"; | import type { MarkdownInstance } from "astro"; | ||||||
| import type { Loader, LoaderContext } from "astro/loaders"; | import type { Loader, LoaderContext } from "astro/loaders"; | ||||||
|  | import { parseFrontmatter } from '@astrojs/markdown-remark'; | ||||||
| import path from "path"; | import path from "path"; | ||||||
| import { glob } from "fs/promises"; | import { glob, readFile } from "fs/promises"; | ||||||
| 
 |  | ||||||
| async function getAllChapters(metaPath: string) { |  | ||||||
|   const entryPath = path.parse(metaPath); |  | ||||||
|   const fic = entryPath.dir; |  | ||||||
|   const entries = await Array.fromAsync(glob(fic + '/*.md')); |  | ||||||
|   const chapters = entries.map(chapter => path.relative(fic, chapter)); |  | ||||||
|   return chapters.map(chapter => `${fic.split("/").at(-1)}/${path.parse(chapter).name}`); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| export function ficsLoader(loader: Loader) { | export function ficsLoader(loader: Loader) { | ||||||
|   const oldLoad = loader.load; |   const oldLoad = loader.load; | ||||||
| @ -47,8 +40,13 @@ async function resolveFics(loader: (oldContext: LoaderContext) => Promise<void>, | |||||||
|           if (valueWithoutDigest.data['oneshot'] === true) { |           if (valueWithoutDigest.data['oneshot'] === true) { | ||||||
|             // i've committed unspeakable atrocities here
 |             // i've committed unspeakable atrocities here
 | ||||||
|             const search = import.meta.glob<MarkdownInstance<any>>(`../content/fics/**/*.md`, { eager: true }); |             const search = import.meta.glob<MarkdownInstance<any>>(`../content/fics/**/*.md`, { eager: true }); | ||||||
|             const body = Object.values(search).filter(path => path.file?.includes(chapters[0]))[0]; |             const onlyChapter = chapters[0]; | ||||||
|  |             const includedChapter = (path: MarkdownInstance<any>) => path.file?.includes(onlyChapter); | ||||||
|  |             const [body] = Object.values(search).filter(includedChapter); | ||||||
|             const html = await body.compiledContent(); |             const html = await body.compiledContent(); | ||||||
|  |             // following could be good for being way more forgiving of paths
 | ||||||
|  |             // const { content, frontmatter } = await readChapterFile(value.filePath as string, chapters);
 | ||||||
|  |             // const test = await context.renderMarkdown(content);
 | ||||||
|             context.store.set({ |             context.store.set({ | ||||||
|               ...valueWithoutDigest, |               ...valueWithoutDigest, | ||||||
|               data: newData, |               data: newData, | ||||||
| @ -75,4 +73,27 @@ async function resolveFics(loader: (oldContext: LoaderContext) => Promise<void>, | |||||||
|       return loadedPromise.promise; |       return loadedPromise.promise; | ||||||
|     }) |     }) | ||||||
|   ); |   ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async function getAllChapters(metaPath: string) { | ||||||
|  |   const entryPath = path.parse(metaPath); | ||||||
|  |   const fic = entryPath.dir; | ||||||
|  |   const ficFolder = fic.split("/").at(-1); | ||||||
|  |   const entries = await Array.fromAsync(glob(fic + '/*.md')); | ||||||
|  |   const chapters = entries.map(chapter => path.relative(fic, chapter)); | ||||||
|  |   return chapters.map(chapter => `${ficFolder}/${chapter}`); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // unused for now
 | ||||||
|  | async function readChapterFile(folderPath: string, chapters: string[]) { | ||||||
|  |   const folder = (folderPath) | ||||||
|  |     .split("/") | ||||||
|  |     .slice(0, -2) // we only want the stuff before fic folder
 | ||||||
|  |     .join("/"); // reconnect as string
 | ||||||
|  |   const onlyChapter = chapters[0]; | ||||||
|  |   const filePath = path.resolve(folder, onlyChapter); | ||||||
|  |   const [search] = await Array.fromAsync(glob(`${filePath}`)); | ||||||
|  |   const fileContent = await readFile(search, "utf8"); | ||||||
|  |   const result = parseFrontmatter(fileContent); | ||||||
|  |   return result; | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user