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",
}),