From 828aa71fe34aae675a7552957e8a062c82f595f6 Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Thu, 07 Sep 2023 04:47:59 +0000
Subject: [PATCH] fix: escape encoding for titles in rss
---
quartz/plugins/transformers/description.ts | 10 +---------
quartz/plugins/emitters/contentIndex.ts | 11 ++++++-----
quartz/util/escape.ts | 8 ++++++++
3 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts
index 1d0af6d..f24ae6d 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 @@
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 @@
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 @@
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>
diff --git a/quartz/plugins/transformers/description.ts b/quartz/plugins/transformers/description.ts
index 08af5c7..884d5b1 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 @@
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 {
diff --git a/quartz/util/escape.ts b/quartz/util/escape.ts
new file mode 100644
index 0000000..197558c
--- /dev/null
+++ b/quartz/util/escape.ts
@@ -0,0 +1,8 @@
+export const escapeHTML = (unsafe: string) => {
+ return unsafe
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """)
+ .replaceAll("'", "'")
+}
--
Gitblit v1.10.0