Files
portfolio/lib/content.ts
T
2025-12-17 11:08:03 -05:00

122 lines
2.9 KiB
TypeScript

import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
const contentDirectory = path.join(process.cwd(), 'content');
export interface BlogPost {
slug: string;
title: string;
date: string;
excerpt: string;
content: string;
}
export interface Project {
slug: string;
title: string;
description: string;
links?: {
github?: string;
live?: string;
gitea?: string;
};
content: string;
}
export function getBlogPosts(): BlogPost[] {
const blogDirectory = path.join(contentDirectory, 'blog');
if (!fs.existsSync(blogDirectory)) {
return [];
}
const fileNames = fs.readdirSync(blogDirectory);
const allPosts = fileNames
.filter((fileName) => fileName.endsWith('.md'))
.map((fileName) => {
const slug = fileName.replace(/\.md$/, '');
const fullPath = path.join(blogDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
const { data, content } = matter(fileContents);
return {
slug,
title: data.title || '',
date: data.date || '',
excerpt: data.excerpt || '',
content,
};
});
return allPosts.sort((a, b) => (a.date > b.date ? -1 : 1));
}
export function getBlogPost(slug: string): BlogPost | null {
const blogDirectory = path.join(contentDirectory, 'blog');
const fullPath = path.join(blogDirectory, `${slug}.md`);
if (!fs.existsSync(fullPath)) {
return null;
}
const fileContents = fs.readFileSync(fullPath, 'utf8');
const { data, content } = matter(fileContents);
return {
slug,
title: data.title || '',
date: data.date || '',
excerpt: data.excerpt || '',
content,
};
}
export function getProjects(): Project[] {
const projectsDirectory = path.join(contentDirectory, 'projects');
if (!fs.existsSync(projectsDirectory)) {
return [];
}
const fileNames = fs.readdirSync(projectsDirectory);
const allProjects = fileNames
.filter((fileName) => fileName.endsWith('.md'))
.map((fileName) => {
const slug = fileName.replace(/\.md$/, '');
const fullPath = path.join(projectsDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
const { data, content } = matter(fileContents);
return {
slug,
title: data.title || '',
description: data.description || '',
links: data.links,
content,
};
});
return allProjects;
}
export function getProject(slug: string): Project | null {
const projectsDirectory = path.join(contentDirectory, 'projects');
const fullPath = path.join(projectsDirectory, `${slug}.md`);
if (!fs.existsSync(fullPath)) {
return null;
}
const fileContents = fs.readFileSync(fullPath, 'utf8');
const { data, content } = matter(fileContents);
return {
slug,
title: data.title || '',
description: data.description || '',
links: data.links,
content,
};
}