オプションで出力対象パスを指定できるように修正(2023-11-09) quartz.config.tsでrssPathに’blog’を指定し、通常のノートはRSS出力しないように Quartz v4.1.0のRSSフィードが古いコンテンツ順に出力されてしまうので、新しい順に出力するように修正 以下は現時点(2023-11-09)の本家最新版(ab5efac75fb0f20afe74bef33a2cf7e9ba0ba40f)との差分。 diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts index 69d0d37..5acb246 100644 --- a/quartz/plugins/emitters/contentIndex.ts +++ b/quartz/plugins/emitters/contentIndex.ts @@ -22,6 +22,7 @@ interface Options { enableSiteMap: boolean enableRSS: boolean rssLimit?: number + rssPath?: string rssFullHtml: boolean includeEmptyFiles: boolean } @@ -30,6 +31,7 @@ const defaultOptions: Options = { enableSiteMap: true, enableRSS: true, rssLimit: 10, + rssPath: undefined, rssFullHtml: false, includeEmptyFiles: true, } @@ -46,7 +48,7 @@ function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string { return `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">${urls}</urlset>` } -function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: number): string { +function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: number, rssPath?: string): string { const base = cfg.baseUrl ?? "" const root = `https://${base}` @@ -58,7 +60,14 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: nu <pubDate>${content.date?.toUTCString()}</pubDate> </item>` - const items = Array.from(idx) + const sortedEntries = Array.from(idx) + .sort(([, contentA], [, contentB]) => { + if (!contentA.date || !contentB.date) return 0; + return contentB.date.getTime() - contentA.date.getTime(); + }); + + const items = sortedEntries + .filter(([slug]) => !rssPath || slug.includes(rssPath + '/')) .map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) .slice(0, limit ?? idx.size) .join("") @@ -116,7 +125,7 @@ export const ContentIndex: QuartzEmitterPlugin<Partial<Options>> = (opts) => { if (opts?.enableRSS) { emitted.push( await emit({ - content: generateRSSFeed(cfg, linkIndex, opts.rssLimit), + content: generateRSSFeed(cfg, linkIndex, opts.rssLimit, opts.rssPath), slug: "index" as FullSlug, ext: ".xml", }),