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.
77 lines
2.4 KiB
77 lines
2.4 KiB
import path from "path";
|
|
import glob from "fast-glob";
|
|
import assert from "assert";
|
|
import { render_with_code } from "./docgen.js";
|
|
import fs from "fs";
|
|
import { Feed } from "feed";
|
|
// have to use the client config to avoid pino crashing rollup with json errors
|
|
import { base_host } from "../client/config.js";
|
|
|
|
const POSTS = {};
|
|
// this keeps POSTS alive, for some reason it disappears during processing
|
|
process.POSTS = POSTS;
|
|
|
|
export const load = (source) => {
|
|
assert(source !== undefined, "source for markdown processing can't be undefined");
|
|
// just a dumb cache to avoid reading the files over and over
|
|
// cache only works if load isn't async!
|
|
let cache = POSTS[source];
|
|
|
|
if(cache === undefined) {
|
|
cache = []; // this is fresh so make a new one
|
|
|
|
let source_path = path.join(process.cwd(), "..", source);
|
|
let posts_regex = path.join(source_path, "*.md");
|
|
assert(!posts_regex.includes("//"), `You have a // in your path which fast-glob hates: ${posts_regex}`);
|
|
|
|
const files = glob.sync(posts_regex.replace(/\\/g, "/"));
|
|
|
|
for(let post of files.reverse()) {
|
|
try {
|
|
const {content, toc, metadata} = render_with_code(source_path, post);
|
|
assert(content && toc && metadata, `Rendering ${source} failed.`);
|
|
|
|
// so many Svelte builders (like 7ty) need slug that we should so it here
|
|
cache.push({content, toc, metadata, slug: metadata.slug});
|
|
} catch(error) {
|
|
console.error(error, `Failure processing post: ${post}`);
|
|
}
|
|
}
|
|
|
|
POSTS[source] = cache;
|
|
return cache;
|
|
} else {
|
|
return cache;
|
|
}
|
|
}
|
|
|
|
export const render_feed = (index_config, posts) => {
|
|
const index = JSON.parse(fs.readFileSync(index_config));
|
|
const feed = new Feed(index);
|
|
index.updated = new Date();
|
|
|
|
for(let post of posts) {
|
|
post.url = `${base_host}/blog/${post.slug}/`;
|
|
|
|
feed.addItem({
|
|
title: post.metadata.title,
|
|
id: post.metadata.url,
|
|
link: post.metadata.url,
|
|
date: new Date(post.metadata.date),
|
|
description: post.metadata.summary,
|
|
content: post.content,
|
|
author: index.author
|
|
});
|
|
}
|
|
|
|
fs.writeFileSync('../public/feed.rss', feed.rss2());
|
|
fs.writeFileSync('../public/feed.json', feed.json1());
|
|
fs.writeFileSync('../public/feed.atom', feed.atom1());
|
|
}
|
|
|
|
export const index = (source) => {
|
|
assert(source !== undefined, "source must be defined");
|
|
return load(source);
|
|
}
|
|
|
|
export default { load, index, render_feed };
|
|
|