--- /dev/null
+<?php namespace BookStack\Entities\Tools\Markdown;
+
+use League\CommonMark\ConfigurableEnvironmentInterface;
+use League\CommonMark\Extension\ExtensionInterface;
+use League\CommonMark\Extension\Strikethrough\Strikethrough;
+use League\CommonMark\Extension\Strikethrough\StrikethroughDelimiterProcessor;
+
+class CustomStrikeThroughExtension implements ExtensionInterface
+{
+
+ public function register(ConfigurableEnvironmentInterface $environment)
+ {
+ $environment->addDelimiterProcessor(new StrikethroughDelimiterProcessor());
+ $environment->addInlineRenderer(Strikethrough::class, new CustomStrikethroughRenderer());
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php namespace BookStack\Entities\Tools\Markdown;
+
+use League\CommonMark\ElementRendererInterface;
+use League\CommonMark\Extension\Strikethrough\Strikethrough;
+use League\CommonMark\HtmlElement;
+use League\CommonMark\Inline\Element\AbstractInline;
+use League\CommonMark\Inline\Renderer\InlineRendererInterface;
+
+/**
+ * This is a somewhat clone of the League\CommonMark\Extension\Strikethrough\StrikethroughRender
+ * class but modified slightly to use <s> HTML tags instead of <del> in order to
+ * match front-end markdown-it rendering.
+ */
+class CustomStrikethroughRenderer implements InlineRendererInterface
+{
+ public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer)
+ {
+ if (!($inline instanceof Strikethrough)) {
+ throw new \InvalidArgumentException('Incompatible inline type: ' . get_class($inline));
+ }
+
+ return new HtmlElement('s', $inline->getData('attributes', []), $htmlRenderer->renderInlines($inline->children()));
+ }
+}
\ No newline at end of file
<?php namespace BookStack\Entities\Tools;
use BookStack\Entities\Models\Page;
+use BookStack\Entities\Tools\Markdown\CustomStrikeThroughExtension;
use DOMDocument;
use DOMNodeList;
use DOMXPath;
$environment = Environment::createCommonMarkEnvironment();
$environment->addExtension(new TableExtension());
$environment->addExtension(new TaskListExtension());
+ $environment->addExtension(new CustomStrikeThroughExtension());
$converter = new CommonMarkConverter([], $environment);
return $converter->convertToHtml($markdown);
}
$pageView = $this->get($page->getUrl());
$pageView->assertElementExists('.page-content input[type=checkbox]');
}
+
+ public function test_page_markdown_strikethrough_rendering()
+ {
+ $this->asEditor();
+ $page = Page::query()->first();
+
+ $content = '~~some crossed out text~~';
+ $this->put($page->getUrl(), [
+ 'name' => $page->name, 'markdown' => $content,
+ 'html' => '', 'summary' => ''
+ ]);
+
+ $page->refresh();
+ $this->assertStringMatchesFormat('%A<s%A>some crossed out text</s>%A', $page->html);
+
+ $pageView = $this->get($page->getUrl());
+ $pageView->assertElementExists('.page-content p > s');
+ }
}