]> BookStack Code Mirror - bookstack/blob - tests/Entity/MarkdownToHtmlTest.php
Improved iframe & summary handling in HTML to MD conversion
[bookstack] / tests / Entity / MarkdownToHtmlTest.php
1 <?php
2
3 namespace Tests\Entity;
4
5 use BookStack\Entities\Tools\Markdown\HtmlToMarkdown;
6 use Tests\TestCase;
7
8 class MarkdownToHtmlTest extends TestCase
9 {
10     public function test_basic_formatting_conversion()
11     {
12         $this->assertConversion(
13             '<h1>Dogcat</h1><p>Some <strong>bold</strong> text</p>',
14             "# Dogcat\n\nSome **bold** text"
15         );
16     }
17
18     public function test_callouts_remain_html()
19     {
20         $this->assertConversion(
21             '<h1>Dogcat</h1><p class="callout info">Some callout text</p><p>Another line</p>',
22             "# Dogcat\n\n<p class=\"callout info\">Some callout text</p>\n\nAnother line"
23         );
24     }
25
26     public function test_wysiwyg_code_format_handled_cleanly()
27     {
28         $this->assertConversion(
29             '<h1>Dogcat</h1>' . "\r\n" . '<pre id="bkmrk-var-a-%3D-%27cat%27%3B"><code class="language-JavaScript">var a = \'cat\';</code></pre><p>Another line</p>',
30             "# Dogcat\n\n```JavaScript\nvar a = 'cat';\n```\n\nAnother line"
31         );
32     }
33
34     public function test_tasklist_checkboxes_are_handled()
35     {
36         $this->assertConversion(
37             '<ul><li><input type="checkbox" checked="checked">Item A</li><li><input type="checkbox">Item B</li></ul>',
38             "- [x] Item A\n- [ ] Item B"
39         );
40     }
41
42     public function test_drawing_blocks_remain_html()
43     {
44         $this->assertConversion(
45             '<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',
46             '<div drawio-diagram="190"><img src="http://example.com/uploads/images/drawio/2022-04/drawing-1.png" alt=""/></div>' . "\n\nSome text"
47         );
48     }
49
50     public function test_summary_tags_have_newlines_after_to_separate_content()
51     {
52         $this->assertConversion(
53             '<details><summary>Toggle</summary><p>Test</p></details>',
54             "<details><summary>Toggle</summary>\n\nTest\n\n</details>"
55         );
56     }
57
58     public function test_iframes_tags_have_newlines_after_to_separate_content()
59     {
60         $this->assertConversion(
61             '<iframe src="https://example.com"></iframe><p>Beans</p>',
62             "<iframe src=\"https://example.com\"></iframe>\n\nBeans"
63         );
64     }
65
66     protected function assertConversion(string $html, string $expectedMarkdown, bool $partialMdMatch = false)
67     {
68         $markdown = (new HtmlToMarkdown($html))->convert();
69
70         if ($partialMdMatch) {
71             static::assertStringContainsString($expectedMarkdown, $markdown);
72         } else {
73             static::assertEquals($expectedMarkdown, $markdown);
74         }
75     }
76
77 }