From 940eae61767214eb1ee573284dc8b5876d536fb3 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 12 Jan 2025 19:44:19 +0900 Subject: refactor(blog/nuldoc): convert pages/*.ts to TSX --- vhosts/blog/nuldoc-src/atom/generate.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'vhosts/blog/nuldoc-src/atom') diff --git a/vhosts/blog/nuldoc-src/atom/generate.ts b/vhosts/blog/nuldoc-src/atom/generate.ts index ee659211..d98c4c18 100644 --- a/vhosts/blog/nuldoc-src/atom/generate.ts +++ b/vhosts/blog/nuldoc-src/atom/generate.ts @@ -2,8 +2,8 @@ import { Config } from "../config.ts"; import { el } from "../dom.ts"; import { Page } from "../page.ts"; import { Entry, Feed } from "./types.ts"; -import { PostPage } from "../pages/post.ts"; -import { SlidePage } from "../pages/slide.ts"; +import { PostPage } from "../pages/post.tsx"; +import { SlidePage } from "../pages/slide.tsx"; import { dateToRfc3339String } from "../revision.ts"; const BASE_NAME = "atom.xml"; -- cgit v1.2.3-70-g09d2 From f31d24cd1417088b7806ddc7d2e0df982d666e38 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 12 Jan 2025 21:50:13 +0900 Subject: refactor(blog/nuldoc): remove top-level __root__ element --- vhosts/blog/nuldoc-src/atom/generate.ts | 3 +- vhosts/blog/nuldoc-src/pages/about.tsx | 3 +- vhosts/blog/nuldoc-src/pages/home.tsx | 3 +- vhosts/blog/nuldoc-src/pages/not_found.tsx | 3 +- vhosts/blog/nuldoc-src/pages/post.tsx | 4 +-- vhosts/blog/nuldoc-src/pages/post_list.tsx | 3 +- vhosts/blog/nuldoc-src/pages/slide.tsx | 3 +- vhosts/blog/nuldoc-src/pages/slide_list.tsx | 3 +- vhosts/blog/nuldoc-src/pages/tag.tsx | 3 +- vhosts/blog/nuldoc-src/pages/tag_list.tsx | 3 +- vhosts/blog/nuldoc-src/renderers/html.ts | 46 ++++++++++++++--------------- vhosts/blog/nuldoc-src/renderers/xml.ts | 45 +++++++++++++--------------- 12 files changed, 54 insertions(+), 68 deletions(-) (limited to 'vhosts/blog/nuldoc-src/atom') diff --git a/vhosts/blog/nuldoc-src/atom/generate.ts b/vhosts/blog/nuldoc-src/atom/generate.ts index d98c4c18..9e30ef3e 100644 --- a/vhosts/blog/nuldoc-src/atom/generate.ts +++ b/vhosts/blog/nuldoc-src/atom/generate.ts @@ -50,9 +50,8 @@ export function generateFeedPageFromEntries( entries: entries_, }; - const xml = buildXmlTree(feed); return { - root: el("__root__", {}, xml), + root: buildXmlTree(feed), renderer: "xml", destFilePath: feedPath, href: feedPath, diff --git a/vhosts/blog/nuldoc-src/pages/about.tsx b/vhosts/blog/nuldoc-src/pages/about.tsx index ea74fa32..91d7fee4 100644 --- a/vhosts/blog/nuldoc-src/pages/about.tsx +++ b/vhosts/blog/nuldoc-src/pages/about.tsx @@ -3,7 +3,6 @@ import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import StaticScript from "../components/StaticScript.tsx"; import { Config } from "../config.ts"; -import { el } from "../dom.ts"; import { renderToDOM } from "../jsx/render.ts"; import { Page } from "../page.ts"; import { dateToString } from "../revision.ts"; @@ -98,7 +97,7 @@ export async function generateAboutPage( ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: "/about/index.html", href: "/about/", diff --git a/vhosts/blog/nuldoc-src/pages/home.tsx b/vhosts/blog/nuldoc-src/pages/home.tsx index 3e79928a..a9a5d542 100644 --- a/vhosts/blog/nuldoc-src/pages/home.tsx +++ b/vhosts/blog/nuldoc-src/pages/home.tsx @@ -3,7 +3,6 @@ import { renderToDOM } from "../jsx/render.ts"; import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import { Config } from "../config.ts"; -import { el } from "../dom.ts"; import { Page } from "../page.ts"; export type HomePage = Page; @@ -57,7 +56,7 @@ export async function generateHomePage(config: Config): Promise { ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: "/index.html", href: "/", diff --git a/vhosts/blog/nuldoc-src/pages/not_found.tsx b/vhosts/blog/nuldoc-src/pages/not_found.tsx index f0b5f964..27be0738 100644 --- a/vhosts/blog/nuldoc-src/pages/not_found.tsx +++ b/vhosts/blog/nuldoc-src/pages/not_found.tsx @@ -3,7 +3,6 @@ import { renderToDOM } from "../jsx/render.ts"; import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import { Config } from "../config.ts"; -import { el } from "../dom.ts"; import { Page } from "../page.ts"; export type NotFoundPage = Page; @@ -31,7 +30,7 @@ export async function generateNotFoundPage( ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: "/404.html", href: "/404.html", diff --git a/vhosts/blog/nuldoc-src/pages/post.tsx b/vhosts/blog/nuldoc-src/pages/post.tsx index 529d6738..541c33e3 100644 --- a/vhosts/blog/nuldoc-src/pages/post.tsx +++ b/vhosts/blog/nuldoc-src/pages/post.tsx @@ -4,7 +4,7 @@ import GlobalFooter from "../components/GlobalFooter.tsx"; import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import { Config, getTagLabel } from "../config.ts"; -import { el, Element } from "../dom.ts"; +import { Element } from "../dom.ts"; import { Document } from "../ndoc/document.ts"; import { Page } from "../page.ts"; import { Date, dateToString, Revision } from "../revision.ts"; @@ -108,7 +108,7 @@ export async function generatePostPage( "index.html", ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: destFilePath, href: destFilePath.replace("index.html", ""), diff --git a/vhosts/blog/nuldoc-src/pages/post_list.tsx b/vhosts/blog/nuldoc-src/pages/post_list.tsx index 2d32636f..3cf17df4 100644 --- a/vhosts/blog/nuldoc-src/pages/post_list.tsx +++ b/vhosts/blog/nuldoc-src/pages/post_list.tsx @@ -4,7 +4,6 @@ import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import PostPageEntry from "../components/PostPageEntry.tsx"; import { Config } from "../config.ts"; -import { el } from "../dom.ts"; import { Page } from "../page.ts"; import { dateToString } from "../revision.ts"; import { getPostPublishedDate, PostPage } from "./post.tsx"; @@ -45,7 +44,7 @@ export async function generatePostListPage( ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: "/posts/index.html", href: "/posts/", diff --git a/vhosts/blog/nuldoc-src/pages/slide.tsx b/vhosts/blog/nuldoc-src/pages/slide.tsx index 4165163a..843f539b 100644 --- a/vhosts/blog/nuldoc-src/pages/slide.tsx +++ b/vhosts/blog/nuldoc-src/pages/slide.tsx @@ -5,7 +5,6 @@ import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import StaticScript from "../components/StaticScript.tsx"; import { Config, getTagLabel } from "../config.ts"; -import { el } from "../dom.ts"; import { Page } from "../page.ts"; import { Date, dateToString, Revision } from "../revision.ts"; import { Slide } from "../slide/slide.ts"; @@ -92,7 +91,7 @@ export async function generateSlidePage( "index.html", ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: destFilePath, href: destFilePath.replace("index.html", ""), diff --git a/vhosts/blog/nuldoc-src/pages/slide_list.tsx b/vhosts/blog/nuldoc-src/pages/slide_list.tsx index 31eeca68..e42cfcea 100644 --- a/vhosts/blog/nuldoc-src/pages/slide_list.tsx +++ b/vhosts/blog/nuldoc-src/pages/slide_list.tsx @@ -4,7 +4,6 @@ import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import SlidePageEntry from "../components/SlidePageEntry.tsx"; import { Config } from "../config.ts"; -import { el } from "../dom.ts"; import { Page } from "../page.ts"; import { dateToString } from "../revision.ts"; import { getPostPublishedDate } from "./post.tsx"; @@ -46,7 +45,7 @@ export async function generateSlideListPage( ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: "/slides/index.html", href: "/slides/", diff --git a/vhosts/blog/nuldoc-src/pages/tag.tsx b/vhosts/blog/nuldoc-src/pages/tag.tsx index 8dfc9a39..f7df1f13 100644 --- a/vhosts/blog/nuldoc-src/pages/tag.tsx +++ b/vhosts/blog/nuldoc-src/pages/tag.tsx @@ -5,7 +5,6 @@ import PageLayout from "../components/PageLayout.tsx"; import PostPageEntry from "../components/PostPageEntry.tsx"; import SlidePageEntry from "../components/SlidePageEntry.tsx"; import { Config, getTagLabel } from "../config.ts"; -import { el } from "../dom.ts"; import { Page } from "../page.ts"; import { getPostPublishedDate } from "./post.tsx"; import { TaggedPage } from "./tagged_page.ts"; @@ -52,7 +51,7 @@ export async function generateTagPage( ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: `/tags/${tagSlug}/index.html`, href: `/tags/${tagSlug}/`, diff --git a/vhosts/blog/nuldoc-src/pages/tag_list.tsx b/vhosts/blog/nuldoc-src/pages/tag_list.tsx index 5ea6f25f..728384f4 100644 --- a/vhosts/blog/nuldoc-src/pages/tag_list.tsx +++ b/vhosts/blog/nuldoc-src/pages/tag_list.tsx @@ -3,7 +3,6 @@ import { renderToDOM } from "../jsx/render.ts"; import GlobalHeader from "../components/GlobalHeader.tsx"; import PageLayout from "../components/PageLayout.tsx"; import { Config } from "../config.ts"; -import { el } from "../dom.ts"; import { Page } from "../page.ts"; import { TagPage } from "./tag.tsx"; @@ -61,7 +60,7 @@ export async function generateTagListPage( ); return { - root: el("__root__", {}, html), + root: html, renderer: "html", destFilePath: "/tags/index.html", href: "/tags/", diff --git a/vhosts/blog/nuldoc-src/renderers/html.ts b/vhosts/blog/nuldoc-src/renderers/html.ts index 70d097b2..5f1342f1 100644 --- a/vhosts/blog/nuldoc-src/renderers/html.ts +++ b/vhosts/blog/nuldoc-src/renderers/html.ts @@ -3,7 +3,7 @@ import { DocBookError } from "../errors.ts"; export function renderHtml(root: Node): string { return `\n` + nodeToHtmlText(root, { - indentLevel: -1, + indentLevel: 0, isInPre: false, }); } @@ -17,8 +17,6 @@ type Dtd = { type: "block" | "inline"; auto_closing?: boolean }; function getDtd(name: string): Dtd { switch (name) { - case "__root__": - return { type: "block" }; case "a": return { type: "inline" }; case "article": @@ -164,29 +162,29 @@ function elementNodeToHtmlText(e: Element, ctx: Context): string { const dtd = getDtd(e.name); let s = ""; - if (e.name !== "__root__") { - if (isBlockNode(e)) { - s += indent(ctx); - } - s += `<${e.name}`; - const attributes = getElementAttributes(e); - if (attributes.length > 0) { - s += " "; - for (let i = 0; i < attributes.length; i++) { - const [name, value] = attributes[i]; - s += `${name === "className" ? "class" : name}="${ - encodeSpecialCharacters(value) - }"`; - if (i !== attributes.length - 1) { - s += " "; - } + + if (isBlockNode(e)) { + s += indent(ctx); + } + s += `<${e.name}`; + const attributes = getElementAttributes(e); + if (attributes.length > 0) { + s += " "; + for (let i = 0; i < attributes.length; i++) { + const [name, value] = attributes[i]; + s += `${name === "className" ? "class" : name}="${ + encodeSpecialCharacters(value) + }"`; + if (i !== attributes.length - 1) { + s += " "; } } - s += ">"; - if (isBlockNode(e) && e.name !== "pre") { - s += "\n"; - } } + s += ">"; + if (isBlockNode(e) && e.name !== "pre") { + s += "\n"; + } + ctx.indentLevel += 1; let prevChild: Node | null = null; @@ -213,7 +211,7 @@ function elementNodeToHtmlText(e: Element, ctx: Context): string { } ctx.indentLevel -= 1; - if (e.name !== "__root__" && !dtd.auto_closing) { + if (!dtd.auto_closing) { if (e.name !== "pre") { if (isBlockNode(e)) { if (needsLineBreak(prevChild)) { diff --git a/vhosts/blog/nuldoc-src/renderers/xml.ts b/vhosts/blog/nuldoc-src/renderers/xml.ts index 69b8266c..77cc1574 100644 --- a/vhosts/blog/nuldoc-src/renderers/xml.ts +++ b/vhosts/blog/nuldoc-src/renderers/xml.ts @@ -2,7 +2,7 @@ import { Element, forEachChild, Node, Text } from "../dom.ts"; export function renderXml(root: Node): string { return `\n` + nodeToXmlText(root, { - indentLevel: -1, + indentLevel: 0, }); } @@ -14,7 +14,6 @@ type Dtd = { type: "block" | "inline" }; function getDtd(name: string): Dtd { switch (name) { - case "__root__": case "feed": case "entry": case "author": @@ -64,24 +63,23 @@ function encodeSpecialCharacters(s: string): string { function elementNodeToXmlText(e: Element, ctx: Context): string { let s = ""; - if (e.name !== "__root__") { - s += indent(ctx); - s += `<${e.name}`; - const attributes = getElementAttributes(e); - if (attributes.length > 0) { - s += " "; - for (let i = 0; i < attributes.length; i++) { - const [name, value] = attributes[i]; - s += `${name}="${encodeSpecialCharacters(value)}"`; - if (i !== attributes.length - 1) { - s += " "; - } + + s += indent(ctx); + s += `<${e.name}`; + const attributes = getElementAttributes(e); + if (attributes.length > 0) { + s += " "; + for (let i = 0; i < attributes.length; i++) { + const [name, value] = attributes[i]; + s += `${name}="${encodeSpecialCharacters(value)}"`; + if (i !== attributes.length - 1) { + s += " "; } } - s += ">"; - if (isBlockNode(e)) { - s += "\n"; - } + } + s += ">"; + if (isBlockNode(e)) { + s += "\n"; } ctx.indentLevel += 1; @@ -90,13 +88,12 @@ function elementNodeToXmlText(e: Element, ctx: Context): string { }); ctx.indentLevel -= 1; - if (e.name !== "__root__") { - if (isBlockNode(e)) { - s += indent(ctx); - } - s += ``; - s += "\n"; + if (isBlockNode(e)) { + s += indent(ctx); } + s += ``; + s += "\n"; + return s; } -- cgit v1.2.3-70-g09d2 From 16182acfcc1fad2885b9c1a96fe74d8ce56a50e0 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 12 Jan 2025 21:59:55 +0900 Subject: refactor(blog/nuldoc): separate pages/* to pages/* and generators/* --- vhosts/blog/nuldoc-src/atom/generate.ts | 4 +- vhosts/blog/nuldoc-src/commands/build.ts | 20 ++-- .../blog/nuldoc-src/components/PostPageEntry.tsx | 2 +- .../blog/nuldoc-src/components/SlidePageEntry.tsx | 4 +- vhosts/blog/nuldoc-src/generators/about.ts | 23 ++++ vhosts/blog/nuldoc-src/generators/home.ts | 19 ++++ vhosts/blog/nuldoc-src/generators/not_found.ts | 21 ++++ vhosts/blog/nuldoc-src/generators/post.ts | 63 +++++++++++ vhosts/blog/nuldoc-src/generators/post_list.ts | 23 ++++ vhosts/blog/nuldoc-src/generators/slide.ts | 53 +++++++++ vhosts/blog/nuldoc-src/generators/slide_list.ts | 23 ++++ vhosts/blog/nuldoc-src/generators/tag.ts | 33 ++++++ vhosts/blog/nuldoc-src/generators/tag_list.ts | 23 ++++ vhosts/blog/nuldoc-src/generators/tagged_page.ts | 4 + vhosts/blog/nuldoc-src/pages/AboutPage.tsx | 94 ++++++++++++++++ vhosts/blog/nuldoc-src/pages/HomePage.tsx | 53 +++++++++ vhosts/blog/nuldoc-src/pages/NotFoundPage.tsx | 27 +++++ vhosts/blog/nuldoc-src/pages/PostListPage.tsx | 41 +++++++ vhosts/blog/nuldoc-src/pages/PostPage.tsx | 74 +++++++++++++ vhosts/blog/nuldoc-src/pages/SlideListPage.tsx | 42 +++++++ vhosts/blog/nuldoc-src/pages/SlidePage.tsx | 70 ++++++++++++ vhosts/blog/nuldoc-src/pages/TagListPage.tsx | 57 ++++++++++ vhosts/blog/nuldoc-src/pages/TagPage.tsx | 43 +++++++ vhosts/blog/nuldoc-src/pages/about.tsx | 105 ------------------ vhosts/blog/nuldoc-src/pages/home.tsx | 64 ----------- vhosts/blog/nuldoc-src/pages/not_found.tsx | 38 ------- vhosts/blog/nuldoc-src/pages/post.tsx | 123 --------------------- vhosts/blog/nuldoc-src/pages/post_list.tsx | 52 --------- vhosts/blog/nuldoc-src/pages/slide.tsx | 109 ------------------ vhosts/blog/nuldoc-src/pages/slide_list.tsx | 53 --------- vhosts/blog/nuldoc-src/pages/tag.tsx | 63 ----------- vhosts/blog/nuldoc-src/pages/tag_list.tsx | 68 ------------ vhosts/blog/nuldoc-src/pages/tagged_page.ts | 4 - 33 files changed, 801 insertions(+), 694 deletions(-) create mode 100644 vhosts/blog/nuldoc-src/generators/about.ts create mode 100644 vhosts/blog/nuldoc-src/generators/home.ts create mode 100644 vhosts/blog/nuldoc-src/generators/not_found.ts create mode 100644 vhosts/blog/nuldoc-src/generators/post.ts create mode 100644 vhosts/blog/nuldoc-src/generators/post_list.ts create mode 100644 vhosts/blog/nuldoc-src/generators/slide.ts create mode 100644 vhosts/blog/nuldoc-src/generators/slide_list.ts create mode 100644 vhosts/blog/nuldoc-src/generators/tag.ts create mode 100644 vhosts/blog/nuldoc-src/generators/tag_list.ts create mode 100644 vhosts/blog/nuldoc-src/generators/tagged_page.ts create mode 100644 vhosts/blog/nuldoc-src/pages/AboutPage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/HomePage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/NotFoundPage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/PostListPage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/PostPage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/SlideListPage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/SlidePage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/TagListPage.tsx create mode 100644 vhosts/blog/nuldoc-src/pages/TagPage.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/about.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/home.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/not_found.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/post.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/post_list.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/slide.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/slide_list.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/tag.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/tag_list.tsx delete mode 100644 vhosts/blog/nuldoc-src/pages/tagged_page.ts (limited to 'vhosts/blog/nuldoc-src/atom') diff --git a/vhosts/blog/nuldoc-src/atom/generate.ts b/vhosts/blog/nuldoc-src/atom/generate.ts index 9e30ef3e..3c76f6c5 100644 --- a/vhosts/blog/nuldoc-src/atom/generate.ts +++ b/vhosts/blog/nuldoc-src/atom/generate.ts @@ -2,8 +2,8 @@ import { Config } from "../config.ts"; import { el } from "../dom.ts"; import { Page } from "../page.ts"; import { Entry, Feed } from "./types.ts"; -import { PostPage } from "../pages/post.tsx"; -import { SlidePage } from "../pages/slide.tsx"; +import { PostPage } from "../generators/post.ts"; +import { SlidePage } from "../generators/slide.ts"; import { dateToRfc3339String } from "../revision.ts"; const BASE_NAME = "atom.xml"; diff --git a/vhosts/blog/nuldoc-src/commands/build.ts b/vhosts/blog/nuldoc-src/commands/build.ts index a542b4f8..a596dc2a 100644 --- a/vhosts/blog/nuldoc-src/commands/build.ts +++ b/vhosts/blog/nuldoc-src/commands/build.ts @@ -7,20 +7,20 @@ import { parseNulDocFile } from "../ndoc/parse.ts"; import { Page } from "../page.ts"; import { render } from "../render.ts"; import { dateToString } from "../revision.ts"; -import { generateAboutPage } from "../pages/about.tsx"; -import { generateHomePage } from "../pages/home.tsx"; -import { generateNotFoundPage } from "../pages/not_found.tsx"; +import { generateAboutPage } from "../generators/about.ts"; +import { generateHomePage } from "../generators/home.ts"; +import { generateNotFoundPage } from "../generators/not_found.ts"; import { generatePostPage, getPostPublishedDate, PostPage, -} from "../pages/post.tsx"; -import { generatePostListPage } from "../pages/post_list.tsx"; -import { generateSlidePage, SlidePage } from "../pages/slide.tsx"; -import { generateSlideListPage } from "../pages/slide_list.tsx"; -import { generateTagPage, TagPage } from "../pages/tag.tsx"; -import { TaggedPage } from "../pages/tagged_page.ts"; -import { generateTagListPage } from "../pages/tag_list.tsx"; +} from "../generators/post.ts"; +import { generatePostListPage } from "../generators/post_list.ts"; +import { generateSlidePage, SlidePage } from "../generators/slide.ts"; +import { generateSlideListPage } from "../generators/slide_list.ts"; +import { generateTagPage, TagPage } from "../generators/tag.ts"; +import { TaggedPage } from "../generators/tagged_page.ts"; +import { generateTagListPage } from "../generators/tag_list.ts"; import { parseSlideFile } from "../slide/parse.ts"; export async function runBuildCommand(config: Config) { diff --git a/vhosts/blog/nuldoc-src/components/PostPageEntry.tsx b/vhosts/blog/nuldoc-src/components/PostPageEntry.tsx index 52e2b5d4..2708b009 100644 --- a/vhosts/blog/nuldoc-src/components/PostPageEntry.tsx +++ b/vhosts/blog/nuldoc-src/components/PostPageEntry.tsx @@ -3,7 +3,7 @@ import { getPostUpdatedDate, postHasAnyUpdates, PostPage, -} from "../pages/post.tsx"; +} from "../generators/post.ts"; import { dateToString } from "../revision.ts"; export default function PostPageEntry({ post }: { post: PostPage }) { diff --git a/vhosts/blog/nuldoc-src/components/SlidePageEntry.tsx b/vhosts/blog/nuldoc-src/components/SlidePageEntry.tsx index 3fa827f9..d2cf9a17 100644 --- a/vhosts/blog/nuldoc-src/components/SlidePageEntry.tsx +++ b/vhosts/blog/nuldoc-src/components/SlidePageEntry.tsx @@ -2,8 +2,8 @@ import { getPostPublishedDate, getPostUpdatedDate, postHasAnyUpdates, -} from "../pages/post.tsx"; -import { SlidePage } from "../pages/slide.tsx"; +} from "../generators/post.ts"; +import { SlidePage } from "../generators/slide.ts"; import { dateToString } from "../revision.ts"; export default function SlidePageEntry({ slide }: { slide: SlidePage }) { diff --git a/vhosts/blog/nuldoc-src/generators/about.ts b/vhosts/blog/nuldoc-src/generators/about.ts new file mode 100644 index 00000000..6663a190 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/about.ts @@ -0,0 +1,23 @@ +import AboutPage from "../pages/AboutPage.tsx"; +import { Config } from "../config.ts"; +import { renderToDOM } from "../jsx/render.ts"; +import { Page } from "../page.ts"; +import { SlidePage } from "./slide.ts"; + +export type AboutPage = Page; + +export async function generateAboutPage( + slides: SlidePage[], + config: Config, +): Promise { + const html = await renderToDOM( + AboutPage(slides, config), + ); + + return { + root: html, + renderer: "html", + destFilePath: "/about/index.html", + href: "/about/", + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/home.ts b/vhosts/blog/nuldoc-src/generators/home.ts new file mode 100644 index 00000000..679dd39a --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/home.ts @@ -0,0 +1,19 @@ +import HomePage from "../pages/HomePage.tsx"; +import { renderToDOM } from "../jsx/render.ts"; +import { Config } from "../config.ts"; +import { Page } from "../page.ts"; + +export type HomePage = Page; + +export async function generateHomePage(config: Config): Promise { + const html = await renderToDOM( + HomePage(config), + ); + + return { + root: html, + renderer: "html", + destFilePath: "/index.html", + href: "/", + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/not_found.ts b/vhosts/blog/nuldoc-src/generators/not_found.ts new file mode 100644 index 00000000..f5a81c86 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/not_found.ts @@ -0,0 +1,21 @@ +import NotFoundPage from "../pages/NotFoundPage.tsx"; +import { renderToDOM } from "../jsx/render.ts"; +import { Config } from "../config.ts"; +import { Page } from "../page.ts"; + +export type NotFoundPage = Page; + +export async function generateNotFoundPage( + config: Config, +): Promise { + const html = await renderToDOM( + NotFoundPage(config), + ); + + return { + root: html, + renderer: "html", + destFilePath: "/404.html", + href: "/404.html", + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/post.ts b/vhosts/blog/nuldoc-src/generators/post.ts new file mode 100644 index 00000000..f90ab193 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/post.ts @@ -0,0 +1,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 { + 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, + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/post_list.ts b/vhosts/blog/nuldoc-src/generators/post_list.ts new file mode 100644 index 00000000..67a4b996 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/post_list.ts @@ -0,0 +1,23 @@ +import { renderToDOM } from "../jsx/render.ts"; +import PostListPage from "../pages/PostListPage.tsx"; +import { Config } from "../config.ts"; +import { Page } from "../page.ts"; +import { PostPage } from "./post.ts"; + +export type PostListPage = Page; + +export async function generatePostListPage( + posts: PostPage[], + config: Config, +): Promise { + const html = await renderToDOM( + PostListPage(posts, config), + ); + + return { + root: html, + renderer: "html", + destFilePath: "/posts/index.html", + href: "/posts/", + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/slide.ts b/vhosts/blog/nuldoc-src/generators/slide.ts new file mode 100644 index 00000000..ab68d332 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/slide.ts @@ -0,0 +1,53 @@ +import { join } from "std/path/mod.ts"; +import { renderToDOM } from "../jsx/render.ts"; +import SlidePage from "../pages/SlidePage.tsx"; +import { Config } from "../config.ts"; +import { Page } from "../page.ts"; +import { Date, Revision } from "../revision.ts"; +import { Slide } from "../slide/slide.ts"; +import { getPostPublishedDate, getPostUpdatedDate } from "./post.ts"; + +export interface SlidePage extends Page { + title: string; + description: string; + event: string; + talkType: string; + slideLink: string; + tags: string[]; + revisions: Revision[]; + published: Date; + updated: Date; + uuid: string; +} + +export async function generateSlidePage( + slide: Slide, + config: Config, +): Promise { + const html = await renderToDOM( + SlidePage(slide, config), + ); + + const cwd = Deno.cwd(); + const contentDir = join(cwd, config.locations.contentDir); + const destFilePath = join( + slide.sourceFilePath.replace(contentDir, "").replace(".toml", ""), + "index.html", + ); + return { + root: html, + renderer: "html", + destFilePath: destFilePath, + href: destFilePath.replace("index.html", ""), + title: slide.title, + description: `登壇: ${slide.event} (${slide.talkType})`, + event: slide.event, + talkType: slide.talkType, + slideLink: slide.slideLink, + tags: slide.tags, + revisions: slide.revisions, + published: getPostPublishedDate(slide), + updated: getPostUpdatedDate(slide), + uuid: slide.uuid, + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/slide_list.ts b/vhosts/blog/nuldoc-src/generators/slide_list.ts new file mode 100644 index 00000000..abebe109 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/slide_list.ts @@ -0,0 +1,23 @@ +import { renderToDOM } from "../jsx/render.ts"; +import SlideListPage from "../pages/SlideListPage.tsx"; +import { Config } from "../config.ts"; +import { Page } from "../page.ts"; +import { SlidePage } from "./slide.ts"; + +export type SlideListPage = Page; + +export async function generateSlideListPage( + slides: SlidePage[], + config: Config, +): Promise { + const html = await renderToDOM( + SlideListPage(slides, config), + ); + + return { + root: html, + renderer: "html", + destFilePath: "/slides/index.html", + href: "/slides/", + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/tag.ts b/vhosts/blog/nuldoc-src/generators/tag.ts new file mode 100644 index 00000000..dbd8ef93 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/tag.ts @@ -0,0 +1,33 @@ +import { renderToDOM } from "../jsx/render.ts"; +import TagPage from "../pages/TagPage.tsx"; +import { Config, getTagLabel } from "../config.ts"; +import { Page } from "../page.ts"; +import { TaggedPage } from "./tagged_page.ts"; + +export interface TagPage extends Page { + tagSlug: string; + tagLabel: string; + numOfPosts: number; + numOfSlides: number; +} + +export async function generateTagPage( + tagSlug: string, + pages: TaggedPage[], + config: Config, +): Promise { + const html = await renderToDOM( + TagPage(tagSlug, pages, config), + ); + + return { + root: html, + renderer: "html", + destFilePath: `/tags/${tagSlug}/index.html`, + href: `/tags/${tagSlug}/`, + tagSlug: tagSlug, + tagLabel: getTagLabel(config, tagSlug), + numOfPosts: pages.filter((p) => !("event" in p)).length, + numOfSlides: pages.filter((p) => "event" in p).length, + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/tag_list.ts b/vhosts/blog/nuldoc-src/generators/tag_list.ts new file mode 100644 index 00000000..7baad8cf --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/tag_list.ts @@ -0,0 +1,23 @@ +import { renderToDOM } from "../jsx/render.ts"; +import TagListPage from "../pages/TagListPage.tsx"; +import { Config } from "../config.ts"; +import { Page } from "../page.ts"; +import { TagPage } from "./tag.ts"; + +export type TagListPage = Page; + +export async function generateTagListPage( + tags: TagPage[], + config: Config, +): Promise { + const html = await renderToDOM( + TagListPage(tags, config), + ); + + return { + root: html, + renderer: "html", + destFilePath: "/tags/index.html", + href: "/tags/", + }; +} diff --git a/vhosts/blog/nuldoc-src/generators/tagged_page.ts b/vhosts/blog/nuldoc-src/generators/tagged_page.ts new file mode 100644 index 00000000..23de8cb4 --- /dev/null +++ b/vhosts/blog/nuldoc-src/generators/tagged_page.ts @@ -0,0 +1,4 @@ +import { PostPage } from "./post.ts"; +import { SlidePage } from "./slide.ts"; + +export type TaggedPage = PostPage | SlidePage; diff --git a/vhosts/blog/nuldoc-src/pages/AboutPage.tsx b/vhosts/blog/nuldoc-src/pages/AboutPage.tsx new file mode 100644 index 00000000..0000edf5 --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/AboutPage.tsx @@ -0,0 +1,94 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import StaticScript from "../components/StaticScript.tsx"; +import { Config } from "../config.ts"; +import { dateToString } from "../revision.ts"; +import { getPostPublishedDate } from "../generators/post.ts"; +import { SlidePage } from "../generators/slide.ts"; + +export default function AboutPage( + slides: SlidePage[], + config: Config, +) { + return ( + + + +
+
+
+

nsfisis

+
+ + +
+ +
+
+
+
+

読み方

+

+ 読み方は決めていません。音にする必要があるときは本名である「いまむら」をお使いください。 +

+
+
+

アカウント

+ +
+
+

仕事

+ +
+
+

登壇

+ +
+
+
+
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/HomePage.tsx b/vhosts/blog/nuldoc-src/pages/HomePage.tsx new file mode 100644 index 00000000..8850d039 --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/HomePage.tsx @@ -0,0 +1,53 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import { Config } from "../config.ts"; + +export default function HomePage(config: Config) { + return ( + + + +
+ +
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/NotFoundPage.tsx b/vhosts/blog/nuldoc-src/pages/NotFoundPage.tsx new file mode 100644 index 00000000..9631fef2 --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/NotFoundPage.tsx @@ -0,0 +1,27 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import { Config } from "../config.ts"; + +export default function NotFoundPage( + config: Config, +) { + return ( + + + +
+
+
404
+
+
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/PostListPage.tsx b/vhosts/blog/nuldoc-src/pages/PostListPage.tsx new file mode 100644 index 00000000..3fcfbf1f --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/PostListPage.tsx @@ -0,0 +1,41 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import PostPageEntry from "../components/PostPageEntry.tsx"; +import { Config } from "../config.ts"; +import { dateToString } from "../revision.ts"; +import { getPostPublishedDate, PostPage } from "../generators/post.ts"; + +export default function PostListPage( + posts: PostPage[], + config: Config, +) { + const pageTitle = "投稿一覧"; + + return ( + + + +
+
+

{pageTitle}

+
+ {Array.from(posts).sort((a, b) => { + const ta = dateToString(getPostPublishedDate(a)); + const tb = dateToString(getPostPublishedDate(b)); + if (ta > tb) return -1; + if (ta < tb) return 1; + return 0; + }).map((post) => )} +
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/PostPage.tsx b/vhosts/blog/nuldoc-src/pages/PostPage.tsx new file mode 100644 index 00000000..e6aa83aa --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/PostPage.tsx @@ -0,0 +1,74 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import { Config, getTagLabel } from "../config.ts"; +import { Element } from "../dom.ts"; +import { Document } from "../ndoc/document.ts"; +import { dateToString } from "../revision.ts"; +import { getPostPublishedDate } from "../generators/post.ts"; + +export default function PostPage( + doc: Document, + config: Config, +) { + return ( + getTagLabel(config, slug))} + metaTitle={`${doc.title}|${config.blog.siteName}`} + requiresSyntaxHighlight + config={config} + > + + +
+
+
+

{doc.title}

+ {doc.tags.length !== 0 && ( + + )} +
+
+
+

更新履歴

+
    + {doc.revisions.map((rev) => ( +
  1. + + {`: ${rev.remark}`} +
  2. + ))} +
+
+ { + // TODO: refactor + (doc.root.children[0] as Element).children + } + { + // TODO: footnotes + //
+ // <% for footnote in footnotes %> + //
+ // <%= footnote.index %>. <%= footnote.text %> + //
+ // <% end %> + //
+ } +
+
+
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/SlideListPage.tsx b/vhosts/blog/nuldoc-src/pages/SlideListPage.tsx new file mode 100644 index 00000000..44d6afff --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/SlideListPage.tsx @@ -0,0 +1,42 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import SlidePageEntry from "../components/SlidePageEntry.tsx"; +import { Config } from "../config.ts"; +import { dateToString } from "../revision.ts"; +import { getPostPublishedDate } from "../generators/post.ts"; +import { SlidePage } from "../generators/slide.ts"; + +export default function SlideListPage( + slides: SlidePage[], + config: Config, +) { + const pageTitle = "スライド一覧"; + + return ( + + + +
+
+

{pageTitle}

+
+ {Array.from(slides).sort((a, b) => { + const ta = dateToString(getPostPublishedDate(a)); + const tb = dateToString(getPostPublishedDate(b)); + if (ta > tb) return -1; + if (ta < tb) return 1; + return 0; + }).map((slide) => )} +
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/SlidePage.tsx b/vhosts/blog/nuldoc-src/pages/SlidePage.tsx new file mode 100644 index 00000000..6d167036 --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/SlidePage.tsx @@ -0,0 +1,70 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import StaticScript from "../components/StaticScript.tsx"; +import { Config, getTagLabel } from "../config.ts"; +import { dateToString } from "../revision.ts"; +import { Slide } from "../slide/slide.ts"; +import { getPostPublishedDate } from "../generators/post.ts"; + +export default function SlidePage( + slide: Slide, + config: Config, +) { + return ( + getTagLabel(config, slug))} + metaTitle={`${slide.event} (${slide.talkType})|${config.blog.siteName}`} + requiresSyntaxHighlight + config={config} + > + + +
+
+
+

{slide.title}

+ {slide.tags.length !== 0 && ( + + )} +
+
+
+

更新履歴

+
    + {slide.revisions.map((rev) => ( +
  1. + + {`: ${rev.remark}`} +
  2. + ))} +
+
+ +
+ + +
+ +
+
+
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/TagListPage.tsx b/vhosts/blog/nuldoc-src/pages/TagListPage.tsx new file mode 100644 index 00000000..cdb83ea5 --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/TagListPage.tsx @@ -0,0 +1,57 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import { Config } from "../config.ts"; +import { TagPage } from "../generators/tag.ts"; + +export default function TagListPage( + tags: TagPage[], + config: Config, +) { + const pageTitle = "タグ一覧"; + + return ( + + + +
+
+

{pageTitle}

+
+ {Array.from(tags).sort((a, b) => { + const ta = a.tagSlug; + const tb = b.tagSlug; + if (ta < tb) return -1; + if (ta > tb) return 1; + return 0; + }).map((tag) => ( + + ))} +
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/TagPage.tsx b/vhosts/blog/nuldoc-src/pages/TagPage.tsx new file mode 100644 index 00000000..568dfaa6 --- /dev/null +++ b/vhosts/blog/nuldoc-src/pages/TagPage.tsx @@ -0,0 +1,43 @@ +import GlobalFooter from "../components/GlobalFooter.tsx"; +import GlobalHeader from "../components/GlobalHeader.tsx"; +import PageLayout from "../components/PageLayout.tsx"; +import PostPageEntry from "../components/PostPageEntry.tsx"; +import SlidePageEntry from "../components/SlidePageEntry.tsx"; +import { Config, getTagLabel } from "../config.ts"; +import { getPostPublishedDate } from "../generators/post.ts"; +import { TaggedPage } from "../generators/tagged_page.ts"; + +export default function TagPage( + tagSlug: string, + pages: TaggedPage[], + config: Config, +) { + const tagLabel = getTagLabel(config, tagSlug); + const pageTitle = `タグ「${tagLabel}」一覧`; + + return ( + + + +
+
+

{pageTitle}

+
+ {pages.map((page) => + "event" in page + ? + : + )} +
+ + +
+ ); +} diff --git a/vhosts/blog/nuldoc-src/pages/about.tsx b/vhosts/blog/nuldoc-src/pages/about.tsx deleted file mode 100644 index 91d7fee4..00000000 --- a/vhosts/blog/nuldoc-src/pages/about.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.tsx"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import StaticScript from "../components/StaticScript.tsx"; -import { Config } from "../config.ts"; -import { renderToDOM } from "../jsx/render.ts"; -import { Page } from "../page.ts"; -import { dateToString } from "../revision.ts"; -import { getPostPublishedDate } from "./post.tsx"; -import { SlidePage } from "./slide.tsx"; - -export type AboutPage = Page; - -export async function generateAboutPage( - slides: SlidePage[], - config: Config, -): Promise { - const html = await renderToDOM( - - - -
-
-
-

nsfisis

-
- - -
- -
-
-
-
-

読み方

-

- 読み方は決めていません。音にする必要があるときは本名である「いまむら」をお使いください。 -

-
-
-

アカウント

- -
-
-

仕事

- -
-
-

登壇

- -
-
-
-
- - -
, - ); - - return { - root: html, - renderer: "html", - destFilePath: "/about/index.html", - href: "/about/", - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/home.tsx b/vhosts/blog/nuldoc-src/pages/home.tsx deleted file mode 100644 index a9a5d542..00000000 --- a/vhosts/blog/nuldoc-src/pages/home.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.tsx"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import { Config } from "../config.ts"; -import { Page } from "../page.ts"; - -export type HomePage = Page; - -export async function generateHomePage(config: Config): Promise { - const html = await renderToDOM( - - - -
- -
- - -
, - ); - - return { - root: html, - renderer: "html", - destFilePath: "/index.html", - href: "/", - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/not_found.tsx b/vhosts/blog/nuldoc-src/pages/not_found.tsx deleted file mode 100644 index 27be0738..00000000 --- a/vhosts/blog/nuldoc-src/pages/not_found.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.tsx"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import { Config } from "../config.ts"; -import { Page } from "../page.ts"; - -export type NotFoundPage = Page; - -export async function generateNotFoundPage( - config: Config, -): Promise { - const html = await renderToDOM( - - - -
-
-
404
-
-
- - -
, - ); - - return { - root: html, - renderer: "html", - destFilePath: "/404.html", - href: "/404.html", - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/post.tsx b/vhosts/blog/nuldoc-src/pages/post.tsx deleted file mode 100644 index 541c33e3..00000000 --- a/vhosts/blog/nuldoc-src/pages/post.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { join } from "std/path/mod.ts"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalFooter from "../components/GlobalFooter.tsx"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import { Config, getTagLabel } from "../config.ts"; -import { Element } from "../dom.ts"; -import { Document } from "../ndoc/document.ts"; -import { Page } from "../page.ts"; -import { Date, dateToString, 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 { - const html = await renderToDOM( - getTagLabel(config, slug))} - metaTitle={`${doc.title}|${config.blog.siteName}`} - requiresSyntaxHighlight - config={config} - > - - -
-
-
-

{doc.title}

- {doc.tags.length !== 0 && ( - - )} -
-
-
-

更新履歴

-
    - {doc.revisions.map((rev) => ( -
  1. - - {`: ${rev.remark}`} -
  2. - ))} -
-
- { - // TODO: refactor - (doc.root.children[0] as Element).children - } - { - // TODO: footnotes - //
- // <% for footnote in footnotes %> - //
- // <%= footnote.index %>. <%= footnote.text %> - //
- // <% end %> - //
- } -
-
-
- - -
, - ); - - 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, - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/post_list.tsx b/vhosts/blog/nuldoc-src/pages/post_list.tsx deleted file mode 100644 index 3cf17df4..00000000 --- a/vhosts/blog/nuldoc-src/pages/post_list.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.tsx"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import PostPageEntry from "../components/PostPageEntry.tsx"; -import { Config } from "../config.ts"; -import { Page } from "../page.ts"; -import { dateToString } from "../revision.ts"; -import { getPostPublishedDate, PostPage } from "./post.tsx"; - -export type PostListPage = Page; - -export async function generatePostListPage( - posts: PostPage[], - config: Config, -): Promise { - const pageTitle = "投稿一覧"; - - const html = await renderToDOM( - - - -
-
-

{pageTitle}

-
- {Array.from(posts).sort((a, b) => { - const ta = dateToString(getPostPublishedDate(a)); - const tb = dateToString(getPostPublishedDate(b)); - if (ta > tb) return -1; - if (ta < tb) return 1; - return 0; - }).map((post) => )} -
- - -
, - ); - - return { - root: html, - renderer: "html", - destFilePath: "/posts/index.html", - href: "/posts/", - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/slide.tsx b/vhosts/blog/nuldoc-src/pages/slide.tsx deleted file mode 100644 index 843f539b..00000000 --- a/vhosts/blog/nuldoc-src/pages/slide.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { join } from "std/path/mod.ts"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalFooter from "../components/GlobalFooter.tsx"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import StaticScript from "../components/StaticScript.tsx"; -import { Config, getTagLabel } from "../config.ts"; -import { Page } from "../page.ts"; -import { Date, dateToString, Revision } from "../revision.ts"; -import { Slide } from "../slide/slide.ts"; -import { getPostPublishedDate, getPostUpdatedDate } from "./post.tsx"; - -export interface SlidePage extends Page { - title: string; - description: string; - event: string; - talkType: string; - slideLink: string; - tags: string[]; - revisions: Revision[]; - published: Date; - updated: Date; - uuid: string; -} - -export async function generateSlidePage( - slide: Slide, - config: Config, -): Promise { - const html = await renderToDOM( - getTagLabel(config, slug))} - metaTitle={`${slide.event} (${slide.talkType})|${config.blog.siteName}`} - requiresSyntaxHighlight - config={config} - > - - -
-
-
-

{slide.title}

- {slide.tags.length !== 0 && ( - - )} -
-
-
-

更新履歴

-
    - {slide.revisions.map((rev) => ( -
  1. - - {`: ${rev.remark}`} -
  2. - ))} -
-
- -
- - -
- -
-
-
- - -
, - ); - - const cwd = Deno.cwd(); - const contentDir = join(cwd, config.locations.contentDir); - const destFilePath = join( - slide.sourceFilePath.replace(contentDir, "").replace(".toml", ""), - "index.html", - ); - return { - root: html, - renderer: "html", - destFilePath: destFilePath, - href: destFilePath.replace("index.html", ""), - title: slide.title, - description: `登壇: ${slide.event} (${slide.talkType})`, - event: slide.event, - talkType: slide.talkType, - slideLink: slide.slideLink, - tags: slide.tags, - revisions: slide.revisions, - published: getPostPublishedDate(slide), - updated: getPostUpdatedDate(slide), - uuid: slide.uuid, - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/slide_list.tsx b/vhosts/blog/nuldoc-src/pages/slide_list.tsx deleted file mode 100644 index e42cfcea..00000000 --- a/vhosts/blog/nuldoc-src/pages/slide_list.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.tsx"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import SlidePageEntry from "../components/SlidePageEntry.tsx"; -import { Config } from "../config.ts"; -import { Page } from "../page.ts"; -import { dateToString } from "../revision.ts"; -import { getPostPublishedDate } from "./post.tsx"; -import { SlidePage } from "./slide.tsx"; - -export type SlideListPage = Page; - -export async function generateSlideListPage( - slides: SlidePage[], - config: Config, -): Promise { - const pageTitle = "スライド一覧"; - - const html = await renderToDOM( - - - -
-
-

{pageTitle}

-
- {Array.from(slides).sort((a, b) => { - const ta = dateToString(getPostPublishedDate(a)); - const tb = dateToString(getPostPublishedDate(b)); - if (ta > tb) return -1; - if (ta < tb) return 1; - return 0; - }).map((slide) => )} -
- - -
, - ); - - return { - root: html, - renderer: "html", - destFilePath: "/slides/index.html", - href: "/slides/", - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/tag.tsx b/vhosts/blog/nuldoc-src/pages/tag.tsx deleted file mode 100644 index f7df1f13..00000000 --- a/vhosts/blog/nuldoc-src/pages/tag.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.tsx"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import PostPageEntry from "../components/PostPageEntry.tsx"; -import SlidePageEntry from "../components/SlidePageEntry.tsx"; -import { Config, getTagLabel } from "../config.ts"; -import { Page } from "../page.ts"; -import { getPostPublishedDate } from "./post.tsx"; -import { TaggedPage } from "./tagged_page.ts"; - -export interface TagPage extends Page { - tagSlug: string; - tagLabel: string; - numOfPosts: number; - numOfSlides: number; -} - -export async function generateTagPage( - tagSlug: string, - pages: TaggedPage[], - config: Config, -): Promise { - const tagLabel = getTagLabel(config, tagSlug); - const pageTitle = `タグ「${tagLabel}」一覧`; - - const html = await renderToDOM( - - - -
-
-

{pageTitle}

-
- {pages.map((page) => - "event" in page - ? - : - )} -
- - -
, - ); - - return { - root: html, - renderer: "html", - destFilePath: `/tags/${tagSlug}/index.html`, - href: `/tags/${tagSlug}/`, - tagSlug: tagSlug, - tagLabel: tagLabel, - numOfPosts: pages.filter((p) => !("event" in p)).length, - numOfSlides: pages.filter((p) => "event" in p).length, - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/tag_list.tsx b/vhosts/blog/nuldoc-src/pages/tag_list.tsx deleted file mode 100644 index 728384f4..00000000 --- a/vhosts/blog/nuldoc-src/pages/tag_list.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.tsx"; -import { renderToDOM } from "../jsx/render.ts"; -import GlobalHeader from "../components/GlobalHeader.tsx"; -import PageLayout from "../components/PageLayout.tsx"; -import { Config } from "../config.ts"; -import { Page } from "../page.ts"; -import { TagPage } from "./tag.tsx"; - -export type TagListPage = Page; - -export async function generateTagListPage( - tags: TagPage[], - config: Config, -): Promise { - const pageTitle = "タグ一覧"; - - const html = await renderToDOM( - - - -
-
-

{pageTitle}

-
- {Array.from(tags).sort((a, b) => { - const ta = a.tagSlug; - const tb = b.tagSlug; - if (ta < tb) return -1; - if (ta > tb) return 1; - return 0; - }).map((tag) => ( - - ))} -
- - -
, - ); - - return { - root: html, - renderer: "html", - destFilePath: "/tags/index.html", - href: "/tags/", - }; -} diff --git a/vhosts/blog/nuldoc-src/pages/tagged_page.ts b/vhosts/blog/nuldoc-src/pages/tagged_page.ts deleted file mode 100644 index 026ca91f..00000000 --- a/vhosts/blog/nuldoc-src/pages/tagged_page.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PostPage } from "./post.tsx"; -import { SlidePage } from "./slide.tsx"; - -export type TaggedPage = PostPage | SlidePage; -- cgit v1.2.3-70-g09d2