diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts
index 1d0af6d7e..f24ae6dc1 100644
--- a/quartz/plugins/emitters/contentIndex.ts
+++ b/quartz/plugins/emitters/contentIndex.ts
@@ -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 => `
- https://${base}/${encodeURIComponent(slug)}
+ https://${base}/${encodeURI(slug)}
${content.date?.toISOString()}
`
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 => `-
- ${content.title}
- ${root}/${encodeURIComponent(slug)}
- ${root}/${encodeURIComponent(slug)}
+ ${escapeHTML(content.title)}
+ ${root}/${encodeURI(slug)}
+ ${root}/${encodeURI(slug)}
${content.description}
${content.date?.toUTCString()}
`
@@ -56,7 +57,7 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex): string {
return `
- ${cfg.pageTitle}
+ ${escapeHTML(cfg.pageTitle)}
${root}
Recent content on ${cfg.pageTitle}
Quartz -- quartz.jzhao.xyz
diff --git a/quartz/plugins/transformers/description.ts b/quartz/plugins/transformers/description.ts
index 08af5c788..884d5b189 100644
--- a/quartz/plugins/transformers/description.ts
+++ b/quartz/plugins/transformers/description.ts
@@ -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 | undefined> = (userOpts) => {
const opts = { ...defaultOptions, ...userOpts }
return {
diff --git a/quartz/util/escape.ts b/quartz/util/escape.ts
new file mode 100644
index 000000000..197558c7d
--- /dev/null
+++ b/quartz/util/escape.ts
@@ -0,0 +1,8 @@
+export const escapeHTML = (unsafe: string) => {
+ return unsafe
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """)
+ .replaceAll("'", "'")
+}