Jacky Zhao
2023-09-07 828aa71fe34aae675a7552957e8a062c82f595f6
fix: escape encoding for titles in rss
1 files added
2 files modified
29 ■■■■ changed files
quartz/plugins/emitters/contentIndex.ts 11 ●●●● patch | view | raw | blame | history
quartz/plugins/transformers/description.ts 10 ●●●● patch | view | raw | blame | history
quartz/util/escape.ts 8 ●●●●● patch | view | raw | blame | history
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>
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("&", "&amp;")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")
    .replaceAll('"', "&quot;")
    .replaceAll("'", "&#039;")
}
export const Description: QuartzTransformerPlugin<Partial<Options> | undefined> = (userOpts) => {
  const opts = { ...defaultOptions, ...userOpts }
  return {
quartz/util/escape.ts
New file
@@ -0,0 +1,8 @@
export const escapeHTML = (unsafe: string) => {
  return unsafe
    .replaceAll("&", "&amp;")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")
    .replaceAll('"', "&quot;")
    .replaceAll("'", "&#039;")
}