This is the template project that's checked out and configured when you run the bando-up command from ljsthw-bandolier. This is where the code really lives.
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.
 
 
 
 
bandolier-template/lib/blog.js

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 };