feat: extracts the rss excerpt utility to use it for og:description on post pages

This commit is contained in:
Lewis Wynne 2026-03-26 22:02:40 +00:00
parent 331d843f68
commit 0029274484
3 changed files with 16 additions and 14 deletions

View file

@ -7,6 +7,18 @@ export function escapeHtml(str: string): string {
.replace(/'/g, ''');
}
export function excerpt(markdown: string | undefined, maxLen = 160): string {
if (!markdown) return '';
return markdown
.replace(/^#+\s+.*$/gm, '')
.replace(/!?\[([^\]]*)\]\([^)]*\)/g, '$1')
.replace(/[*_~`]/g, '')
.replace(/:[a-z]+\[([^\]]*)\]/g, '$1')
.replace(/\n+/g, ' ')
.trim()
.slice(0, maxLen);
}
export function formatDate(date: Date): string {
const d = String(date.getDate()).padStart(2, '0');
const m = String(date.getMonth() + 1).padStart(2, '0');

View file

@ -1,7 +1,7 @@
---
import { getCollection, render } from 'astro:content';
import Layout from '../layouts/Layout.astro';
import { formatDate, formatListItem } from '../lib/format';
import { formatDate, formatListItem, excerpt } from '../lib/format';
import { getSlug, enrichPostWithDates, enrichPostsWithDates, resolveRelatedPosts } from '../lib/md';
export async function getStaticPaths() {
@ -16,8 +16,9 @@ export async function getStaticPaths() {
const { post, allPosts } = Astro.props;
const { Content } = await render(post);
const related = post.data.related ? resolveRelatedPosts(post.data.related, allPosts) : [];
const description = excerpt((post as any).body) || undefined;
---
<Layout title={`${post.data.title} - lewis m.w.`}>
<Layout title={`${post.data.title} - lewis m.w.`} description={description}>
<article>
<h1>{post.data.title}</h1>

View file

@ -3,18 +3,7 @@ import { getCollection } from 'astro:content';
import type { APIContext } from 'astro';
import { getSlug, enrichPostsWithDates } from '../lib/md';
import { getTxtFiles } from '../lib/txt';
function excerpt(markdown: string | undefined, maxLen = 160): string {
if (!markdown) return '';
return markdown
.replace(/^#+\s+.*$/gm, '')
.replace(/!?\[([^\]]*)\]\([^)]*\)/g, '$1')
.replace(/[*_~`]/g, '')
.replace(/:[a-z]+\[([^\]]*)\]/g, '$1')
.replace(/\n+/g, ' ')
.trim()
.slice(0, maxLen);
}
import { excerpt } from '../lib/format';
export async function GET(context: APIContext) {
const rawPosts = await getCollection('md');