1<?php 2/* 3 * This file is part of the clockoon/dokuwiki-commonmark-plugin package. 4 * 5 * (c) Sungbin Jeon <clockoon@gmail.com> 6 * 7 * Original code based on the followings: 8 * - CommonMark JS reference parser (https://bitly.com/commonmark-js) (c) John MacFarlane 9 * - league/commonmark (https://github.com/thephpleague/commonmark) (c) Colin O'Dell <colinodell@gmail.com> 10 * 11 * For the full copyright and license information, please view the LICENSE 12 * file that was distributed with this source code. 13 */ 14 15namespace DokuWiki\Plugin\Commonmark\Extension; 16 17use League\CommonMark\Extension\ConfigurableExtensionInterface; 18use League\CommonMark\Environment\EnvironmentBuilderInterface; 19use League\CommonMark\Extension\CommonMark\Node\Block as BlockElement; 20use League\CommonMark\Extension\CommonMark\Parser\Block as BlockParser; 21use League\CommonMark\Node\Block as CoreBlockElement; 22use League\CommonMark\Node\Inline as CoreInlineElement; 23use League\CommonMark\Node as CoreNode; 24use League\CommonMark\Parser as CoreParser; 25use Dokuwiki\Plugin\Commonmark\Extension\Renderer\Block as BlockRenderer; 26use League\CommonMark\Extension\CommonMark\Node\Inline as InlineElement; 27use League\CommonMark\Extension\CommonMark\Parser\Inline as InlineParser; 28use Dokuwiki\Plugin\Commonmark\Extension\Renderer\Inline as InlineRenderer; 29use League\Config\ConfigurationBuilderInterface; 30use League\CommonMark\Extension\CommonMark\Delimiter\Processor\EmphasisDelimiterProcessor; 31use Nette\Schema\Expect; 32 33final class CommonMarkToDokuWikiExtension implements ConfigurableExtensionInterface { 34 35 public function configureSchema(ConfigurationBuilderInterface $builder): void 36 { 37 $builder->addSchema('commonmark', Expect::structure([ 38 'use_asterisk' => Expect::bool(true), 39 'use_underscore' => Expect::bool(true), 40 'enable_strong' => Expect::bool(true), 41 'enable_em' => Expect::bool(true), 42 'unordered_list_markers' => Expect::listOf('string')->min(1)->default(['*', '+', '-'])->mergeDefaults(false), 43 ])); 44 } 45 46 public function register(EnvironmentBuilderInterface $environment): void { 47 $environment 48 ->addBlockStartParser(new BlockParser\BlockQuoteStartParser(), 70) 49 ->addBlockStartParser(new BlockParser\HeadingStartParser(), 60) 50 ->addBlockStartParser(new BlockParser\FencedCodeStartParser(), 50) 51 //->addBlockStartParser(new BlockParser\HtmlBlockParser(), 40) # No raw HTML processing on Commonmarkside 52 //->addBlockStartParser(new BlockParser\SetExtHeadingParser(), 30) 53 ->addBlockStartParser(new BlockParser\ThematicBreakStartParser(), 20) 54 ->addBlockStartParser(new BlockParser\ListBlockStartParser(), 10) 55 ->addBlockStartParser(new BlockParser\IndentedCodeStartParser(), -100) 56 //->addBlockStartParser(new BlockParser\LazyParagraphParser(), -200) 57 58 ->addInlineParser(new CoreParser\Inline\NewlineParser(), 200) 59 ->addInlineParser(new InlineParser\BacktickParser(), 150) 60 ->addInlineParser(new InlineParser\EscapableParser(), 80) 61 ->addInlineParser(new InlineParser\EntityParser(), 70) 62 ->addInlineParser(new InlineParser\AutolinkParser(), 50) 63 ->addInlineParser(new InlineParser\HtmlInlineParser(), 40) 64 ->addInlineParser(new InlineParser\CloseBracketParser(), 30) 65 ->addInlineParser(new InlineParser\OpenBracketParser(), 20) 66 ->addInlineParser(new InlineParser\BangParser(), 10) 67 68 ->addRenderer(BlockElement\BlockQuote::class, new BlockRenderer\BlockQuoteRenderer(), 0) 69 ->addRenderer(CoreBlockElement\Document::class, new BlockRenderer\DocumentRenderer(), 0) 70 ->addRenderer(BlockElement\FencedCode::class, new BlockRenderer\FencedCodeRenderer(), 0) 71 ->addRenderer(BlockElement\Heading::class, new BlockRenderer\HeadingRenderer(), 0) 72 //->addRenderer(BlockElement\HtmlBlock::class, new BlockRenderer\HtmlBlockRenderer(), 0) # No raw HTML processing on Commonmarkside 73 ->addRenderer(BlockElement\IndentedCode::class, new BlockRenderer\IndentedCodeRenderer(), 0) 74 ->addRenderer(BlockElement\ListBlock::class, new BlockRenderer\ListBlockRenderer(), 0) 75 ->addRenderer(BlockElement\ListItem::class, new BlockRenderer\ListItemRenderer(), 0) 76 ->addRenderer(CoreBlockElement\Paragraph::class, new BlockRenderer\ParagraphRenderer(), 0) 77 ->addRenderer(BlockElement\ThematicBreak::class, new BlockRenderer\ThematicBreakRenderer(), 0) 78 79 ->addRenderer(InlineElement\Code::class, new InlineRenderer\CodeRenderer(), 0) 80 ->addRenderer(InlineElement\Emphasis::class, new InlineRenderer\EmphasisRenderer(), 0) 81 ->addRenderer(InlineElement\HtmlInline::class, new InlineRenderer\HtmlInlineRenderer(), 0) 82 ->addRenderer(InlineElement\Image::class, new InlineRenderer\ImageRenderer(), 0) 83 ->addRenderer(InlineElement\Link::class, new InlineRenderer\LinkRenderer(), 0) 84 ->addRenderer(CoreNode\Inline\Newline::class, new InlineRenderer\NewlineRenderer(), 0) 85 ->addRenderer(InlineElement\Strong::class, new InlineRenderer\StrongRenderer(), 0) 86 ->addRenderer(CoreInlineElement\Text::class, new InlineRenderer\TextRenderer(), 0) 87 ; 88 89 if ($environment->getConfiguration()->get('commonmark/use_asterisk')) { 90 $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('*')); 91 } 92 93 if ($environment->getConfiguration()->get('commonmark/use_underscore')) { 94 $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('_')); 95 } 96 } 97} 98