Second frontend, written in Next.JS + Typescript.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
import fs from "fs" import path from "path" import matter from "gray-matter" import remark from "remark" import html from "remark-html"
const postsDirectory = path.join(process.cwd(), "posts")
export function getSortedPostsData() { // Get file names under /posts
const fileNames = fs.readdirSync(postsDirectory) const allPostsData = fileNames.map(fileName => { // Remove ".md" from file name to get id
const id = fileName.replace(/\.md$/, "")
// Read markdown file as string
const fullPath = path.join(postsDirectory, fileName) const fileContents = fs.readFileSync(fullPath, "utf8")
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents)
// Combine the data with the id
return { id, ...(matterResult.data as { date: string; title: string }) } }) // Sort posts by date
return allPostsData.sort((a, b) => { if (a.date < b.date) { return 1 } else { return -1 } }) }
export function getAllPostIds() { const fileNames = fs.readdirSync(postsDirectory) return fileNames.map(fileName => { return { params: { id: fileName.replace(/\.md$/, "") } } }) }
export async function getPostData(id: string) { const fullPath = path.join(postsDirectory, `${id}.md`) const fileContents = fs.readFileSync(fullPath, "utf8")
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents)
// Use remark to convert markdown into HTML string
const processedContent = await remark() .use(html) .process(matterResult.content) const contentHtml = processedContent.toString()
// Combine the data with the id and contentHtml
return { id, contentHtml, ...(matterResult.data as { date: string; title: string }) } }
|