--- /dev/null
+<?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);
+ }
+}
--- /dev/null
+<?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);
+ }
+}
{
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";
}
$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());
);
}
+ 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();