Bauke/tildes-issue-log
Bauke
/
tildes-issue-log
Archived
1
Fork 0
This repository has been archived on 2022-10-04. You can view files and clone it, but cannot push or open issues or pull requests.
tildes-issue-log/source/scripts/feeds.ts

88 lines
2.5 KiB
TypeScript

import {promises as fsp} from 'fs';
import {join} from 'path';
import cheerio from 'cheerio';
import {Feed} from 'feed';
import {PostList, months} from './html';
export async function generateFeeds(allPosts: PostList[]): Promise<void> {
const feed = new Feed({
title: 'Tildes Issue Log',
description:
'The Tildes Issue Log is a monthly blog about the development of Tildes.',
id: 'https://til.bauke.xyz',
link: 'https://til.bauke.xyz',
language: 'en',
image: 'https://til.bauke.xyz/android-chrome-192x192.png',
favicon: 'https://til.bauke.xyz/favicon.ico',
copyright:
'AGPL-3.0-or-later Tildes Issue Log Contributors https://gitlab.com/Bauke/tildes-issue-log',
generator: 'https://github.com/jpmonette/feed',
feedLinks: {
atom: 'https://til.bauke.xyz/feed.atom',
json: 'https://til.bauke.xyz/feed.json',
rss: 'https://til.bauke.xyz/feed.rss'
},
author: {
name: 'Bauke',
email: 'me@bauke.xyz',
link: 'https://bauke.xyz'
}
});
// Sort posts by most recent first.
allPosts.sort((a, b) => b.year - a.year);
for (const post of allPosts) {
post.posts.sort((a, b) => b.month - a.month);
}
const maxPosts = 5;
let postsAdded = 0;
for (const year of allPosts) {
if (postsAdded >= maxPosts) {
break;
}
for (const post of year.posts) {
if (postsAdded >= maxPosts) {
break;
}
const month = `${months[post.month][0].toUpperCase()}${months[
post.month
].slice(1)}`;
const title = `${month} ${year.year}`;
const id = `https://til.bauke.xyz/${year.year}/${
months[post.month]
}.html`;
const date = new Date(year.year, post.month, 0, 23, 59, 59);
const html: string = await fsp.readFile(
join(__dirname, `../../public/${year.year}/${months[post.month]}.html`),
'utf8'
);
const $: CheerioStatic = cheerio.load(html);
const content: string = $('#post').html()!;
feed.addItem({
title,
id,
link: id,
date,
published: date,
description: `${title}'s Issue Log`,
content,
image: 'https://til.bauke.xyz/android-chrome-192x192.png'
});
postsAdded++;
}
}
const feedPath: string = join(__dirname, '../../public/feed');
await fsp.writeFile(`${feedPath}.atom`, feed.atom1());
await fsp.writeFile(`${feedPath}.json`, feed.json1());
await fsp.writeFile(`${feedPath}.rss`, feed.rss2());
}