Implement an RSS feed.
This commit is contained in:
parent
db0836a499
commit
c999e7feab
@ -7,11 +7,11 @@
|
|||||||
"@types/yaml-front-matter": "^4.1.3",
|
"@types/yaml-front-matter": "^4.1.3",
|
||||||
"feed": "^4.2.2",
|
"feed": "^4.2.2",
|
||||||
"highlight.js": "^11.10.0",
|
"highlight.js": "^11.10.0",
|
||||||
"hono": "^4.4.13",
|
"hono": "^4.6.13",
|
||||||
"marked": "^13.0.2",
|
"marked": "^13.0.3",
|
||||||
"marked-highlight": "^2.1.3",
|
"marked-highlight": "^2.2.1",
|
||||||
"remark": "^15.0.1",
|
"remark": "^15.0.1",
|
||||||
"smol-toml": "^1.3.0",
|
"smol-toml": "^1.3.1",
|
||||||
"yaml-front-matter": "^4.1.1"
|
"yaml-front-matter": "^4.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -1,25 +1,20 @@
|
|||||||
import { Hono, Context } from 'hono';
|
import { Hono, Context } from 'hono';
|
||||||
import { PostService } from '@blog/services/post-file';
|
import { PostService } from '@blog/services/post-file';
|
||||||
|
import { getFeed } from '@blog/services/feed-generator';
|
||||||
import { Feed } from 'feed';
|
import { Feed } from 'feed';
|
||||||
|
|
||||||
const feed = new Hono<{ Variables: { postService: PostService }}>();
|
const feed = new Hono<{ Variables: { postService: PostService }}>();
|
||||||
let feedBuffer: string = "";
|
let feedBuffer: string = "";
|
||||||
|
|
||||||
export async function getFeedFile(c: Context) {
|
export async function getFeedFile(c: Context) {
|
||||||
c.header('Content-Type', 'text/xml');
|
|
||||||
|
|
||||||
if (!feedBuffer) {
|
if (!feedBuffer) {
|
||||||
const postService: PostService = c.get('postService');
|
const postService: PostService = c.get('postService');
|
||||||
const posts = postService.getPublishedPosts();
|
const feed: Feed = await getFeed(postService);
|
||||||
|
feedBuffer = feed.rss2();
|
||||||
// get the site meta
|
|
||||||
|
|
||||||
// create the feed
|
|
||||||
// get the feed data
|
|
||||||
feedBuffer = "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
c.body(feedBuffer);
|
c.header('Content-Type', 'text/xml');
|
||||||
|
return c.body(feedBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
feed.get('/rss.xml', getFeedFile);
|
feed.get('/rss.xml', getFeedFile);
|
||||||
|
@ -4,6 +4,7 @@ import { serveStatic } from 'hono/bun';
|
|||||||
import { Page } from '@blog/templates/Page';
|
import { Page } from '@blog/templates/Page';
|
||||||
import home from '@blog/handlers/home';
|
import home from '@blog/handlers/home';
|
||||||
import posts from '@blog/handlers/posts';
|
import posts from '@blog/handlers/posts';
|
||||||
|
import feed from '@blog/handlers/feed';
|
||||||
import type { SiteMeta } from '@blog/models/SiteMeta';
|
import type { SiteMeta } from '@blog/models/SiteMeta';
|
||||||
import { postFileMiddleware } from '@blog/middleware/post-service';
|
import { postFileMiddleware } from '@blog/middleware/post-service';
|
||||||
import { logger } from 'hono/logger';
|
import { logger } from 'hono/logger';
|
||||||
@ -36,6 +37,7 @@ app.use('/static/*', serveStatic({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
app.route('/', home);
|
app.route('/', home);
|
||||||
|
app.route('/feed', feed)
|
||||||
app.route('/posts', posts);
|
app.route('/posts', posts);
|
||||||
|
|
||||||
console.log("Starting the blog");
|
console.log("Starting the blog");
|
||||||
|
@ -6,7 +6,7 @@ import type { Post } from '@blog/models/post';
|
|||||||
const updatedDate = new Date();
|
const updatedDate = new Date();
|
||||||
|
|
||||||
export async function getFeed(postService: PostService): Feed {
|
export async function getFeed(postService: PostService): Feed {
|
||||||
const config = getSiteConfig();
|
const config = await getSiteConfig();
|
||||||
const feed = new Feed({
|
const feed = new Feed({
|
||||||
title: config.title,
|
title: config.title,
|
||||||
description: config.site.description,
|
description: config.site.description,
|
||||||
@ -22,20 +22,20 @@ export async function getFeed(postService: PostService): Feed {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
postService.getAllPosts().map((post: Post) => {
|
postService.getPublishedPosts().map((post: Post) => {
|
||||||
feed.addItem({
|
feed.addItem({
|
||||||
title: post.meta.title,
|
title: post.meta.title,
|
||||||
id: post.meta.slug,
|
id: post.meta.slug,
|
||||||
link: post.meta.slug,
|
link: post.meta.slug,
|
||||||
description: post.meta.description,
|
description: post.meta.description,
|
||||||
content: post.html,
|
content: post.html,
|
||||||
author: [
|
author: {
|
||||||
name: config.author,
|
name: config.author,
|
||||||
email: config.email
|
email: config.email
|
||||||
]
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return feed;
|
return feed;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user