diff --git a/quartz.config.ts b/quartz.config.ts
index 4e36e9408..04e4e305a 100644
--- a/quartz.config.ts
+++ b/quartz.config.ts
@@ -70,6 +70,7 @@ const config: QuartzConfig = {
Plugin.ContentIndex({
enableSiteMap: true,
enableRSS: true,
+ feedDirectories: ["index"], // For a feed for only pages in content/Folder/, add "Folder" to the array
}),
Plugin.Assets(),
Plugin.Static(),
diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts
index c0fef86d2..511871e2b 100644
--- a/quartz/plugins/emitters/contentIndex.ts
+++ b/quartz/plugins/emitters/contentIndex.ts
@@ -26,6 +26,7 @@ interface Options {
rssLimit?: number
rssFullHtml: boolean
includeEmptyFiles: boolean
+ feedDirectories: string[]
}
const defaultOptions: Options = {
@@ -34,6 +35,7 @@ const defaultOptions: Options = {
rssLimit: 10,
rssFullHtml: false,
includeEmptyFiles: true,
+ feedDirectories: ["index"],
}
function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string {
@@ -48,7 +50,10 @@ 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): string {
+ if (idx == undefined) {
+ return ""
+ }
const base = cfg.baseUrl ?? ""
const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => `-
@@ -116,30 +121,35 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => {
async emit(ctx, content, _resources) {
const cfg = ctx.cfg.configuration
const emitted: FilePath[] = []
- const linkIndex: ContentIndex = new Map()
- for (const [tree, file] of content) {
- const slug = file.data.slug!
- const date = getDate(ctx.cfg.configuration, file.data) ?? new Date()
- if (opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) {
- linkIndex.set(slug, {
- title: file.data.frontmatter?.title!,
- links: file.data.links ?? [],
- tags: file.data.frontmatter?.tags ?? [],
- content: file.data.text ?? "",
- richContent: opts?.rssFullHtml
- ? escapeHTML(toHtml(tree as Root, { allowDangerousHtml: true }))
- : undefined,
- date: date,
- description: file.data.description ?? "",
- })
+ const feedIndices: Map = new Map()
+ for (const feed of opts?.feedDirectories) {
+ const linkIndex: ContentIndex = new Map()
+ for (const [tree, file] of content) {
+ const slug = file.data.slug!
+
+ const date = getDate(ctx.cfg.configuration, file.data) ?? new Date()
+ if ((opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) && (slug.startsWith(feed) || feed == "index")) {
+ linkIndex.set(slug, {
+ title: file.data.frontmatter?.title!,
+ links: file.data.links ?? [],
+ tags: file.data.frontmatter?.tags ?? [],
+ content: file.data.text ?? "",
+ richContent: opts?.rssFullHtml
+ ? escapeHTML(toHtml(tree as Root, { allowDangerousHtml: true }))
+ : undefined,
+ date: date,
+ description: file.data.description ?? "",
+ })
+ }
}
+ feedIndices.set(feed, linkIndex)
}
if (opts?.enableSiteMap) {
emitted.push(
await write({
ctx,
- content: generateSiteMap(cfg, linkIndex),
+ content: generateSiteMap(cfg, feedIndices.get("index")),
slug: "sitemap" as FullSlug,
ext: ".xml",
}),
@@ -147,19 +157,20 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => {
}
if (opts?.enableRSS) {
- emitted.push(
- await write({
+ opts?.feedDirectories?.map(async (feed) => {
+ const emittedFeed = await write({
ctx,
- content: generateRSSFeed(cfg, linkIndex, opts.rssLimit),
- slug: "index" as FullSlug,
+ content: generateRSSFeed(cfg, feedIndices.get(feed), opts?.rssLimit),
+ slug: feed as FullSlug,
ext: ".xml",
- }),
- )
+ })
+ emitted.push(emittedFeed)
+ })
}
const fp = joinSegments("static", "contentIndex") as FullSlug
const simplifiedIndex = Object.fromEntries(
- Array.from(linkIndex).map(([slug, content]) => {
+ Array.from(feedIndices.get("index") ?? [] ).map(([slug, content]) => {
// remove description and from content index as nothing downstream
// actually uses it. we only keep it in the index as we need it
// for the RSS feed