Update the models and and add a post reader module full of helper functions
This commit is contained in:
parent
79a0bf0f18
commit
a70e461a94
@ -1,11 +1,12 @@
|
|||||||
import { Hono } from 'hono';
|
import { Hono } from 'hono';
|
||||||
import { jsxRenderer, useRequestContext } from 'hono/jsx-renderer';
|
import { jsxRenderer, useRequestContext } from 'hono/jsx-renderer';
|
||||||
import { Page } from '@blog/templates/Page';
|
import { Page } from '@blog/templates/Page';
|
||||||
import { renderHomePage } from '@blog/routes/home';
|
import home from '@blog/routes/home';
|
||||||
import { renderPostPage } from '@blog/routes/post';
|
import posts from '@blog/routes/post';
|
||||||
|
|
||||||
const app = new Hono();
|
const app = new Hono();
|
||||||
|
|
||||||
|
// Render the JSX views
|
||||||
app.get(
|
app.get(
|
||||||
'*',
|
'*',
|
||||||
jsxRenderer(
|
jsxRenderer(
|
||||||
@ -21,12 +22,7 @@ app.get(
|
|||||||
// read all posts
|
// read all posts
|
||||||
// create listing of posts
|
// create listing of posts
|
||||||
|
|
||||||
app.get('/', async (c) => {
|
app.route('/', home);
|
||||||
return renderHomePage(c);
|
app.route('/posts', posts);
|
||||||
});
|
|
||||||
|
|
||||||
app.get('/posts/:slug', async (c) => {
|
|
||||||
return renderPostPage(c);
|
|
||||||
});
|
|
||||||
|
|
||||||
export default app;
|
export default app;
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
|
import { PostMeta } from '@blog/model/PostMeta';
|
||||||
|
|
||||||
export type Post = {
|
export type Post = {
|
||||||
title: string,
|
meta: PostMeta,
|
||||||
slug: string,
|
|
||||||
description?: string,
|
|
||||||
content: string,
|
content: string,
|
||||||
html?: string,
|
html?: string
|
||||||
date: Date,
|
|
||||||
tags?: string[]
|
|
||||||
};
|
};
|
||||||
|
9
src/model/PostMeta.ts
Normal file
9
src/model/PostMeta.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export type PostMeta = {
|
||||||
|
title: string,
|
||||||
|
slug?: string,
|
||||||
|
description?: string,
|
||||||
|
html?: string,
|
||||||
|
date: Date,
|
||||||
|
tags?: string[],
|
||||||
|
draft?: boolean
|
||||||
|
};
|
42
src/util/post-reader.ts
Normal file
42
src/util/post-reader.ts
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import { marked } from 'marked';
|
||||||
|
import type { Post } from '@blog/model/Post';
|
||||||
|
import type { PostMeta } from '@blog/model/PostMeta';
|
||||||
|
import * as yamlFront from 'yaml-front-matter';
|
||||||
|
|
||||||
|
export async function openPostMarkdownFile(filename: string): Promise<string> {
|
||||||
|
const file = Bun.file(filename);
|
||||||
|
return file.text();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function parsePostMetadata(post: string): PostMeta {
|
||||||
|
const parsedData = yamlFront.loadFront(post);
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: parsedData.title,
|
||||||
|
description: parsedData.description,
|
||||||
|
date: new Date(parsedData.date),
|
||||||
|
draft: parsedData?.draft || false,
|
||||||
|
tags: parsedData.tags
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function readPostMarkdown(filename: string): Promise<Post> {
|
||||||
|
const file = Bun.file(filename);
|
||||||
|
const contents = await file.text();
|
||||||
|
|
||||||
|
const parsedData = yamlFront.loadFront(contents);
|
||||||
|
const parsedPost = await marked.parse(parsedData.__content);
|
||||||
|
|
||||||
|
return {
|
||||||
|
meta: {
|
||||||
|
title: parsedData.title,
|
||||||
|
slug: filename.slice(0, -3),
|
||||||
|
description: parsedData.description,
|
||||||
|
date: new Date(parsedData.date),
|
||||||
|
tags: parsedData.tags,
|
||||||
|
},
|
||||||
|
content: parsedData.__content,
|
||||||
|
html: parsedPost
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
import { marked } from 'marked';
|
|
||||||
import type { Post } from '@blog/Model/Post';
|
|
||||||
import * as yamlFront from 'yaml-front-matter';
|
|
||||||
|
|
||||||
export async function readPostMarkdown(filename: string): Promise<Post> {
|
|
||||||
const file = Bun.file(filename);
|
|
||||||
const contents = await file.text();
|
|
||||||
|
|
||||||
const parsedData = yamlFront.loadFront(contents);
|
|
||||||
const parsedPost = await marked.parse(parsedData.__content);
|
|
||||||
|
|
||||||
return {
|
|
||||||
title: parsedData.title,
|
|
||||||
slug: filename.slice(0, -3),
|
|
||||||
description: parsedData.description,
|
|
||||||
date: new Date(parsedData.date),
|
|
||||||
tags: parsedData.tags,
|
|
||||||
content: parsedData.__content,
|
|
||||||
html: parsedPost
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user