From d119c1ef91dba9171aa911d8a1f263ece060e7da Mon Sep 17 00:00:00 2001 From: Yash-Garg Date: Sun, 25 Aug 2024 12:59:25 +0530 Subject: [PATCH] feat: add `filterFn` for rss feed --- quartz.config.ts | 6 ++++++ quartz/plugins/emitters/contentIndex.ts | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/quartz.config.ts b/quartz.config.ts index fcf67a0a..01538e54 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -84,6 +84,12 @@ const config: QuartzConfig = { Plugin.ContentIndex({ enableSiteMap: true, enableRSS: true, + filterFn(slug, content) { + if (!content.date) return false; + if (!slug.includes("posts/")) return false; + return true; + }, }), Plugin.Assets(), Plugin.Static(), diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts index c0fef86d..258e5ec5 100644 --- a/quartz/plugins/emitters/contentIndex.ts +++ b/quartz/plugins/emitters/contentIndex.ts @@ -23,6 +23,7 @@ export type ContentDetails = { interface Options { enableSiteMap: boolean enableRSS: boolean + filterFn?: (slug: SimpleSlug, content: ContentDetails) => boolean rssLimit?: number rssFullHtml: boolean includeEmptyFiles: boolean @@ -31,6 +32,7 @@ interface Options { const defaultOptions: Options = { enableSiteMap: true, enableRSS: true, + filterFn: undefined, rssLimit: 10, rssFullHtml: false, includeEmptyFiles: true, @@ -48,7 +50,12 @@ function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string { return `${urls}` } -function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: number): string { +function generateRSSFeed( + cfg: GlobalConfiguration, + idx: ContentIndex, + limit?: number, + filterFn?: (slug: SimpleSlug, content: ContentDetails) => boolean +): string { const base = cfg.baseUrl ?? "" const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => ` @@ -60,6 +67,7 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: nu ` const items = Array.from(idx) + .filter(([slug, content]) => !filterFn || filterFn(simplifySlug(slug), content)) .sort(([_, f1], [__, f2]) => { if (f1.date && f2.date) { return f2.date.getTime() - f1.date.getTime() @@ -71,6 +79,8 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: nu return f1.title.localeCompare(f2.title) }) + + const posts = items .map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) .slice(0, limit ?? idx.size) .join("") @@ -80,11 +90,11 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: nu ${escapeHTML(cfg.pageTitle)} https://${base} - ${!!limit ? i18n(cfg.locale).pages.rss.lastFewNotes({ count: limit }) : i18n(cfg.locale).pages.rss.recentNotes} on ${escapeHTML( + ${!!limit ? i18n(cfg.locale).pages.rss.lastFewNotes({ count: items.length }) : i18n(cfg.locale).pages.rss.recentNotes} on ${escapeHTML( cfg.pageTitle, )} Quartz -- quartz.jzhao.xyz - ${items} + ${posts} ` } @@ -150,7 +160,7 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => { emitted.push( await write({ ctx, - content: generateRSSFeed(cfg, linkIndex, opts.rssLimit), + content: generateRSSFeed(cfg, linkIndex, opts.rssLimit, opts.filterFn), slug: "index" as FullSlug, ext: ".xml", }),