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
|
import { join } from "std/path/mod.ts";
import { renderToDOM } from "../jsx/render.ts";
import PostPage from "../pages/PostPage.tsx";
import { Config } from "../config.ts";
import { Document } from "../ndoc/document.ts";
import { Page } from "../page.ts";
import { Date, Revision } from "../revision.ts";
export interface PostPage extends Page {
title: string;
description: string;
tags: string[];
revisions: Revision[];
published: Date;
updated: Date;
uuid: string;
}
export function getPostPublishedDate(page: { revisions: Revision[] }): Date {
for (const rev of page.revisions) {
if (!rev.isInternal) {
return rev.date;
}
}
return page.revisions[0].date;
}
export function getPostUpdatedDate(page: { revisions: Revision[] }): Date {
return page.revisions[page.revisions.length - 1].date;
}
export function postHasAnyUpdates(page: { revisions: Revision[] }): boolean {
return 2 <= page.revisions.filter((rev) => !rev.isInternal).length;
}
export async function generatePostPage(
doc: Document,
config: Config,
): Promise<PostPage> {
const html = await renderToDOM(
PostPage(doc, config),
);
const cwd = Deno.cwd();
const contentDir = join(cwd, config.locations.contentDir);
const destFilePath = join(
doc.sourceFilePath.replace(contentDir, "").replace(".ndoc", ""),
"index.html",
);
return {
root: html,
renderer: "html",
destFilePath: destFilePath,
href: destFilePath.replace("index.html", ""),
title: doc.title,
description: doc.description,
tags: doc.tags,
revisions: doc.revisions,
published: getPostPublishedDate(doc),
updated: getPostUpdatedDate(doc),
uuid: doc.uuid,
};
}
|