From 0dd3b7e0bf00d5a9eb80c93cba1efcada59ec3c1 Mon Sep 17 00:00:00 2001
From: Yassine Doghri <yassine@doghri.fr>
Date: Thu, 29 Jul 2021 10:46:51 +0000
Subject: [PATCH] fix(rss): do not escape podcast and episode titles in the xml

- add parameter to prevent escaping value in SimpleRSSElement's addChild method
- clean prosemirror residue (typedef + DEPENDENCIES.md)
- remove type definition generation in tsconfig

fixes #138, #71
---
 DEPENDENCIES.md                               |  2 --
 app/Helpers/form_helper.php                   |  3 ++-
 app/Helpers/rss_helper.php                    |  6 ++---
 app/Libraries/SimpleRSSElement.php            | 26 +++++++++++++++----
 app/Resources/js/typings.d.ts                 |  2 --
 app/Resources/types/js/admin.d.ts             |  3 ---
 app/Resources/types/js/charts.d.ts            |  1 -
 app/Resources/types/js/install.d.ts           |  1 -
 app/Resources/types/js/map.d.ts               |  1 -
 app/Resources/types/js/modules/Charts.d.ts    |  2 --
 .../types/js/modules/ClientTimezone.d.ts      |  2 --
 app/Resources/types/js/modules/Clipboard.d.ts |  2 --
 .../types/js/modules/DateTimePicker.d.ts      |  3 ---
 app/Resources/types/js/modules/Dropdown.d.ts  |  2 --
 .../types/js/modules/EpisodesMap.d.ts         |  5 ----
 app/Resources/types/js/modules/Map.d.ts       |  2 --
 app/Resources/types/js/modules/Modal.d.ts     |  2 --
 .../types/js/modules/MultiSelect.d.ts         |  2 --
 .../js/modules/PublishMessageWarning.d.ts     |  2 --
 app/Resources/types/js/modules/Select.d.ts    |  2 --
 .../types/js/modules/SidebarToggler.d.ts      |  2 --
 app/Resources/types/js/modules/Slugify.d.ts   |  2 --
 .../types/js/modules/Soundbites.d.ts          |  2 --
 .../types/js/modules/ThemePicker.d.ts         |  2 --
 app/Resources/types/js/modules/Time.d.ts      |  2 --
 app/Resources/types/js/modules/Toggler.d.ts   |  2 --
 app/Resources/types/js/modules/Tooltip.d.ts   |  2 --
 .../types/js/modules/markdown-preview.d.ts    | 13 ----------
 .../js/modules/markdown-write-preview.d.ts    | 13 ----------
 app/Resources/types/js/podcast.d.ts           |  1 -
 tsconfig.json                                 | 11 ++------
 31 files changed, 28 insertions(+), 95 deletions(-)
 delete mode 100644 app/Resources/types/js/admin.d.ts
 delete mode 100644 app/Resources/types/js/charts.d.ts
 delete mode 100644 app/Resources/types/js/install.d.ts
 delete mode 100644 app/Resources/types/js/map.d.ts
 delete mode 100644 app/Resources/types/js/modules/Charts.d.ts
 delete mode 100644 app/Resources/types/js/modules/ClientTimezone.d.ts
 delete mode 100644 app/Resources/types/js/modules/Clipboard.d.ts
 delete mode 100644 app/Resources/types/js/modules/DateTimePicker.d.ts
 delete mode 100644 app/Resources/types/js/modules/Dropdown.d.ts
 delete mode 100644 app/Resources/types/js/modules/EpisodesMap.d.ts
 delete mode 100644 app/Resources/types/js/modules/Map.d.ts
 delete mode 100644 app/Resources/types/js/modules/Modal.d.ts
 delete mode 100644 app/Resources/types/js/modules/MultiSelect.d.ts
 delete mode 100644 app/Resources/types/js/modules/PublishMessageWarning.d.ts
 delete mode 100644 app/Resources/types/js/modules/Select.d.ts
 delete mode 100644 app/Resources/types/js/modules/SidebarToggler.d.ts
 delete mode 100644 app/Resources/types/js/modules/Slugify.d.ts
 delete mode 100644 app/Resources/types/js/modules/Soundbites.d.ts
 delete mode 100644 app/Resources/types/js/modules/ThemePicker.d.ts
 delete mode 100644 app/Resources/types/js/modules/Time.d.ts
 delete mode 100644 app/Resources/types/js/modules/Toggler.d.ts
 delete mode 100644 app/Resources/types/js/modules/Tooltip.d.ts
 delete mode 100644 app/Resources/types/js/modules/markdown-preview.d.ts
 delete mode 100644 app/Resources/types/js/modules/markdown-write-preview.d.ts
 delete mode 100644 app/Resources/types/js/podcast.d.ts

diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index 93371ef5fb..7819536eaf 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -39,8 +39,6 @@ Javascript dependencies:
   ([MIT License](https://github.com/rollup/rollup/blob/master/LICENSE.md))
 - [tailwindcss](https://tailwindcss.com/)
   ([MIT License](https://github.com/tailwindcss/tailwindcss/blob/master/LICENSE))
-- [ProseMirror](https://prosemirror.net/)
-  ([MIT License](https://github.com/ProseMirror/prosemirror/blob/master/LICENSE))
 - [amCharts 4](https://github.com/amcharts/amcharts4)
   ([Free amCharts license](https://github.com/amcharts/amcharts4/blob/master/dist/script/LICENSE))
 - [Choices.js](https://joshuajohnson.co.uk/Choices/)
diff --git a/app/Helpers/form_helper.php b/app/Helpers/form_helper.php
index e80bfd40fc..49eb580269 100644
--- a/app/Helpers/form_helper.php
+++ b/app/Helpers/form_helper.php
@@ -226,7 +226,8 @@ if (! function_exists('form_dropdown')) {
                 }
                 $form .= "</optgroup>\n";
             } else {
-                $form .= '<option value="' . htmlspecialchars($key) . '"'
+                /** @noRector RecastingRemovalRector */
+                $form .= '<option value="' . htmlspecialchars((string) $key) . '"'
                         . (in_array($key, $selected, true) ? ' selected="selected"' : '') . '>'
                         . $val . "</option>\n";
             }
diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php
index 8ef681922d..764c3bf320 100644
--- a/app/Helpers/rss_helper.php
+++ b/app/Helpers/rss_helper.php
@@ -51,7 +51,7 @@ if (! function_exists('get_rss_feed')) {
         $channel->addChild('docs', 'https://cyber.harvard.edu/rss/rss.html');
 
         $channel->addChild('guid', $podcast->guid, $podcastNamespace);
-        $channel->addChild('title', $podcast->title);
+        $channel->addChild('title', $podcast->title, null, false);
         $channel->addChildWithCDATA('description', $podcast->description_html);
 
         $itunesImage = $channel->addChild('image', null, $itunesNamespace);
@@ -189,7 +189,7 @@ if (! function_exists('get_rss_feed')) {
 
         $image = $channel->addChild('image');
         $image->addChild('url', $podcast->image->feed_url);
-        $image->addChild('title', $podcast->title);
+        $image->addChild('title', $podcast->title, null, false);
         $image->addChild('link', $podcast->link);
 
         if ($podcast->custom_rss !== null) {
@@ -200,7 +200,7 @@ if (! function_exists('get_rss_feed')) {
 
         foreach ($episodes as $episode) {
             $item = $channel->addChild('item');
-            $item->addChild('title', $episode->title);
+            $item->addChild('title', $episode->title, null, false);
             $enclosure = $item->addChild('enclosure');
 
             $enclosure->addAttribute(
diff --git a/app/Libraries/SimpleRSSElement.php b/app/Libraries/SimpleRSSElement.php
index 84944700ce..8378c052a6 100644
--- a/app/Libraries/SimpleRSSElement.php
+++ b/app/Libraries/SimpleRSSElement.php
@@ -29,8 +29,12 @@ class SimpleRSSElement extends SimpleXMLElement
 
         if ($newChild !== null) {
             $node = dom_import_simplexml($newChild);
-            $no = $node->ownerDocument;
-            $node->appendChild($no->createCDATASection($value));
+            if ($node !== null) {
+                $no = $node->ownerDocument;
+                if ($no !== null) {
+                    $node->appendChild($no->createCDATASection($value));
+                }
+            }
         }
 
         return $newChild;
@@ -43,17 +47,29 @@ class SimpleRSSElement extends SimpleXMLElement
      * @param string $name — The name of the child element to add.
      * @param string $value — [optional] If specified, the value of the child element.
      * @param string $namespace [optional] If specified, the namespace to which the child element belongs.
+     * @param boolean $escape [optional] The value is escaped by default, can be set to false.
      *
      * @return static The addChild method returns a SimpleXMLElement object representing the child added to the XML node.
      */
-    public function addChild($name, $value = null, $namespace = null)
+    public function addChild($name, $value = null, $namespace = null, $escape = true)
     {
         $newChild = parent::addChild($name, '', $namespace);
 
         if ($newChild !== null) {
             $node = dom_import_simplexml($newChild);
-            $no = $node->ownerDocument;
-            $node->appendChild($no->createTextNode((string) esc($value)));
+            if ($node !== null) {
+                $no = $node->ownerDocument;
+                $value = $escape ? esc($value ?? '') : $value ?? '';
+                if ($no === null) {
+                    return $newChild;
+                }
+                if (is_array($value)) {
+                    return $newChild;
+                }
+                /** @noRector RecastingRemovalRector */
+                $node->appendChild($no->createTextNode((string) $value));
+                return $newChild;
+            }
         }
 
         return $newChild;
diff --git a/app/Resources/js/typings.d.ts b/app/Resources/js/typings.d.ts
index fe9d4f5119..f850e707d0 100644
--- a/app/Resources/js/typings.d.ts
+++ b/app/Resources/js/typings.d.ts
@@ -1,3 +1 @@
-declare module "prosemirror-markdown";
-declare module "prosemirror-example-setup";
 declare module "leaflet.markercluster";
diff --git a/app/Resources/types/js/admin.d.ts b/app/Resources/types/js/admin.d.ts
deleted file mode 100644
index 4efc2a2c3d..0000000000
--- a/app/Resources/types/js/admin.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import "@github/markdown-toolbar-element";
-import "./modules/markdown-preview";
-import "./modules/markdown-write-preview";
diff --git a/app/Resources/types/js/charts.d.ts b/app/Resources/types/js/charts.d.ts
deleted file mode 100644
index c3fee8a175..0000000000
--- a/app/Resources/types/js/charts.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import "core-js";
diff --git a/app/Resources/types/js/install.d.ts b/app/Resources/types/js/install.d.ts
deleted file mode 100644
index cb0ff5c3b5..0000000000
--- a/app/Resources/types/js/install.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/app/Resources/types/js/map.d.ts b/app/Resources/types/js/map.d.ts
deleted file mode 100644
index c3fee8a175..0000000000
--- a/app/Resources/types/js/map.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-import "core-js";
diff --git a/app/Resources/types/js/modules/Charts.d.ts b/app/Resources/types/js/modules/Charts.d.ts
deleted file mode 100644
index 2e5108cffc..0000000000
--- a/app/Resources/types/js/modules/Charts.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const DrawCharts: () => void;
-export default DrawCharts;
diff --git a/app/Resources/types/js/modules/ClientTimezone.d.ts b/app/Resources/types/js/modules/ClientTimezone.d.ts
deleted file mode 100644
index 344446323e..0000000000
--- a/app/Resources/types/js/modules/ClientTimezone.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const ClientTimezone: () => void;
-export default ClientTimezone;
diff --git a/app/Resources/types/js/modules/Clipboard.d.ts b/app/Resources/types/js/modules/Clipboard.d.ts
deleted file mode 100644
index 9500a96e98..0000000000
--- a/app/Resources/types/js/modules/Clipboard.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Clipboard: () => void;
-export default Clipboard;
diff --git a/app/Resources/types/js/modules/DateTimePicker.d.ts b/app/Resources/types/js/modules/DateTimePicker.d.ts
deleted file mode 100644
index 9612d4033c..0000000000
--- a/app/Resources/types/js/modules/DateTimePicker.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import "flatpickr/dist/flatpickr.min.css";
-declare const DateTimePicker: () => void;
-export default DateTimePicker;
diff --git a/app/Resources/types/js/modules/Dropdown.d.ts b/app/Resources/types/js/modules/Dropdown.d.ts
deleted file mode 100644
index 5395e5640d..0000000000
--- a/app/Resources/types/js/modules/Dropdown.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Dropdown: () => void;
-export default Dropdown;
diff --git a/app/Resources/types/js/modules/EpisodesMap.d.ts b/app/Resources/types/js/modules/EpisodesMap.d.ts
deleted file mode 100644
index 67f900a5f7..0000000000
--- a/app/Resources/types/js/modules/EpisodesMap.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import "leaflet.markercluster/dist/MarkerCluster.css";
-import "leaflet.markercluster/dist/MarkerCluster.Default.css";
-import "leaflet/dist/leaflet.css";
-declare const DrawEpisodesMaps: () => void;
-export default DrawEpisodesMaps;
diff --git a/app/Resources/types/js/modules/Map.d.ts b/app/Resources/types/js/modules/Map.d.ts
deleted file mode 100644
index 4fe78599f5..0000000000
--- a/app/Resources/types/js/modules/Map.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const DrawMaps: () => void;
-export default DrawMaps;
diff --git a/app/Resources/types/js/modules/Modal.d.ts b/app/Resources/types/js/modules/Modal.d.ts
deleted file mode 100644
index 99d06ce410..0000000000
--- a/app/Resources/types/js/modules/Modal.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Modal: () => void;
-export default Modal;
diff --git a/app/Resources/types/js/modules/MultiSelect.d.ts b/app/Resources/types/js/modules/MultiSelect.d.ts
deleted file mode 100644
index 0f708a2470..0000000000
--- a/app/Resources/types/js/modules/MultiSelect.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const MultiSelect: () => void;
-export default MultiSelect;
diff --git a/app/Resources/types/js/modules/PublishMessageWarning.d.ts b/app/Resources/types/js/modules/PublishMessageWarning.d.ts
deleted file mode 100644
index c9a7b80fcc..0000000000
--- a/app/Resources/types/js/modules/PublishMessageWarning.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const PublishMessageWarning: () => void;
-export default PublishMessageWarning;
diff --git a/app/Resources/types/js/modules/Select.d.ts b/app/Resources/types/js/modules/Select.d.ts
deleted file mode 100644
index a1bd61c890..0000000000
--- a/app/Resources/types/js/modules/Select.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Select: () => void;
-export default Select;
diff --git a/app/Resources/types/js/modules/SidebarToggler.d.ts b/app/Resources/types/js/modules/SidebarToggler.d.ts
deleted file mode 100644
index 53739967ef..0000000000
--- a/app/Resources/types/js/modules/SidebarToggler.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const SidebarToggler: () => void;
-export default SidebarToggler;
diff --git a/app/Resources/types/js/modules/Slugify.d.ts b/app/Resources/types/js/modules/Slugify.d.ts
deleted file mode 100644
index 532945fd78..0000000000
--- a/app/Resources/types/js/modules/Slugify.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Slugify: () => void;
-export default Slugify;
diff --git a/app/Resources/types/js/modules/Soundbites.d.ts b/app/Resources/types/js/modules/Soundbites.d.ts
deleted file mode 100644
index b35a42567d..0000000000
--- a/app/Resources/types/js/modules/Soundbites.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Soundbites: () => void;
-export default Soundbites;
diff --git a/app/Resources/types/js/modules/ThemePicker.d.ts b/app/Resources/types/js/modules/ThemePicker.d.ts
deleted file mode 100644
index 385f044b81..0000000000
--- a/app/Resources/types/js/modules/ThemePicker.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const ThemePicker: () => void;
-export default ThemePicker;
diff --git a/app/Resources/types/js/modules/Time.d.ts b/app/Resources/types/js/modules/Time.d.ts
deleted file mode 100644
index e04a63d4c0..0000000000
--- a/app/Resources/types/js/modules/Time.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Time: () => void;
-export default Time;
diff --git a/app/Resources/types/js/modules/Toggler.d.ts b/app/Resources/types/js/modules/Toggler.d.ts
deleted file mode 100644
index 3157ee5484..0000000000
--- a/app/Resources/types/js/modules/Toggler.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Toggler: () => void;
-export default Toggler;
diff --git a/app/Resources/types/js/modules/Tooltip.d.ts b/app/Resources/types/js/modules/Tooltip.d.ts
deleted file mode 100644
index d733d7a310..0000000000
--- a/app/Resources/types/js/modules/Tooltip.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-declare const Tooltip: () => void;
-export default Tooltip;
diff --git a/app/Resources/types/js/modules/markdown-preview.d.ts b/app/Resources/types/js/modules/markdown-preview.d.ts
deleted file mode 100644
index 2132ecefd1..0000000000
--- a/app/Resources/types/js/modules/markdown-preview.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import MarkdownToolbarElement from "@github/markdown-toolbar-element";
-import { LitElement, TemplateResult } from "lit";
-export declare class MarkdownPreview extends LitElement {
-  for: string;
-  _textarea: HTMLTextAreaElement;
-  _markdownToolbar: MarkdownToolbarElement;
-  _show: boolean;
-  connectedCallback(): void;
-  hide(): void;
-  show(): void;
-  markdownToHtml(): string;
-  render(): TemplateResult<1>;
-}
diff --git a/app/Resources/types/js/modules/markdown-write-preview.d.ts b/app/Resources/types/js/modules/markdown-write-preview.d.ts
deleted file mode 100644
index 1f646a9bd1..0000000000
--- a/app/Resources/types/js/modules/markdown-write-preview.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { LitElement, TemplateResult } from "lit";
-import { MarkdownPreview } from "./markdown-preview";
-export declare class MarkdownWritePreview extends LitElement {
-  for: string;
-  _textarea: HTMLTextAreaElement | null;
-  _markdownPreview: MarkdownPreview;
-  _write: NodeListOf<HTMLButtonElement>;
-  _preview: NodeListOf<HTMLButtonElement>;
-  connectedCallback(): void;
-  write(): void;
-  preview(): void;
-  render(): TemplateResult<1>;
-}
diff --git a/app/Resources/types/js/podcast.d.ts b/app/Resources/types/js/podcast.d.ts
deleted file mode 100644
index cb0ff5c3b5..0000000000
--- a/app/Resources/types/js/podcast.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-export {};
diff --git a/tsconfig.json b/tsconfig.json
index 5f495c6b05..b56093e0df 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,15 +2,8 @@
   "compilerOptions": {
     /* Basic Options */
     "module": "esnext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
-    "lib": [
-      "DOM",
-      "DOM.Iterable",
-      "ESNext"
-    ] /* Specify library files to be included in the compilation. */,
-    "declaration": true,
-    "emitDeclarationOnly": true,
-    "outDir": "app/Resources/types",
-    "rootDir": "app/Resources",
+    "lib": ["DOM", "DOM.Iterable", "ESNext"],
+    "noEmit": true,
 
     /* Strict Type-Checking Options */
     "strict": true /* Enable all strict type-checking options. */,
-- 
GitLab