Co-authored-by: Damaj301damaj-lol <90093996+Damaj301damaj-lol@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot] 2026-05-19 15:26:32 +00:00
parent 9cb21fd1df
commit 1a9cf64271

View file

@ -1,11 +1,3 @@
import matter from 'gray-matter';
// Make Buffer available for gray-matter in the browser
import { Buffer } from 'buffer';
if (typeof window !== 'undefined' && !(window as any).Buffer) {
(window as any).Buffer = Buffer;
}
export interface PostMeta { export interface PostMeta {
slug: string; slug: string;
title: string; title: string;
@ -25,11 +17,47 @@ const files = import.meta.glob('../content/blog/*.md', {
eager: true, eager: true,
}) as Record<string, string>; }) as Record<string, string>;
function parseValue(value: string): string | string[] | boolean {
const trimmed = value.trim();
if (trimmed === 'true') return true;
if (trimmed === 'false') return false;
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
return trimmed
.slice(1, -1)
.split(',')
.map((item) => item.trim().replace(/^['"]|['"]$/g, ''))
.filter(Boolean);
}
return trimmed.replace(/^['"]|['"]$/g, '');
}
function parseFrontmatter(raw: string): { data: Partial<PostMeta>; content: string } {
if (!raw.startsWith('---')) return { data: {}, content: raw };
const end = raw.indexOf('\n---', 3);
if (end === -1) return { data: {}, content: raw };
const frontmatter = raw.slice(3, end).trim();
const content = raw.slice(end + 4).replace(/^\s*\n/, '');
const data = frontmatter.split('\n').reduce<Partial<PostMeta>>((acc, line) => {
const separator = line.indexOf(':');
if (separator === -1) return acc;
const key = line.slice(0, separator).trim() as keyof PostMeta;
const value = parseValue(line.slice(separator + 1));
return { ...acc, [key]: value };
}, {});
return { data, content };
}
function parseAll(): Post[] { function parseAll(): Post[] {
return Object.entries(files) return Object.entries(files)
.map(([path, raw]) => { .map(([path, raw]) => {
const slug = path.split('/').pop()!.replace(/\.md$/, ''); const slug = path.split('/').pop()!.replace(/\.md$/, '');
const { data, content } = matter(raw); const { data, content } = parseFrontmatter(raw);
return { return {
slug, slug,
title: data.title ?? slug, title: data.title ?? slug,