aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/nuldoc-src/pages/SlidePage.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/nuldoc/nuldoc-src/pages/SlidePage.ts')
-rw-r--r--services/nuldoc/nuldoc-src/pages/SlidePage.ts98
1 files changed, 98 insertions, 0 deletions
diff --git a/services/nuldoc/nuldoc-src/pages/SlidePage.ts b/services/nuldoc/nuldoc-src/pages/SlidePage.ts
new file mode 100644
index 0000000..8699134
--- /dev/null
+++ b/services/nuldoc/nuldoc-src/pages/SlidePage.ts
@@ -0,0 +1,98 @@
+import GlobalFooter from "../components/GlobalFooter.ts";
+import GlobalHeader from "../components/SlidesGlobalHeader.ts";
+import PageLayout from "../components/PageLayout.ts";
+import StaticScript from "../components/StaticScript.ts";
+import { Config, getTagLabel } from "../config.ts";
+import { dateToString } from "../revision.ts";
+import { Slide } from "../slide/slide.ts";
+import { getPostPublishedDate } from "../generators/post.ts";
+import { elem, Element } from "../dom.ts";
+
+export default async function SlidePage(
+ slide: Slide,
+ config: Config,
+): Promise<Element> {
+ return await PageLayout({
+ metaCopyrightYear: getPostPublishedDate(slide).year,
+ metaDescription: slide.title,
+ metaKeywords: slide.tags.map((slug) => getTagLabel(config, slug)),
+ metaTitle:
+ `${slide.event} (${slide.talkType})|${config.sites.slides.siteName}`,
+ requiresSyntaxHighlight: true,
+ site: "slides",
+ config,
+ children: elem(
+ "body",
+ { class: "single" },
+ GlobalHeader({ config }),
+ elem(
+ "main",
+ { class: "main" },
+ elem(
+ "article",
+ { class: "post-single" },
+ elem(
+ "header",
+ { class: "post-header" },
+ elem("h1", { class: "post-title" }, slide.title),
+ slide.tags.length !== 0
+ ? elem(
+ "ul",
+ { class: "post-tags" },
+ ...slide.tags.map((slug) =>
+ elem(
+ "li",
+ { class: "tag" },
+ elem(
+ "a",
+ { href: `/tags/${slug}/` },
+ getTagLabel(config, slug),
+ ),
+ )
+ ),
+ )
+ : null,
+ ),
+ elem(
+ "div",
+ { class: "post-content" },
+ elem(
+ "section",
+ { id: "changelog" },
+ elem("h2", {}, elem("a", { href: "#changelog" }, "更新履歴")),
+ elem(
+ "ol",
+ {},
+ ...slide.revisions.map((rev) =>
+ elem(
+ "li",
+ { class: "revision" },
+ elem(
+ "time",
+ { datetime: dateToString(rev.date) },
+ dateToString(rev.date),
+ ),
+ `: ${rev.remark}`,
+ )
+ ),
+ ),
+ ),
+ elem("canvas", { id: "slide", "data-slide-link": slide.slideLink }),
+ elem(
+ "div",
+ {},
+ elem("button", { id: "prev", type: "button" }, "Prev"),
+ elem("button", { id: "next", type: "button" }, "Next"),
+ ),
+ await StaticScript({
+ fileName: "/slide.js",
+ type: "module",
+ config,
+ }),
+ ),
+ ),
+ ),
+ GlobalFooter({ config }),
+ ),
+ });
+}