This commit is contained in:
2026-04-17 12:02:41 +02:00
parent 1899335e60
commit 3c8dbade41
12 changed files with 595 additions and 1 deletions
+44
View File
@@ -0,0 +1,44 @@
import fs from "node:fs";
import path from "node:path";
import matter from "gray-matter";
import { Article, ArticleFrontmatter } from "./types";
const CONTENT_DIR = path.join(process.cwd(), "content/blog");
export function getArticleSlugs(locale: string): string[] {
const localeDirectory = path.join(CONTENT_DIR, locale);
if (!fs.existsSync(localeDirectory)) {
return [];
}
return fs
.readdirSync(localeDirectory)
.filter((file) => file.endsWith(".mdx"))
.map((fileName) => fileName.replace(/\.mdx$/, ""));
}
export function getArticleBySlug(slug: string, locale: string): Article | null {
const realSlug = slug.replace(/\.mdx$/, "");
const fullPath = path.join(CONTENT_DIR, locale, `${realSlug}.mdx`);
if (!fs.existsSync(fullPath)) {
return null;
}
const fileContents = fs.readFileSync(fullPath, "utf8");
const { data, content } = matter(fileContents);
return {
slug: realSlug,
...(data as ArticleFrontmatter),
content,
};
}
export function getAllArticles(locale: string): Article[] {
return getArticleSlugs(locale)
.map((slug) => getArticleBySlug(slug, locale))
.filter((article): article is Article => article !== null && article.ready)
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
}
+16
View File
@@ -0,0 +1,16 @@
export type ArticleFrontmatter = {
ready: boolean;
title: string;
description: string;
date: string;
category: string;
tags: string[];
cover?: string;
readTime?: string;
summary?: string[];
};
export type Article = ArticleFrontmatter & {
slug: string;
content: string;
};