mirror of
https://github.com/estruyf/vscode-front-matter.git
synced 2026-03-28 17:42:40 +01:00
53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import fs from 'fs'
|
|
import { join } from 'path'
|
|
import matter from 'gray-matter'
|
|
|
|
type ContentType = "docs" | "changelog";
|
|
|
|
const postsDirectory = join(process.cwd(), 'content');
|
|
|
|
export function getPostSlugs(type: ContentType) {
|
|
return fs.readdirSync(join(postsDirectory, type)).filter(f => f.endsWith(`.md`))
|
|
}
|
|
|
|
export function getPostByFilename(type: ContentType, crntFile: string, fields: string[] = []) {
|
|
|
|
const realSlug = crntFile.replace(/\.md$/, '');
|
|
const fullPath = join(postsDirectory, type, `${realSlug}.md`)
|
|
const fileContents = fs.readFileSync(fullPath, 'utf8')
|
|
const { data, content } = matter(fileContents)
|
|
|
|
const items: any = {}
|
|
|
|
// Ensure only the minimal needed data is exposed
|
|
fields.forEach((field) => {
|
|
if (field === 'content') {
|
|
items[field] = content
|
|
}
|
|
|
|
if (field === 'fileName') {
|
|
items[field] = realSlug
|
|
}
|
|
|
|
if (data[field]) {
|
|
items[field] = data[field]
|
|
}
|
|
|
|
if (field === 'slug') {
|
|
items[field] = data['slug'] || realSlug
|
|
}
|
|
})
|
|
|
|
return items
|
|
}
|
|
|
|
export function getAllPosts(type: ContentType, fields: string[] = []) {
|
|
const fileNames = getPostSlugs(type);
|
|
|
|
const posts = fileNames
|
|
.map((fileName) => getPostByFilename(type, fileName, fields))
|
|
// sort posts by date in descending order
|
|
.sort((post1, post2) => ((post1 as any)?.date > (post2 as any)?.date ? -1 : 1));
|
|
|
|
return posts
|
|
} |