From 67eb91ad6dccf2a14e3f8d3b285c75d251322973 Mon Sep 17 00:00:00 2001 From: mihna123 Date: Mon, 8 Jun 2026 14:19:32 +0200 Subject: feat(blogs): implement blogging functionality - Implement static blog generation from markdown files --- src/lib/blogs/api.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/lib/blogs/api.ts (limited to 'src/lib/blogs/api.ts') diff --git a/src/lib/blogs/api.ts b/src/lib/blogs/api.ts new file mode 100644 index 0000000..3fcdd15 --- /dev/null +++ b/src/lib/blogs/api.ts @@ -0,0 +1,42 @@ +import path from 'path'; +import fs from 'fs'; +import matter from 'gray-matter'; +import { remark } from 'remark'; +import html from 'remark-html'; + +const blogsDir = path.join(process.cwd(), '_blogs'); + +export interface Blog { + author: { + name: string; + social: string; + }; + date: Date; + title: string; + slug: string; + excerpt: string; + content: string; +} + +export const getBlogFromSlug = (slug: string): Blog => { + const fullPath = path.join(blogsDir, `${slug}.md`); + const file = fs.readFileSync(fullPath, 'utf8'); + const { data, content } = matter(file); + return { + ...data, + date: new Date(data.date), + content, + slug, + } as Blog; +}; + +export const getAllBlogs = (): Blog[] => { + const rawMdFiles = fs.readdirSync(blogsDir); + const slugs = rawMdFiles.map((file) => file.replace(/\.md$/, '')); + return slugs.map(getBlogFromSlug); +}; + +export const markdownToHtml = async (markdown: string): Promise => { + const htmlResult = await remark().use(html).process(markdown); + return htmlResult.toString(); +}; -- cgit v1.3.1