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.
69 lines
1.8 KiB
69 lines
1.8 KiB
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 })
|
|
}
|
|
}
|