1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
import { Config } from "../config.ts";
import { Page } from "../page.ts";
import { PostPage } from "../generators/post.ts";
import { SlidePage } from "../generators/slide.ts";
import { dateToRfc3339String } from "../revision.ts";
import AtomPage from "../pages/AtomPage.tsx";
import { renderToDOM } from "../jsx/render.ts";
export type Feed = {
author: string;
icon: string;
id: string;
linkToSelf: string;
linkToAlternate: string;
title: string;
updated: string;
entries: Entry[];
};
export type Entry = {
id: string;
linkToAlternate: string;
published: string;
summary: string;
title: string;
updated: string;
};
const BASE_NAME = "atom.xml";
export async function generateFeedPageFromEntries(
alternateLink: string,
feedSlug: string,
feedTitle: string,
entries: Array<PostPage | SlidePage>,
config: Config,
): Promise<Page> {
const entries_: Entry[] = [];
for (const entry of entries) {
entries_.push({
id: `urn:uuid:${entry.uuid}`,
linkToAlternate: `https://${config.blog.fqdn}${entry.href}`,
title: entry.title,
summary: entry.description,
published: dateToRfc3339String(entry.published),
updated: dateToRfc3339String(entry.updated),
});
}
// Sort by published date in ascending order.
entries_.sort((a, b) => {
if (a.published < b.published) {
return 1;
} else if (a.published > b.published) {
return -1;
}
return 0;
});
const feedPath = `${alternateLink}${BASE_NAME}`;
const feed: Feed = {
author: config.blog.author,
icon: `https://${config.blog.fqdn}/favicon.svg`,
id: `tag:${config.blog.fqdn},${config.blog.siteCopyrightYear}:${feedSlug}`,
linkToSelf: `https://${config.blog.fqdn}${feedPath}`,
linkToAlternate: `https://${config.blog.fqdn}${alternateLink}`,
title: feedTitle,
updated: entries_.reduce(
(latest, entry) => entry.updated > latest ? entry.updated : latest,
entries_[0].updated,
),
entries: entries_,
};
return {
root: await renderToDOM(AtomPage({ feed: feed })),
renderer: "xml",
destFilePath: feedPath,
href: feedPath,
};
}
|