continuwuity/packages/website/src/routes/blog/posts.ts

117 lines
No EOL
3.9 KiB
TypeScript

import { browser } from '$app/environment'
// import { format } from 'date-fns'
import slugify from 'slugify';
import { parse, type ParsedPath } from "node:path";
import type { MdsvexPage } from '$lib/pageTypes';
// we require some server-side APIs to parse all metadata
if (browser) {
throw new Error("posts can only be imported server-side")
}
// import { browser } from '$app/environment'
// import { format } from 'date-fns'
// import { parse } from 'node-html-parser'
// import readingTime from 'reading-time/lib/reading-time.js'
// // we require some server-side APIs to parse all metadata
// if (browser) {
// throw new Error(`posts can only be imported server-side`)
// }
// // Get all posts and add metadata
// export const posts = Object.entries(import.meta.glob('/posts/**/*.md', { eager: true }))
// .map(([filepath, post]) => {
// const html = parse(post.default.render().html)
// const preview = post.metadata.preview ? parse(post.metadata.preview) : html.querySelector('p')
// return {
// ...post.metadata,
// // generate the slug from the file path
// slug: filepath
// .replace(/(\/index)?\.md/, '')
// .split('/')
// .pop(),
// // whether or not this file is `my-post.md` or `my-post/index.md`
// // (needed to do correct dynamic import in posts/[slug].svelte)
// isIndexFile: filepath.endsWith('/index.md'),
// // format date as yyyy-MM-dd
// date: post.metadata.date
// ? format(
// // offset by timezone so that the date is correct
// addTimezoneOffset(new Date(post.metadata.date)),
// 'yyyy-MM-dd'
// )
// : undefined,
// preview: {
// html: preview.toString(),
// // text-only preview (i.e no html elements), used for SEO
// text: preview.structuredText ?? preview.toString()
// },
// // get estimated reading time for the post
// readingTime: readingTime(html.structuredText).text
// }
// })
// // sort by date
// .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())
// // add references to the next/previous post
// .map((post, index, allPosts) => ({
// ...post,
// next: allPosts[index - 1],
// previous: allPosts[index + 1]
// }))
const dateRegex = /^((?<year>\d{4})-(?<month>[0][1-9]|1[0-2])-(?<day>[0][1-9]|[1-2]\d|3[01]))\s*/
export interface BlogPage extends MdsvexPage {
title: string
date: string
canonical: string
slug: string
description: string
filepath: ParsedPath
syndication?: string[]
listed?: string
}
export const pages: BlogPage[] = (await Promise.all(Object.entries(import.meta.glob('$notes/Blogs/*.md', { eager: true }))
.map(async ([filepath, post]) => {
const path = parse(filepath);
const title = path.name.replace(dateRegex, "")
// @ts-ignore
// let {year, month, day}: { year: string, month: string, day: strisng } = path.name.match(dateRegex)?.groups;
// console.log(year, month, day)
const date = path.name.match(dateRegex)[1];
const datePath = date.replaceAll("-", "/")
const slug = slugify(title, { lower: true })
return {
title,
date,
canonical: `${datePath}/${slug}`,
slug,
// @ts-ignore
...post.metadata,
filepath: path
}
})))
// sort by date
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime())
// Get all posts and add metadata
// // add references to the next/previous post
// .map((post, index, allPosts) => ({
// ...post,
// next: allPosts[index - 1],
// previous: allPosts[index + 1]
// }))
// function addTimezoneOffset(date) {
// const offsetInMilliseconds = new Date().getTimezoneOffset() * 60 * 1000
// return new Date(new Date(date).getTime() + offsetInMilliseconds)
// }