aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/blog
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2026-01-14 04:36:14 +0100
committerLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2026-01-14 04:36:14 +0100
commit481c06cdb6bfb370ba2d84f4b6bb4ba260eb14cd (patch)
treeb022a161677183e9a08e2183c1a254a553907927 /src/routes/blog
parent347824c75406238a6e9d50b4833a60c2c43140a7 (diff)
downloadmem-estrogen-zone-481c06cdb6bfb370ba2d84f4b6bb4ba260eb14cd.tar.gz
mem-estrogen-zone-481c06cdb6bfb370ba2d84f4b6bb4ba260eb14cd.tar.bz2
mem-estrogen-zone-481c06cdb6bfb370ba2d84f4b6bb4ba260eb14cd.tar.lz
mem-estrogen-zone-481c06cdb6bfb370ba2d84f4b6bb4ba260eb14cd.zip

feat: start work on blog

Diffstat (limited to 'src/routes/blog')
-rw-r--r--src/routes/blog/+page.server.ts13
-rw-r--r--src/routes/blog/+page.svelte13
-rw-r--r--src/routes/blog/[id=int]-[slug]/+page.server.ts2
-rw-r--r--src/routes/blog/[id=int]-[slug]/+page.svelte8
-rw-r--r--src/routes/blog/[id=int]-[slug]/+page.ts2
-rw-r--r--src/routes/blog/[id=int]/+page.server.ts12
-rw-r--r--src/routes/blog/[id=int]/+page.svelte28
-rw-r--r--src/routes/blog/[id=int]/+page.ts11
-rw-r--r--src/routes/blog/base-post.svx15
-rw-r--r--src/routes/blog/dynamic-posts.ts4
-rw-r--r--src/routes/blog/posts.ts6
-rw-r--r--src/routes/blog/posts/test-post.svx27
12 files changed, 141 insertions, 0 deletions
diff --git a/src/routes/blog/+page.server.ts b/src/routes/blog/+page.server.ts
new file mode 100644
index 0000000..7c4726e
--- /dev/null
+++ b/src/routes/blog/+page.server.ts
@@ -0,0 +1,13 @@
+import { parsePost, type Post } from '$/lib/blog/Post.svelte'
+
+const posts = import.meta.glob("./posts/*.svx") as Record<string, () => Promise<Post>>
+const returnedData = Promise.all(Object.entries(posts).map(v => v[1]().then(r => [v[0], {
+ ...parsePost(r as Post),
+ default: null,
+}] as const)));
+
+export const load = async () => {
+ return {
+ posts: Object.fromEntries(await returnedData)
+ }
+}
diff --git a/src/routes/blog/+page.svelte b/src/routes/blog/+page.svelte
new file mode 100644
index 0000000..a817d44
--- /dev/null
+++ b/src/routes/blog/+page.svelte
@@ -0,0 +1,13 @@
+<script lang="ts">
+ import type { PageProps } from './$types';
+
+ let { data }: PageProps = $props();
+</script>
+
+<div class="font-mono">
+ {#each Object.entries(data.posts) as [_filename, post]}
+ {JSON.stringify(post.metadata, (k, v) =>
+ v instanceof Date ? v.toISOString() : v,
+ )}
+ {/each}
+</div>
diff --git a/src/routes/blog/[id=int]-[slug]/+page.server.ts b/src/routes/blog/[id=int]-[slug]/+page.server.ts
new file mode 100644
index 0000000..be8b7c0
--- /dev/null
+++ b/src/routes/blog/[id=int]-[slug]/+page.server.ts
@@ -0,0 +1,2 @@
+import { load as pageload } from '../[id=int]/+page.server';
+export const load = pageload;
diff --git a/src/routes/blog/[id=int]-[slug]/+page.svelte b/src/routes/blog/[id=int]-[slug]/+page.svelte
new file mode 100644
index 0000000..088ae00
--- /dev/null
+++ b/src/routes/blog/[id=int]-[slug]/+page.svelte
@@ -0,0 +1,8 @@
+<script lang="ts">
+ import type { PageProps } from './$types';
+ import Page from '../[id=int]/+page.svelte';
+
+ let props: PageProps = $props();
+</script>
+
+<Page {...props} />
diff --git a/src/routes/blog/[id=int]-[slug]/+page.ts b/src/routes/blog/[id=int]-[slug]/+page.ts
new file mode 100644
index 0000000..1b54560
--- /dev/null
+++ b/src/routes/blog/[id=int]-[slug]/+page.ts
@@ -0,0 +1,2 @@
+import { load as pageload } from '../[id=int]/+page';
+export const load = pageload;
diff --git a/src/routes/blog/[id=int]/+page.server.ts b/src/routes/blog/[id=int]/+page.server.ts
new file mode 100644
index 0000000..e295257
--- /dev/null
+++ b/src/routes/blog/[id=int]/+page.server.ts
@@ -0,0 +1,12 @@
+import { parsePost } from '$/lib/blog/Post.svelte'
+import rawPosts from '../posts.js';
+
+const posts = Promise.all(Object.entries(rawPosts).map(async post => [post[0], parsePost(await post[1])] as const));
+const postMap = posts.then(posts => posts.map(post => [post[1].metadata.id.toString(), {
+ metadata: post[1].metadata,
+ filename: post[0],
+}])).then(v => new Map(v));
+
+export const load = async (req) => ({
+ post: (await postMap).get(req.params.id),
+});
diff --git a/src/routes/blog/[id=int]/+page.svelte b/src/routes/blog/[id=int]/+page.svelte
new file mode 100644
index 0000000..16fc586
--- /dev/null
+++ b/src/routes/blog/[id=int]/+page.svelte
@@ -0,0 +1,28 @@
+<script lang="ts">
+ import { replaceState } from '$app/navigation';
+ import { onMount, tick } from 'svelte';
+
+ import type { PageProps } from './$types';
+ import { resolve } from '$app/paths';
+ import { page } from '$app/state';
+ import { forceTrailingSlash } from '$/lib';
+ import Post from '$/lib/blog/Post.svelte';
+
+ let { data }: PageProps = $props();
+
+ onMount(() => {
+ tick().then(() =>
+ replaceState(
+ forceTrailingSlash(
+ resolve('/blog/[id=int]-[slug]', {
+ id: data.post.metadata.id.toString(),
+ slug: data.post.metadata.slug,
+ }),
+ ),
+ page.state,
+ ),
+ );
+ });
+</script>
+
+<Post post={data.post} />
diff --git a/src/routes/blog/[id=int]/+page.ts b/src/routes/blog/[id=int]/+page.ts
new file mode 100644
index 0000000..077d72c
--- /dev/null
+++ b/src/routes/blog/[id=int]/+page.ts
@@ -0,0 +1,11 @@
+import { error } from '@sveltejs/kit';
+import posts from '../dynamic-posts.js';
+
+export const load = async ({ data }) => {
+ const filename = data.post?.filename;
+ if (!filename) throw error(404, 'Post not found.')
+ const post = (await posts[filename]());
+ return {
+ post,
+ }
+}
diff --git a/src/routes/blog/base-post.svx b/src/routes/blog/base-post.svx
new file mode 100644
index 0000000..394eaa2
--- /dev/null
+++ b/src/routes/blog/base-post.svx
@@ -0,0 +1,15 @@
+---
+title: "Base Post"
+blurb: "Awawawa Ipsum dolor the neobot is in the washing machine"
+author: "7222e800"
+slug: "base-post"
+id: -1
+
+# Timestamps are in ISO8601 UTC (`date -u +%Y-%m-%dT%H:%M:%SZ`)
+created: "2026-01-14T01:25:14Z"
+updated: "2026-01-14T01:25:14Z"
+---
+
+# Base Post
+
+This is an example base post.
diff --git a/src/routes/blog/dynamic-posts.ts b/src/routes/blog/dynamic-posts.ts
new file mode 100644
index 0000000..93ecfec
--- /dev/null
+++ b/src/routes/blog/dynamic-posts.ts
@@ -0,0 +1,4 @@
+import type { Post } from '$/lib/blog/Post.svelte';
+
+export const posts = import.meta.glob("./posts/*.svx") as Record<string, () => Promise<Post>>
+export default posts
diff --git a/src/routes/blog/posts.ts b/src/routes/blog/posts.ts
new file mode 100644
index 0000000..5336bb0
--- /dev/null
+++ b/src/routes/blog/posts.ts
@@ -0,0 +1,6 @@
+import type { Post } from '$/lib/blog/Post.svelte';
+
+export const posts = import.meta.glob("./posts/*.svx", {
+ eager: true
+}) as Record<string, Promise<Post>>
+export default posts
diff --git a/src/routes/blog/posts/test-post.svx b/src/routes/blog/posts/test-post.svx
new file mode 100644
index 0000000..418c6e0
--- /dev/null
+++ b/src/routes/blog/posts/test-post.svx
@@ -0,0 +1,27 @@
+---
+title: "Test Post"
+blurb: "Awawawa Ipsum dolor the neobot is in the washing machine"
+author: "7222e800"
+slug: "test-post"
+id: 0
+
+# Timestamps are in ISO8601 UTC (`date -u +%Y-%m-%dT%H:%M:%SZ`)
+created: "2026-01-14T01:25:14Z"
+updated: "2026-01-14T01:25:14Z"
+---
+
+# h1
+
+## h2
+
+This is an example test post.
+
+## h2
+
+content
+
+### h3
+
+#### h4
+
+456