fix: escape encoding for titles in rss
This commit is contained in:
		| @@ -1,5 +1,6 @@ | ||||
| import { GlobalConfiguration } from "../../cfg" | ||||
| import { getDate } from "../../components/Date" | ||||
| import { escapeHTML } from "../../util/escape" | ||||
| import { FilePath, FullSlug, SimpleSlug, simplifySlug } from "../../util/path" | ||||
| import { QuartzEmitterPlugin } from "../types" | ||||
| import path from "path" | ||||
| @@ -29,7 +30,7 @@ const defaultOptions: Options = { | ||||
| function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string { | ||||
|   const base = cfg.baseUrl ?? "" | ||||
|   const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => `<url> | ||||
|     <loc>https://${base}/${encodeURIComponent(slug)}</loc> | ||||
|     <loc>https://${base}/${encodeURI(slug)}</loc> | ||||
|     <lastmod>${content.date?.toISOString()}</lastmod> | ||||
|   </url>` | ||||
|   const urls = Array.from(idx) | ||||
| @@ -43,9 +44,9 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex): string { | ||||
|   const root = `https://${base}` | ||||
|  | ||||
|   const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => `<item> | ||||
|     <title>${content.title}</title> | ||||
|     <link>${root}/${encodeURIComponent(slug)}</link> | ||||
|     <guid>${root}/${encodeURIComponent(slug)}</guid> | ||||
|     <title>${escapeHTML(content.title)}</title> | ||||
|     <link>${root}/${encodeURI(slug)}</link> | ||||
|     <guid>${root}/${encodeURI(slug)}</guid> | ||||
|     <description>${content.description}</description> | ||||
|     <pubDate>${content.date?.toUTCString()}</pubDate> | ||||
|   </item>` | ||||
| @@ -56,7 +57,7 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex): string { | ||||
|   return `<?xml version="1.0" encoding="UTF-8" ?> | ||||
| <rss version="2.0"> | ||||
|     <channel> | ||||
|       <title>${cfg.pageTitle}</title> | ||||
|       <title>${escapeHTML(cfg.pageTitle)}</title> | ||||
|       <link>${root}</link> | ||||
|       <description>Recent content on ${cfg.pageTitle}</description> | ||||
|       <generator>Quartz -- quartz.jzhao.xyz</generator> | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import { Root as HTMLRoot } from "hast" | ||||
| import { toString } from "hast-util-to-string" | ||||
| import { QuartzTransformerPlugin } from "../types" | ||||
| import { escapeHTML } from "../../util/escape" | ||||
|  | ||||
| export interface Options { | ||||
|   descriptionLength: number | ||||
| @@ -10,15 +11,6 @@ const defaultOptions: Options = { | ||||
|   descriptionLength: 150, | ||||
| } | ||||
|  | ||||
| const escapeHTML = (unsafe: string) => { | ||||
|   return unsafe | ||||
|     .replaceAll("&", "&") | ||||
|     .replaceAll("<", "<") | ||||
|     .replaceAll(">", ">") | ||||
|     .replaceAll('"', """) | ||||
|     .replaceAll("'", "'") | ||||
| } | ||||
|  | ||||
| export const Description: QuartzTransformerPlugin<Partial<Options> | undefined> = (userOpts) => { | ||||
|   const opts = { ...defaultOptions, ...userOpts } | ||||
|   return { | ||||
|   | ||||
							
								
								
									
										8
									
								
								quartz/util/escape.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								quartz/util/escape.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| export const escapeHTML = (unsafe: string) => { | ||||
|   return unsafe | ||||
|     .replaceAll("&", "&") | ||||
|     .replaceAll("<", "<") | ||||
|     .replaceAll(">", ">") | ||||
|     .replaceAll('"', """) | ||||
|     .replaceAll("'", "'") | ||||
| } | ||||
		Reference in New Issue
	
	Block a user