]> BookStack Code Mirror - bookstack/commitdiff
Added tasklist support to markdown exporter
authorDan Brown <redacted>
Tue, 22 Mar 2022 14:56:51 +0000 (14:56 +0000)
committerDan Brown <redacted>
Tue, 22 Mar 2022 14:56:51 +0000 (14:56 +0000)
app/Entities/Tools/Markdown/CheckboxConverter.php [new file with mode: 0644]
app/Entities/Tools/Markdown/HtmlToMarkdown.php
tests/Entity/ExportTest.php

diff --git a/app/Entities/Tools/Markdown/CheckboxConverter.php b/app/Entities/Tools/Markdown/CheckboxConverter.php
new file mode 100644 (file)
index 0000000..e4666d6
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+namespace BookStack\Entities\Tools\Markdown;
+
+use League\HTMLToMarkdown\Converter\ConverterInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+class CheckboxConverter implements ConverterInterface
+{
+
+    public function convert(ElementInterface $element): string
+    {
+        if (strtolower($element->getAttribute('type')) === 'checkbox') {
+            $isChecked = $element->getAttribute('checked') === 'checked';
+            return $isChecked ? ' [x] ' : ' [ ] ';
+        }
+
+        return $element->getValue();
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getSupportedTags(): array
+    {
+        return ['input'];
+    }
+}
\ No newline at end of file
index e8804690c652a4e98acda01c80ab7eef33551a39..51366705ca1a1043df00a690bb5f5a70293e794a 100644 (file)
@@ -87,6 +87,7 @@ class HtmlToMarkdown
         $environment->addConverter(new CustomParagraphConverter());
         $environment->addConverter(new PreformattedConverter());
         $environment->addConverter(new TextConverter());
         $environment->addConverter(new CustomParagraphConverter());
         $environment->addConverter(new PreformattedConverter());
         $environment->addConverter(new TextConverter());
+        $environment->addConverter(new CheckboxConverter());
 
         return $environment;
     }
 
         return $environment;
     }
index fc15bb8f3b3a916d3530cd8ba879866518a48b90..2841175ad19d4f349a5d94f64ba5ee60eb0bc2e3 100644 (file)
@@ -386,6 +386,18 @@ class ExportTest extends TestCase
         $resp->assertSee("# Dogcat\n\n```JavaScript\nvar a = 'cat';\n```\n\nAnother line", false);
     }
 
         $resp->assertSee("# Dogcat\n\n```JavaScript\nvar a = 'cat';\n```\n\nAnother line", false);
     }
 
+    public function test_page_markdown_export_handles_tasklist_checkboxes()
+    {
+        $page = Page::query()->first()->forceFill([
+            'markdown' => '',
+            'html'     => '<ul><li><input type="checkbox" checked="checked">Item A</li><li><input type="checkbox">Item B</li></ul>',
+        ]);
+        $page->save();
+
+        $resp = $this->asEditor()->get($page->getUrl('/export/markdown'));
+        $resp->assertSee("- [x] Item A\n- [ ] Item B", false);
+    }
+
     public function test_chapter_markdown_export()
     {
         $chapter = Chapter::query()->first();
     public function test_chapter_markdown_export()
     {
         $chapter = Chapter::query()->first();