]> BookStack Code Mirror - bookstack/commitdiff
Improved iframe & summary handling in HTML to MD conversion
authorDan Brown <redacted>
Fri, 29 Apr 2022 13:58:28 +0000 (14:58 +0100)
committerDan Brown <redacted>
Fri, 29 Apr 2022 13:58:28 +0000 (14:58 +0100)
app/Entities/Tools/Markdown/HtmlToMarkdown.php
app/Entities/Tools/Markdown/SpacedTagFallbackConverter.php [new file with mode: 0644]
resources/views/pages/parts/editor-toolbar.blade.php
tests/Entity/MarkdownToHtmlTest.php

index aafb2733be16f1bc53d563a7e69774572d1771dd..8c13ee028626e28f0843451edc0575bb7c700a85 100644 (file)
@@ -88,6 +88,7 @@ class HtmlToMarkdown
         $environment->addConverter(new PreformattedConverter());
         $environment->addConverter(new TextConverter());
         $environment->addConverter(new CheckboxConverter());
+        $environment->addConverter(new SpacedTagFallbackConverter());
 
         return $environment;
     }
diff --git a/app/Entities/Tools/Markdown/SpacedTagFallbackConverter.php b/app/Entities/Tools/Markdown/SpacedTagFallbackConverter.php
new file mode 100644 (file)
index 0000000..960bc4e
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use League\HTMLToMarkdown\Converter\ConverterInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+/**
+ * For certain defined tags, add additional spacing upon the retained HTML content
+ * to separate it out from anything that may be markdown soon afterwards or within.
+ */
+class SpacedTagFallbackConverter implements ConverterInterface
+{
+    public function convert(ElementInterface $element): string
+    {
+        return \html_entity_decode($element->getChildrenAsString()) . "\n\n";
+    }
+
+    public function getSupportedTags(): array
+    {
+        return ['summary', 'iframe'];
+    }
+}
index 9bc79476e8e1e7cee59bc1c184e6c67d7176da58..4846f4b761299adf6822ae5d8097ff7d4ca469d9 100644 (file)
@@ -27,7 +27,7 @@
                             </a>
                         </li>
                     @endif
-                    <li refs="page-editor@discardDraftWrap" class="{{ $isDraft ? '' : 'hidden' }}">
+                    <li refs="page-editor@discardDraftWrap" class="{{ $isDraftRevision ? '' : 'hidden' }}">
                         <button refs="page-editor@discardDraft" type="button" class="text-neg icon-item">
                             @icon('cancel')
                             <div>{{ trans('entities.pages_edit_discard_draft') }}</div>
index 0b04f9cc4304f1830bba628c3021709393f66588..5a2b63c78cde09471990171a17c5188c9d337363 100644 (file)
@@ -47,6 +47,22 @@ class MarkdownToHtmlTest extends TestCase
         );
     }
 
+    public function test_summary_tags_have_newlines_after_to_separate_content()
+    {
+        $this->assertConversion(
+            '<details><summary>Toggle</summary><p>Test</p></details>',
+            "<details><summary>Toggle</summary>\n\nTest\n\n</details>"
+        );
+    }
+
+    public function test_iframes_tags_have_newlines_after_to_separate_content()
+    {
+        $this->assertConversion(
+            '<iframe src="https://example.com"></iframe><p>Beans</p>',
+            "<iframe src=\"https://example.com\"></iframe>\n\nBeans"
+        );
+    }
+
     protected function assertConversion(string $html, string $expectedMarkdown, bool $partialMdMatch = false)
     {
         $markdown = (new HtmlToMarkdown($html))->convert();