diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-01 00:49:15 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-01 00:49:19 +0900 |
| commit | 6dedddc545e2f1930bdc2256784eb1551bd4231d (patch) | |
| tree | 75fcb5a6043dc0f2c31b098bf3cfd17a2b938599 /services/nuldoc/nuldoc-src/pages | |
| parent | d08e3edb65b215152aa26e3518fb2f2cd7071c4b (diff) | |
| download | nsfisis.dev-6dedddc545e2f1930bdc2256784eb1551bd4231d.tar.gz nsfisis.dev-6dedddc545e2f1930bdc2256784eb1551bd4231d.tar.zst nsfisis.dev-6dedddc545e2f1930bdc2256784eb1551bd4231d.zip | |
feat(nuldoc): rewrite nuldoc in Ruby
Diffstat (limited to 'services/nuldoc/nuldoc-src/pages')
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/AboutPage.ts | 154 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/AtomPage.ts | 27 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/HomePage.ts | 66 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/NotFoundPage.ts | 40 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/PostListPage.ts | 48 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/PostPage.ts | 94 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/SlideListPage.ts | 45 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/SlidePage.ts | 140 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/TagListPage.ts | 67 | ||||
| -rw-r--r-- | services/nuldoc/nuldoc-src/pages/TagPage.ts | 50 |
10 files changed, 0 insertions, 731 deletions
diff --git a/services/nuldoc/nuldoc-src/pages/AboutPage.ts b/services/nuldoc/nuldoc-src/pages/AboutPage.ts deleted file mode 100644 index 5ae2ff52..00000000 --- a/services/nuldoc/nuldoc-src/pages/AboutPage.ts +++ /dev/null @@ -1,154 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import GlobalHeader from "../components/AboutGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import StaticScript from "../components/StaticScript.ts"; -import { Config } from "../config.ts"; -import { dateToString } from "../revision.ts"; -import { getPostPublishedDate } from "../generators/post.ts"; -import { SlidePage } from "../generators/slide.ts"; -import { - a, - article, - div, - elem, - Element, - h1, - h2, - header, - img, - li, - p, - section, - ul, -} from "../dom.ts"; - -export default async function AboutPage( - slides: SlidePage[], - config: Config, -): Promise<Element> { - return await PageLayout({ - metaCopyrightYear: config.site.copyrightYear, - metaDescription: "このサイトの著者について", - metaTitle: `About|${config.sites.about.siteName}`, - site: "about", - config, - children: elem( - "body", - { class: "single" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - article( - { class: "post-single" }, - header( - { class: "post-header" }, - h1({ class: "post-title" }, "nsfisis"), - div( - { class: "my-icon" }, - div( - { id: "myIcon" }, - img({ src: "/favicon.svg" }), - ), - await StaticScript({ - site: "about", - fileName: "/my-icon.js", - defer: "true", - config, - }), - ), - ), - div( - { class: "post-content" }, - section( - {}, - h2({}, "読み方"), - p( - {}, - "読み方は決めていません。音にする必要があるときは本名である「いまむら」をお使いください。", - ), - ), - section( - {}, - h2({}, "アカウント"), - ul( - {}, - li( - {}, - a( - { - href: "https://twitter.com/nsfisis", - target: "_blank", - rel: "noreferrer", - }, - "Twitter (現 𝕏): @nsfisis", - ), - ), - li( - {}, - a( - { - href: "https://github.com/nsfisis", - target: "_blank", - rel: "noreferrer", - }, - "GitHub: @nsfisis", - ), - ), - ), - ), - section( - {}, - h2({}, "仕事"), - ul( - {}, - li( - {}, - "2021-01~現在: ", - a( - { - href: "https://www.dgcircus.com/", - target: "_blank", - rel: "noreferrer", - }, - "デジタルサーカス株式会社", - ), - ), - ), - ), - section( - {}, - h2({}, "登壇"), - ul( - {}, - ...Array.from(slides) - .sort((s1, s2) => { - const ta = dateToString(getPostPublishedDate(s1)); - const tb = dateToString(getPostPublishedDate(s2)); - if (ta > tb) return -1; - if (ta < tb) return 1; - return 0; - }) - .map((slide) => - li( - {}, - a( - { - href: - `https://${config.sites.slides.fqdn}${slide.href}`, - }, - `${ - dateToString(getPostPublishedDate(slide)) - }: ${slide.event} (${slide.talkType})`, - ), - ) - ), - ), - ), - ), - ), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/AtomPage.ts b/services/nuldoc/nuldoc-src/pages/AtomPage.ts deleted file mode 100644 index b39902ee..00000000 --- a/services/nuldoc/nuldoc-src/pages/AtomPage.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Feed } from "../generators/atom.ts"; -import { elem, Element, link } from "../dom.ts"; - -export default function AtomPage({ feed }: { feed: Feed }): Element { - return elem( - "feed", - { xmlns: "http://www.w3.org/2005/Atom" }, - elem("id", {}, feed.id), - elem("title", {}, feed.title), - link({ rel: "alternate", href: feed.linkToAlternate }), - link({ rel: "self", href: feed.linkToSelf }), - elem("author", {}, elem("name", {}, feed.author)), - elem("updated", {}, feed.updated), - ...feed.entries.map((entry) => - elem( - "entry", - {}, - elem("id", {}, entry.id), - link({ rel: "alternate", href: entry.linkToAlternate }), - elem("title", {}, entry.title), - elem("summary", {}, entry.summary), - elem("published", {}, entry.published), - elem("updated", {}, entry.updated), - ) - ), - ); -} diff --git a/services/nuldoc/nuldoc-src/pages/HomePage.ts b/services/nuldoc/nuldoc-src/pages/HomePage.ts deleted file mode 100644 index 6e984586..00000000 --- a/services/nuldoc/nuldoc-src/pages/HomePage.ts +++ /dev/null @@ -1,66 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import GlobalHeader from "../components/DefaultGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import { Config } from "../config.ts"; -import { a, article, elem, Element, h2, header } from "../dom.ts"; - -export default async function HomePage(config: Config): Promise<Element> { - return await PageLayout({ - metaCopyrightYear: config.site.copyrightYear, - metaDescription: "nsfisis のサイト", - metaTitle: config.sites.default.siteName, - metaAtomFeedHref: `https://${config.sites.default.fqdn}/atom.xml`, - site: "default", - config, - children: elem( - "body", - { class: "single" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - article( - { class: "post-single" }, - article( - { class: "post-entry" }, - a( - { href: `https://${config.sites.about.fqdn}/` }, - header( - { class: "entry-header" }, - h2({}, "About"), - ), - ), - ), - article( - { class: "post-entry" }, - a( - { href: `https://${config.sites.blog.fqdn}/posts/` }, - header({ class: "entry-header" }, h2({}, "Blog")), - ), - ), - article( - { class: "post-entry" }, - a( - { href: `https://${config.sites.slides.fqdn}/slides/` }, - header( - { class: "entry-header" }, - h2({}, "Slides"), - ), - ), - ), - article( - { class: "post-entry" }, - a( - { href: `https://repos.${config.sites.default.fqdn}/` }, - header( - { class: "entry-header" }, - h2({}, "Repositories"), - ), - ), - ), - ), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/NotFoundPage.ts b/services/nuldoc/nuldoc-src/pages/NotFoundPage.ts deleted file mode 100644 index 62080665..00000000 --- a/services/nuldoc/nuldoc-src/pages/NotFoundPage.ts +++ /dev/null @@ -1,40 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import AboutGlobalHeader from "../components/AboutGlobalHeader.ts"; -import BlogGlobalHeader from "../components/BlogGlobalHeader.ts"; -import SlidesGlobalHeader from "../components/SlidesGlobalHeader.ts"; -import DefaultGlobalHeader from "../components/DefaultGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import { Config } from "../config.ts"; -import { article, div, elem, Element } from "../dom.ts"; - -export default async function NotFoundPage( - site: "default" | "about" | "blog" | "slides", - config: Config, -): Promise<Element> { - const GlobalHeader = site === "about" - ? AboutGlobalHeader - : site === "blog" - ? BlogGlobalHeader - : site === "slides" - ? SlidesGlobalHeader - : DefaultGlobalHeader; - - return await PageLayout({ - metaCopyrightYear: config.site.copyrightYear, - metaDescription: "リクエストされたページが見つかりません", - metaTitle: `Page Not Found|${config.sites[site].siteName}`, - site, - config, - children: elem( - "body", - { class: "single" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - article({}, div({ class: "not-found" }, "404")), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/PostListPage.ts b/services/nuldoc/nuldoc-src/pages/PostListPage.ts deleted file mode 100644 index ef7bfc57..00000000 --- a/services/nuldoc/nuldoc-src/pages/PostListPage.ts +++ /dev/null @@ -1,48 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import GlobalHeader from "../components/BlogGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import Pagination from "../components/Pagination.ts"; -import PostPageEntry from "../components/PostPageEntry.ts"; -import { Config } from "../config.ts"; -import { PostPage } from "../generators/post.ts"; -import { elem, Element, h1, header } from "../dom.ts"; - -export default async function PostListPage( - posts: PostPage[], - config: Config, - currentPage: number, - totalPages: number, -): Promise<Element> { - const pageTitle = "投稿一覧"; - - const pageInfoSuffix = ` (${currentPage}ページ目)`; - const metaTitle = - `${pageTitle}${pageInfoSuffix}|${config.sites.blog.siteName}`; - const metaDescription = `投稿した記事の一覧${pageInfoSuffix}`; - - return await PageLayout({ - metaCopyrightYear: config.site.copyrightYear, - metaDescription, - metaTitle, - metaAtomFeedHref: `https://${config.sites.blog.fqdn}/posts/atom.xml`, - site: "blog", - config, - children: elem( - "body", - { class: "list" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - header( - { class: "page-header" }, - h1({}, pageTitle + pageInfoSuffix), - ), - Pagination({ currentPage, totalPages, basePath: "/posts/" }), - ...posts.map((post) => PostPageEntry({ post, config })), - Pagination({ currentPage, totalPages, basePath: "/posts/" }), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/PostPage.ts b/services/nuldoc/nuldoc-src/pages/PostPage.ts deleted file mode 100644 index 20eec996..00000000 --- a/services/nuldoc/nuldoc-src/pages/PostPage.ts +++ /dev/null @@ -1,94 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import GlobalHeader from "../components/BlogGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import TableOfContents from "../components/TableOfContents.ts"; -import { Config, getTagLabel } from "../config.ts"; -import { - a, - article, - div, - elem, - Element, - h1, - h2, - header, - li, - ol, - section, - ul, -} from "../dom.ts"; -import { Document } from "../markdown/document.ts"; -import { dateToString } from "../revision.ts"; -import { getPostPublishedDate } from "../generators/post.ts"; - -export default async function PostPage( - doc: Document, - config: Config, -): Promise<Element> { - return await PageLayout({ - metaCopyrightYear: getPostPublishedDate(doc).year, - metaDescription: doc.description, - metaKeywords: doc.tags.map((slug) => getTagLabel(config, slug)), - metaTitle: `${doc.title}|${config.sites.blog.siteName}`, - requiresSyntaxHighlight: true, - site: "blog", - config, - children: elem( - "body", - { class: "single" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - article( - { class: "post-single" }, - header( - { class: "post-header" }, - h1({ class: "post-title" }, doc.title), - doc.tags.length !== 0 - ? ul( - { class: "post-tags" }, - ...doc.tags.map((slug) => - li( - { class: "tag" }, - a( - { class: "tag-inner", href: `/tags/${slug}/` }, - getTagLabel(config, slug), - ), - ) - ), - ) - : null, - ), - doc.toc && doc.toc.entries.length > 0 - ? TableOfContents({ toc: doc.toc }) - : null, - div( - { class: "post-content" }, - section( - { id: "changelog" }, - h2({}, a({ href: "#changelog" }, "更新履歴")), - ol( - {}, - ...doc.revisions.map((rev) => - li( - { class: "revision" }, - elem( - "time", - { datetime: dateToString(rev.date) }, - dateToString(rev.date), - ), - `: ${rev.remark}`, - ) - ), - ), - ), - // TODO: refactor - ...(doc.root.children[0] as Element).children, - ), - ), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/SlideListPage.ts b/services/nuldoc/nuldoc-src/pages/SlideListPage.ts deleted file mode 100644 index f1b1a2a1..00000000 --- a/services/nuldoc/nuldoc-src/pages/SlideListPage.ts +++ /dev/null @@ -1,45 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import GlobalHeader from "../components/SlidesGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import SlidePageEntry from "../components/SlidePageEntry.ts"; -import { Config } from "../config.ts"; -import { dateToString } from "../revision.ts"; -import { getPostPublishedDate } from "../generators/post.ts"; -import { SlidePage } from "../generators/slide.ts"; -import { elem, Element, h1, header } from "../dom.ts"; - -export default async function SlideListPage( - slides: SlidePage[], - config: Config, -): Promise<Element> { - const pageTitle = "スライド一覧"; - - return await PageLayout({ - metaCopyrightYear: config.site.copyrightYear, - metaDescription: "登壇したイベントで使用したスライドの一覧", - metaTitle: `${pageTitle}|${config.sites.slides.siteName}`, - metaAtomFeedHref: `https://${config.sites.slides.fqdn}/slides/atom.xml`, - site: "slides", - config, - children: elem( - "body", - { class: "list" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - header({ class: "page-header" }, h1({}, pageTitle)), - ...Array.from(slides) - .sort((s1, s2) => { - const ta = dateToString(getPostPublishedDate(s1)); - const tb = dateToString(getPostPublishedDate(s2)); - if (ta > tb) return -1; - if (ta < tb) return 1; - return 0; - }) - .map((slide) => SlidePageEntry({ slide, config })), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/SlidePage.ts b/services/nuldoc/nuldoc-src/pages/SlidePage.ts deleted file mode 100644 index 149ecf8e..00000000 --- a/services/nuldoc/nuldoc-src/pages/SlidePage.ts +++ /dev/null @@ -1,140 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import GlobalHeader from "../components/SlidesGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import StaticStylesheet from "../components/StaticStylesheet.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 { - a, - article, - button, - div, - elem, - Element, - h1, - h2, - header, - li, - ol, - section, - ul, -} from "../dom.ts"; - -export default async function SlidePage( - slide: Slide, - config: Config, -): Promise<Element> { - return await PageLayout({ - metaCopyrightYear: getPostPublishedDate(slide).year, - metaDescription: `「${slide.title}」(${slide.event} で登壇)`, - metaKeywords: slide.tags.map((slug) => getTagLabel(config, slug)), - metaTitle: - `${slide.title} (${slide.event})|${config.sites.slides.siteName}`, - requiresSyntaxHighlight: true, - site: "slides", - config, - children: elem( - "body", - { class: "single" }, - await StaticStylesheet({ - site: "slides", - fileName: "/slides.css", - config, - }), - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - article( - { class: "post-single" }, - header( - { class: "post-header" }, - h1({ class: "post-title" }, slide.title), - slide.tags.length !== 0 - ? ul( - { class: "post-tags" }, - ...slide.tags.map((slug) => - li( - { class: "tag" }, - a( - { class: "tag-inner", href: `/tags/${slug}/` }, - getTagLabel(config, slug), - ), - ) - ), - ) - : null, - ), - div( - { class: "post-content" }, - section( - { id: "changelog" }, - h2({}, a({ href: "#changelog" }, "更新履歴")), - ol( - {}, - ...slide.revisions.map((rev) => - li( - { class: "revision" }, - elem( - "time", - { datetime: dateToString(rev.date) }, - dateToString(rev.date), - ), - `: ${rev.remark}`, - ) - ), - ), - ), - elem("canvas", { id: "slide", "data-slide-link": slide.slideLink }), - div( - { class: "controllers" }, - div( - { class: "controllers-buttons" }, - button( - { id: "prev", type: "button" }, - elem( - "svg", - { - width: "20", - height: "20", - viewBox: "0 0 24 24", - fill: "none", - stroke: "currentColor", - "stroke-width": "2", - }, - elem("path", { d: "M15 18l-6-6 6-6" }), - ), - ), - button( - { id: "next", type: "button" }, - elem( - "svg", - { - width: "20", - height: "20", - viewBox: "0 0 24 24", - fill: "none", - stroke: "currentColor", - "stroke-width": "2", - }, - elem("path", { d: "M9 18l6-6-6-6" }), - ), - ), - ), - ), - await StaticScript({ - site: "slides", - fileName: "/slide.js", - type: "module", - config, - }), - ), - ), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/TagListPage.ts b/services/nuldoc/nuldoc-src/pages/TagListPage.ts deleted file mode 100644 index cf1ec517..00000000 --- a/services/nuldoc/nuldoc-src/pages/TagListPage.ts +++ /dev/null @@ -1,67 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import BlogGlobalHeader from "../components/BlogGlobalHeader.ts"; -import SlidesGlobalHeader from "../components/SlidesGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import { Config } from "../config.ts"; -import { TagPage } from "../generators/tag.ts"; -import { a, article, elem, Element, footer, h1, h2, header } from "../dom.ts"; - -export default async function TagListPage( - tags: TagPage[], - site: "blog" | "slides", - config: Config, -): Promise<Element> { - const pageTitle = "タグ一覧"; - - const GlobalHeader = site === "blog" ? BlogGlobalHeader : SlidesGlobalHeader; - - return await PageLayout({ - metaCopyrightYear: config.site.copyrightYear, - metaDescription: "タグの一覧", - metaTitle: `${pageTitle}|${config.sites[site].siteName}`, - site, - config, - children: elem( - "body", - { class: "list" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - header({ class: "page-header" }, h1({}, pageTitle)), - ...Array.from(tags) - .sort((t1, t2) => { - const ta = t1.tagSlug; - const tb = t2.tagSlug; - if (ta < tb) return -1; - if (ta > tb) return 1; - return 0; - }) - .map((tag) => { - const posts = tag.numOfPosts === 0 - ? "" - : `${tag.numOfPosts}件の記事`; - const slides = tag.numOfSlides === 0 - ? "" - : `${tag.numOfSlides}件のスライド`; - const footerText = `${posts}${ - posts && slides ? "、" : "" - }${slides}`; - - return article( - { class: "post-entry" }, - a( - { href: tag.href }, - header( - { class: "entry-header" }, - h2({}, tag.tagLabel), - ), - footer({ class: "entry-footer" }, footerText), - ), - ); - }), - ), - GlobalFooter({ config }), - ), - }); -} diff --git a/services/nuldoc/nuldoc-src/pages/TagPage.ts b/services/nuldoc/nuldoc-src/pages/TagPage.ts deleted file mode 100644 index 1826219c..00000000 --- a/services/nuldoc/nuldoc-src/pages/TagPage.ts +++ /dev/null @@ -1,50 +0,0 @@ -import GlobalFooter from "../components/GlobalFooter.ts"; -import BlogGlobalHeader from "../components/BlogGlobalHeader.ts"; -import SlidesGlobalHeader from "../components/SlidesGlobalHeader.ts"; -import PageLayout from "../components/PageLayout.ts"; -import PostPageEntry from "../components/PostPageEntry.ts"; -import SlidePageEntry from "../components/SlidePageEntry.ts"; -import { Config, getTagLabel } from "../config.ts"; -import { getPostPublishedDate } from "../generators/post.ts"; -import { TaggedPage } from "../generators/tagged_page.ts"; -import { elem, Element, h1, header } from "../dom.ts"; - -export default async function TagPage( - tagSlug: string, - pages: TaggedPage[], - site: "blog" | "slides", - config: Config, -): Promise<Element> { - const tagLabel = getTagLabel(config, tagSlug); - const pageTitle = `タグ「${tagLabel}」一覧`; - - const GlobalHeader = site === "blog" ? BlogGlobalHeader : SlidesGlobalHeader; - - return await PageLayout({ - metaCopyrightYear: getPostPublishedDate(pages[pages.length - 1]).year, - metaDescription: `タグ「${tagLabel}」のついた記事またはスライドの一覧`, - metaKeywords: [tagLabel], - metaTitle: `${pageTitle}|${config.sites[site].siteName}`, - metaAtomFeedHref: `https://${ - config.sites[site].fqdn - }/tags/${tagSlug}/atom.xml`, - site, - config, - children: elem( - "body", - { class: "list" }, - GlobalHeader({ config }), - elem( - "main", - { class: "main" }, - header({ class: "page-header" }, h1({}, pageTitle)), - ...pages.map((page) => - "event" in page - ? SlidePageEntry({ slide: page, config }) - : PostPageEntry({ post: page, config }) - ), - ), - GlobalFooter({ config }), - ), - }); -} |
