$environment->addConverter(new PreformattedConverter());
$environment->addConverter(new TextConverter());
$environment->addConverter(new CheckboxConverter());
+ $environment->addConverter(new SpacedTagFallbackConverter());
return $environment;
}
--- /dev/null
+<?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'];
+ }
+}
</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>
);
}
+ 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();