{title}
@@ -360,8 +361,8 @@ blog.sort((a, b) => b.data.pubDate!.valueOf() - a.data.pubDate!.valueOf());
flex: 1;
background-attachment: local;
background-image: linear-gradient(to right, var(--bg-0) 5px, transparent 2px), linear-gradient(var(--bg-4) 2px, transparent 2px);
- background-size: 10px 1lh;
- background-position-y: calc(2lh - 2px);
+ background-size: 10px 2em;
+ background-position-y: calc(2em - 2px);
margin: 2rem 1rem;
padding: 0 1rem;
line-height: 2;
@@ -369,7 +370,13 @@ blog.sort((a, b) => b.data.pubDate!.valueOf() - a.data.pubDate!.valueOf());
overflow-y: auto;
margin-trim: block;
- p { margin-block: 1lh; }
+ p {
+ margin-block: 2em;
+
+ &:has(> img) {
+ margin-block: 0;
+ }
+ }
a, del, s { text-decoration-thickness: 2px; }
a {
color: var(--normal-color);
@@ -384,10 +391,34 @@ blog.sort((a, b) => b.data.pubDate!.valueOf() - a.data.pubDate!.valueOf());
color: var(--normal-color);
}
}
+
+ figure {
+ border: 2px solid var(--border-5);
+ border-image: var(--innerBorder) 3 2 2 fill / 6px 4px 4px;
+ padding: 4px 2px 2px;
+ background-color: var(--bg-0);
+ width: max-content;
+ margin: 0 auto;
+
+ img {
+ min-height: 2em;
+ border-bottom: 2px solid var(--border-3);
+ }
+
+ figcaption {
+ font-family: var(--dotum-11-font);
+ font-size: calc(1em + 2px);
+ color: var(--border-1);
+ background-color: var(--bg-3);
+ margin: 4px;
+ padding: 0 6px;
+ text-align: center;
+ }
+ }
@supports not (margin-trim: block) {
- :first-child { margin-block-start: 0; }
- :last-child { margin-block-end: 0; }
+ p:first-child { margin-block-start: 0; }
+ p:last-child { margin-block-end: 0; }
}
@media screen and (max-width: 950px) {
diff --git a/src/pages/blog/[...id].astro b/src/pages/blog/[...id].astro
index 16d4765..096659d 100644
--- a/src/pages/blog/[...id].astro
+++ b/src/pages/blog/[...id].astro
@@ -21,7 +21,7 @@ const current = blog.findIndex(entry => entry.id === Astro.params.id);
const previous = current + 1 === blog.length ? undefined : blog[current + 1];
const next = current === 0 ? undefined : blog[current - 1];
---
-
+
diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro
index 29dbe75..46b86ac 100644
--- a/src/pages/blog/index.astro
+++ b/src/pages/blog/index.astro
@@ -1,5 +1,6 @@
---
import Layout from "@/layouts/Layout.astro";
+import Figure from "~/Figure.astro";
import formatDate from "@/utils/formatDate";
import { getCollection } from "astro:content";
import dayjs from "dayjs";
diff --git a/src/pages/fics/[ficId]/rss.xml.ts b/src/pages/fics/[ficId]/rss.xml.ts
index b97f635..73ea430 100644
--- a/src/pages/fics/[ficId]/rss.xml.ts
+++ b/src/pages/fics/[ficId]/rss.xml.ts
@@ -30,7 +30,7 @@ export const GET: APIRoute = async (context) => {
content: sanitize(html.toString(), {
allowedTags: sanitize.defaults.allowedTags.concat(["img"]),
}),
- categories: fic?.data.series.concat(fic.data.title),
+ categories: typeof fic?.data.series == "string" ? [fic?.data.series] : [...fic?.data.series!],
});
}
diff --git a/src/pages/guestbook/config.php b/src/pages/guestbook/config.php
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pages/guestbook/data.php b/src/pages/guestbook/data.php
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pages/guestbook/index.astro b/src/pages/guestbook/index.astro
index 69beb8a..8d60898 100644
--- a/src/pages/guestbook/index.astro
+++ b/src/pages/guestbook/index.astro
@@ -4,7 +4,6 @@ import { Font } from "astro:assets";
import speech from "$/speech.png";
import formatDate from "@/utils/formatDate";
import Entries from "~/Entries.svelte";
-import svelteRenderer from "@astrojs/svelte/server.js";
type Entry = {
id: string;
diff --git a/src/utils/loader.ts b/src/utils/loader.ts
index 9d3af35..2f4fda0 100644
--- a/src/utils/loader.ts
+++ b/src/utils/loader.ts
@@ -1,33 +1,51 @@
-import { glob, type Loader, type LoaderContext } from "astro/loaders";
-import { readdirSync, readFileSync } from "fs";
+import { glob as astroGlob, type Loader, type LoaderContext } from "astro/loaders";
import path from "path";
+import { glob } from "fs/promises";
-export function ficsLoader(options: { path: string }) {
-
- return {
- name: "fics",
- async load(context: LoaderContext) {
- const fics = readdirSync(options.path, { withFileTypes: true })
- .filter(dirent => dirent.isDirectory())
- .map(dirent => dirent.name);
-
- for (const fic of fics) {
- const chapters = readdirSync(path.join(options.path, `/${fic}`), { withFileTypes: true });
- const isOneshot = chapters.filter(chapter => chapter.isFile() && chapter.name.endsWith(".md"));
- if (isOneshot.length === 1) {
- const data = {
- id: fic,
- data: chapters,
- };
- const digest = context.generateDigest(data);
- } else {
- const data = {
- id: chapters
- }
- }
- }
- },
- }
+async function getAllChapters(metaPath: string) {
+ const entryPath = path.parse(metaPath);
+ const fic = entryPath.dir;
+ const entries = await Array.fromAsync(glob(fic + '/*.md'));
+ const chapters = entries.map(chapter => path.relative(fic, chapter));
+ return chapters.map(chapter => ({
+ relativePath: chapter,
+ chapter: path.resolve(fic, chapter),
+ }));
}
-ficsLoader({ path: "./src/content/fics" });
+export function ficsLoader(loader: Loader) {
+ const oldLoad = loader.load;
+ loader.load = async (context: LoaderContext) => {
+ await oldLoad({
+ ...context,
+ parseData: async (data) => data.data,
+ });
+ await Promise.all(
+ context.store.values().map(async (value) => {
+ const loadedPromise = Promise.withResolvers();
+ getAllChapters(value.filePath as string).then(
+ async (chapters) => {
+ const { digest, ...valueWithoutDigest } = value;
+ const newData = await context.parseData({
+ id: value.id,
+ data: {
+ ...valueWithoutDigest.data,
+ ...chapters.length > 1 && { chapters: chapters },
+ },
+ });
+ context.store.set({
+ ...valueWithoutDigest,
+ data: newData,
+ digest: context.generateDigest(newData),
+ });
+ loadedPromise.resolve(chapters);
+ }
+ );
+
+ return loadedPromise.promise;
+ })
+ );
+ };
+
+ return loader;
+}
\ No newline at end of file