toshiki-notebook/docs/.vitepress/utils/posts.data.js

66 lines
1.5 KiB
JavaScript

const fs = require('fs')
const path = require('path')
const matter = require('gray-matter')
const { createMarkdownRenderer } = require('vitepress')
const md = createMarkdownRenderer(process.cwd())
module.exports = {
watch: '../../docs/*.md',
load(asFeed = false) {
const postDir = path.resolve(__dirname, '../../docs')
return fs
.readdirSync(postDir)
.map(file => getPost(file, postDir, asFeed))
.sort((a, b) => b.date.time - a.date.time)
}
}
const cache = new Map()
function getPost(file, postDir, asFeed = false) {
const fullePath = path.join(postDir, file)
const timestamp = fs.statSync(fullePath).mtimeMs
const cached = cache.get(fullePath)
if (cached && timestamp === cached.timestamp) {
return cached.post
}
const src = fs.readFileSync(fullePath, 'utf-8')
const { data, excerpt } = matter(src, { excerpt: true })
const post = {
title: data.title,
href: `${file.replace(/\.md$/, '.html')}`,
date: formatDate(data.date),
excerpt: md.render(excerpt)
}
if (asFeed) {
// only attach these when building the RSS feed to avoid bloating the
// client bundle size
post.data = data
}
cache.set(fullePath, {
timestamp,
post
})
return post
}
function formatDate(date) {
if (!(date instanceof Date)) {
date = new Date(date)
}
date.setUTCHours(12)
return {
time: +date,
string: date.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
})
}
}