From c3fb6dd22b8924963335e0c3bc187a2f42081f23 Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Mon, 26 Sep 2022 09:31:29 +0000
Subject: [PATCH] fix #1518

Closes #1518

Merge request studip/studip!949
---
 lib/classes/ForumEntry.php                     |  2 ++
 lib/classes/Markup.class.php                   | 11 +++++++++--
 lib/models/Courseware/BlockTypes/Text.php      |  3 +++
 resources/assets/stylesheets/scss/content.scss | 18 ++++++++++++++++++
 4 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/lib/classes/ForumEntry.php b/lib/classes/ForumEntry.php
index 95721d75c2f..f18fbb2141c 100644
--- a/lib/classes/ForumEntry.php
+++ b/lib/classes/ForumEntry.php
@@ -146,7 +146,9 @@ class ForumEntry  implements PrivacyObject
         if (Studip\Markup::isHtml($description)) {
             // remove all blockquote tags
             $dom = new DOMDocument();
+            $old_libxml_error = libxml_use_internal_errors(true);
             $dom->loadHtml($description, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
+            libxml_use_internal_errors($old_libxml_error);
             $nodes = iterator_to_array($dom->getElementsByTagName('blockquote'));
 
             foreach ($nodes as $node) {
diff --git a/lib/classes/Markup.class.php b/lib/classes/Markup.class.php
index 26204aa7f5b..0944f422564 100644
--- a/lib/classes/Markup.class.php
+++ b/lib/classes/Markup.class.php
@@ -285,6 +285,8 @@ class Markup
             code
             div[class|style]
             em
+            figure[class|style]
+            figcaption
             h1
             h2
             h3
@@ -305,7 +307,7 @@ class Markup
             small
             sub
             sup
-            table[class]
+            table[class|style]
             tbody
             td[colspan|rowspan|style]
             thead
@@ -340,7 +342,9 @@ class Markup
             'height',
             'color',
             'background-color', // needed by span, td
-            'float'
+            'border-style',
+            'float',
+            'border'
         ]);
 
         if ($autoformat) {
@@ -375,6 +379,9 @@ class Markup
               'controls' => 'Text',     // Bool triggers bug in HTMLPurifier
         ]);
 
+        $def->addElement('figcaption', 'Inline', 'Flow', 'Common');
+        $def->addElement('figure', 'Block', 'Optional: (figcaption, Flow) | (Flow, figcaption) | Flow', 'Common');
+
         return new \HTMLPurifier($config);
     }
 
diff --git a/lib/models/Courseware/BlockTypes/Text.php b/lib/models/Courseware/BlockTypes/Text.php
index 7edeebc9262..4bccd883895 100644
--- a/lib/models/Courseware/BlockTypes/Text.php
+++ b/lib/models/Courseware/BlockTypes/Text.php
@@ -70,7 +70,9 @@ class Text extends BlockType
         $files = [];
 
         if ($payload['text']) {
+            $old_libxml_error = libxml_use_internal_errors(true);
             $document->loadHTML($payload['text']);
+            libxml_use_internal_errors($old_libxml_error);
             $imageElements = $document->getElementsByTagName('img');
             foreach ($imageElements as $element) {
                 if (!$element instanceof \DOMElement || !$element->hasAttribute('src')) {
@@ -82,6 +84,7 @@ class Text extends BlockType
                 }
             }
         }
+
         return $files;
     }
 
diff --git a/resources/assets/stylesheets/scss/content.scss b/resources/assets/stylesheets/scss/content.scss
index acfb03e19ec..aca9cb0a96d 100644
--- a/resources/assets/stylesheets/scss/content.scss
+++ b/resources/assets/stylesheets/scss/content.scss
@@ -54,6 +54,24 @@
     pre {   // pre-formatted content breaks the Stud.IP Layout!
         white-space: pre-wrap;
     }
+
+    figure {
+        display: table;
+        margin: 0.9em auto;
+
+        table {
+            width: 100%;
+            height: 100%;
+            border-collapse: collapse;
+            border-spacing: 0;
+
+            td {
+                border: unset;
+                min-width: 2em;
+                padding: 0.4em;
+            }
+        }
+    }
 }
 
 // Emphasize tt tags a little bit so ##monospace## blocks will stick out.
-- 
GitLab