From 74e6e66665e0398574376038887be75f043e7107 Mon Sep 17 00:00:00 2001
From: Bad Manners <me@badmanners.xyz>
Date: Sat, 2 Nov 2024 16:22:50 -0300
Subject: [PATCH] Fix copyrightedCharacters in feed

---
 package-lock.json |  4 ++--
 package.json      |  2 +-
 src/utils/feed.ts | 50 +++++++++++++++++++++++++----------------------
 3 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 502d965..e168a9c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "gallery.badmanners.xyz",
-  "version": "1.12.0",
+  "version": "1.12.1",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "gallery.badmanners.xyz",
-      "version": "1.12.0",
+      "version": "1.12.1",
       "hasInstallScript": true,
       "dependencies": {
         "@astrojs/alpinejs": "^0.4.0",
diff --git a/package.json b/package.json
index 0ce2a38..24d6bec 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "gallery.badmanners.xyz",
   "type": "module",
-  "version": "1.12.0",
+  "version": "1.12.1",
   "scripts": {
     "postinstall": "astro sync",
     "dev": "astro dev",
diff --git a/src/utils/feed.ts b/src/utils/feed.ts
index a04a7dc..8bc4de0 100644
--- a/src/utils/feed.ts
+++ b/src/utils/feed.ts
@@ -29,7 +29,7 @@ function toNoonUTCDate(date: Date) {
 const getLinkForUser = (user: CollectionEntry<"users">, lang: Lang) => {
   const userName = getUsernameForLang(user, lang);
   if (user.data.preferredLink) {
-    return `<a href="${user.data.links[user.data.preferredLink]!.link}">${userName}</a>`;
+    return `<a href="${encodeURI(user.data.links[user.data.preferredLink]!.link)}">${userName}</a>`;
   }
   return userName;
 };
@@ -80,17 +80,19 @@ export async function storyFeedItem(
           `<hr><h2>Description</h2>` +
           (await markdown(await qualifyLocalURLsInMarkdown(data.description, data.lang, site))) +
           (copyrightedCharacters.length > 0
-            ? `<br /><ul>${copyrightedCharacters.map(
-                ({ user, characters }) =>
-                  "<li>" +
-                  t(
-                    data.lang,
-                    "characters/characters_are_copyrighted_by",
-                    getLinkForUser(user, data.lang),
-                    characters,
-                  ) +
-                  "</li>",
-              )}</ul>`
+            ? `<br /><ul>${copyrightedCharacters
+                .map(
+                  ({ user, characters }) =>
+                    "<li>" +
+                    t(
+                      data.lang,
+                      "characters/characters_are_copyrighted_by",
+                      getLinkForUser(user, data.lang),
+                      characters,
+                    ) +
+                    "</li>",
+                )
+                .join("")}</ul>`
             : ""),
         site,
       ),
@@ -132,17 +134,19 @@ export async function gameFeedItem(
           `<hr><h2>Description</h2>` +
           (await markdown(await qualifyLocalURLsInMarkdown(data.description, data.lang, site))) +
           (copyrightedCharacters.length > 0
-            ? `<br /><ul>${copyrightedCharacters.map(
-                ({ user, characters }) =>
-                  "<li>" +
-                  t(
-                    data.lang,
-                    "characters/characters_are_copyrighted_by",
-                    getLinkForUser(user, data.lang),
-                    characters,
-                  ) +
-                  "</li>",
-              )}</ul>`
+            ? `<br /><ul>${copyrightedCharacters
+                .map(
+                  ({ user, characters }) =>
+                    "<li>" +
+                    t(
+                      data.lang,
+                      "characters/characters_are_copyrighted_by",
+                      getLinkForUser(user, data.lang),
+                      characters,
+                    ) +
+                    "</li>",
+                )
+                .join("")}</ul>`
             : ""),
         site,
       ),