Added strikethrough support to back-end md rendering
Needed to tweak the default library strikethrough extension so that it uses the same element as front-end. Added testing to cover. For #2470.
This commit is contained in:
		
							parent
							
								
									44315233d7
								
							
						
					
					
						commit
						28c706fee3
					
				| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					<?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());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					<?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()));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
<?php namespace BookStack\Entities\Tools;
 | 
					<?php namespace BookStack\Entities\Tools;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use BookStack\Entities\Models\Page;
 | 
					use BookStack\Entities\Models\Page;
 | 
				
			||||||
 | 
					use BookStack\Entities\Tools\Markdown\CustomStrikeThroughExtension;
 | 
				
			||||||
use DOMDocument;
 | 
					use DOMDocument;
 | 
				
			||||||
use DOMNodeList;
 | 
					use DOMNodeList;
 | 
				
			||||||
use DOMXPath;
 | 
					use DOMXPath;
 | 
				
			||||||
| 
						 | 
					@ -51,6 +52,7 @@ class PageContent
 | 
				
			||||||
        $environment = Environment::createCommonMarkEnvironment();
 | 
					        $environment = Environment::createCommonMarkEnvironment();
 | 
				
			||||||
        $environment->addExtension(new TableExtension());
 | 
					        $environment->addExtension(new TableExtension());
 | 
				
			||||||
        $environment->addExtension(new TaskListExtension());
 | 
					        $environment->addExtension(new TaskListExtension());
 | 
				
			||||||
 | 
					        $environment->addExtension(new CustomStrikeThroughExtension());
 | 
				
			||||||
        $converter = new CommonMarkConverter([], $environment);
 | 
					        $converter = new CommonMarkConverter([], $environment);
 | 
				
			||||||
        return $converter->convertToHtml($markdown);
 | 
					        return $converter->convertToHtml($markdown);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -461,4 +461,22 @@ class PageContentTest extends TestCase
 | 
				
			||||||
        $pageView = $this->get($page->getUrl());
 | 
					        $pageView = $this->get($page->getUrl());
 | 
				
			||||||
        $pageView->assertElementExists('.page-content input[type=checkbox]');
 | 
					        $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');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue