]> BookStack Code Mirror - bookstack/commitdiff
Fixed drawing handling on HTML to Markdown conversion
authorDan Brown <redacted>
Fri, 29 Apr 2022 11:17:14 +0000 (12:17 +0100)
committerDan Brown <redacted>
Fri, 29 Apr 2022 11:17:14 +0000 (12:17 +0100)
app/Entities/Tools/Markdown/CustomDivConverter.php [new file with mode: 0644]
app/Entities/Tools/Markdown/CustomImageConverter.php [new file with mode: 0644]
app/Entities/Tools/Markdown/CustomParagraphConverter.php
app/Entities/Tools/Markdown/HtmlToMarkdown.php
tests/Entity/MarkdownToHtmlTest.php

diff --git a/app/Entities/Tools/Markdown/CustomDivConverter.php b/app/Entities/Tools/Markdown/CustomDivConverter.php
new file mode 100644 (file)
index 0000000..4860623
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use League\HTMLToMarkdown\Converter\DivConverter;
+use League\HTMLToMarkdown\ElementInterface;
+
+class CustomDivConverter extends DivConverter
+{
+    public function convert(ElementInterface $element): string
+    {
+        // Clean up draw.io diagrams
+        $drawIoDiagram = $element->getAttribute('drawio-diagram');
+        if ($drawIoDiagram) {
+            return "<div drawio-diagram=\"{$drawIoDiagram}\">{$element->getValue()}</div>\n\n";
+        }
+
+        return parent::convert($element);
+    }
+}
diff --git a/app/Entities/Tools/Markdown/CustomImageConverter.php b/app/Entities/Tools/Markdown/CustomImageConverter.php
new file mode 100644 (file)
index 0000000..97b7afd
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use League\HTMLToMarkdown\Converter\ImageConverter;
+use League\HTMLToMarkdown\ElementInterface;
+
+class CustomImageConverter extends ImageConverter
+{
+    public function convert(ElementInterface $element): string
+    {
+        $parent = $element->getParent();
+
+        // Remain as HTML if within diagram block.
+        $withinDrawing = $parent && !empty($parent->getAttribute('drawio-diagram'));
+        if ($withinDrawing) {
+            $src = e($element->getAttribute('src'));
+            $alt = e($element->getAttribute('alt'));
+            return "<img src=\"{$src}\" alt=\"{$alt}\"/>";
+        }
+
+        return parent::convert($element);
+    }
+}
index bd493aa03670b50dbcb5027676762b47e6086b5b..db36042cd7176e93078957b4d2e1bf4d046faedb 100644 (file)
@@ -9,7 +9,7 @@ class CustomParagraphConverter extends ParagraphConverter
 {
     public function convert(ElementInterface $element): string
     {
-        $class = $element->getAttribute('class');
+        $class = e($element->getAttribute('class'));
         if (strpos($class, 'callout') !== false) {
             return "<{$element->getTagName()} class=\"{$class}\">{$element->getValue()}</{$element->getTagName()}>\n\n";
         }
index 5c7b388ea93ceda62bb8f8241ae6d924235e449c..aafb2733be16f1bc53d563a7e69774572d1771dd 100644 (file)
@@ -75,12 +75,12 @@ class HtmlToMarkdown
         $environment->addConverter(new BlockquoteConverter());
         $environment->addConverter(new CodeConverter());
         $environment->addConverter(new CommentConverter());
-        $environment->addConverter(new DivConverter());
+        $environment->addConverter(new CustomDivConverter());
         $environment->addConverter(new EmphasisConverter());
         $environment->addConverter(new HardBreakConverter());
         $environment->addConverter(new HeaderConverter());
         $environment->addConverter(new HorizontalRuleConverter());
-        $environment->addConverter(new ImageConverter());
+        $environment->addConverter(new CustomImageConverter());
         $environment->addConverter(new LinkConverter());
         $environment->addConverter(new ListBlockConverter());
         $environment->addConverter(new ListItemConverter());
index 1a439636e728524b7e9d81abc42530216def0c75..0b04f9cc4304f1830bba628c3021709393f66588 100644 (file)
@@ -39,6 +39,14 @@ class MarkdownToHtmlTest extends TestCase
         );
     }
 
+    public function test_drawing_blocks_remain_html()
+    {
+        $this->assertConversion(
+            '<div drawio-diagram="190" id="bkmrk--0" contenteditable="false"><img src="http://example.com/uploads/images/drawio/2022-04/drawing-1.png" alt="" /></div>Some text',
+            '<div drawio-diagram="190"><img src="http://example.com/uploads/images/drawio/2022-04/drawing-1.png" alt=""/></div>' . "\n\nSome text"
+        );
+    }
+
     protected function assertConversion(string $html, string $expectedMarkdown, bool $partialMdMatch = false)
     {
         $markdown = (new HtmlToMarkdown($html))->convert();