xref: /plugin/commonmark/src/Dokuwiki/Plugin/Commonmark/Extension/CommonmarkToDokuwikiExtension.php (revision b0a36678775785ae4bed10dd2dcf9b3c90beb0c1)
1c21fce6dSSungbin Jeon<?php
2c21fce6dSSungbin Jeon/*
3c21fce6dSSungbin Jeon * This file is part of the clockoon/dokuwiki-commonmark-plugin package.
4c21fce6dSSungbin Jeon *
5c21fce6dSSungbin Jeon * (c) Sungbin Jeon <clockoon@gmail.com>
6c21fce6dSSungbin Jeon *
7c21fce6dSSungbin Jeon * Original code based on the followings:
8c21fce6dSSungbin Jeon * - CommonMark JS reference parser (https://bitly.com/commonmark-js) (c) John MacFarlane
9c21fce6dSSungbin Jeon * - league/commonmark (https://github.com/thephpleague/commonmark) (c) Colin O'Dell <colinodell@gmail.com>
10c21fce6dSSungbin Jeon *
11c21fce6dSSungbin Jeon * For the full copyright and license information, please view the LICENSE
12c21fce6dSSungbin Jeon * file that was distributed with this source code.
13c21fce6dSSungbin Jeon */
14c21fce6dSSungbin Jeon
15c21fce6dSSungbin Jeonnamespace DokuWiki\Plugin\Commonmark\Extension;
16c21fce6dSSungbin Jeon
17*b0a36678SSungbin Jeonuse League\CommonMark\Extension\ConfigurableExtensionInterface;
1894a075eeSSungbin Jeonuse League\CommonMark\Environment\EnvironmentBuilderInterface;
1994a075eeSSungbin Jeonuse League\CommonMark\Extension\CommonMark\Node\Block as BlockElement;
2094a075eeSSungbin Jeonuse League\CommonMark\Extension\CommonMark\Parser\Block as BlockParser;
21*b0a36678SSungbin Jeonuse League\CommonMark\Node\Block as CoreBlockElement;
22*b0a36678SSungbin Jeonuse League\CommonMark\Node\Inline as CoreInlineElement;
23c21fce6dSSungbin Jeonuse Dokuwiki\Plugin\Commonmark\Extension\Renderer\Block as BlockRenderer;
2494a075eeSSungbin Jeonuse League\CommonMark\Extension\CommonMark\Node\Inline as InlineElement;
2594a075eeSSungbin Jeonuse League\CommonMark\Extension\CommonMark\Parser\Inline as InlineParser;
26c21fce6dSSungbin Jeonuse Dokuwiki\Plugin\Commonmark\Extension\Renderer\Inline as InlineRenderer;
27*b0a36678SSungbin Jeonuse League\Config\ConfigurationBuilderInterface;
28*b0a36678SSungbin Jeonuse League\CommonMark\Extension\CommonMark\Delimiter\Processor\EmphasisDelimiterProcessor;
29*b0a36678SSungbin Jeonuse Nette\Schema\Expect;
30c21fce6dSSungbin Jeon
31*b0a36678SSungbin Jeonfinal class CommonMarkToDokuWikiExtension implements ConfigurableExtensionInterface {
32*b0a36678SSungbin Jeon
33*b0a36678SSungbin Jeon    public function configureSchema(ConfigurationBuilderInterface $builder): void
34*b0a36678SSungbin Jeon    {
35*b0a36678SSungbin Jeon        $builder->addSchema('commonmark', Expect::structure([
36*b0a36678SSungbin Jeon            'use_asterisk' => Expect::bool(true),
37*b0a36678SSungbin Jeon            'use_underscore' => Expect::bool(true),
38*b0a36678SSungbin Jeon            'enable_strong' => Expect::bool(true),
39*b0a36678SSungbin Jeon            'enable_em' => Expect::bool(true),
40*b0a36678SSungbin Jeon            'unordered_list_markers' => Expect::listOf('string')->min(1)->default(['*', '+', '-'])->mergeDefaults(false),
41*b0a36678SSungbin Jeon        ]));
42*b0a36678SSungbin Jeon    }
43*b0a36678SSungbin Jeon
4494a075eeSSungbin Jeon    public function register(EnvironmentBuilderInterface $environment): void {
45c21fce6dSSungbin Jeon        $environment
4694a075eeSSungbin Jeon            ->addBlockStartParser(new BlockParser\BlockQuoteStartParser(),      70)
4794a075eeSSungbin Jeon            ->addBlockStartParser(new BlockParser\HeadingStartParser(),      60)
4894a075eeSSungbin Jeon            ->addBlockStartParser(new BlockParser\FencedCodeStartParser(),      50)
4994a075eeSSungbin Jeon            //->addBlockStartParser(new BlockParser\HtmlBlockParser(),       40) # No raw HTML processing on Commonmarkside
5094a075eeSSungbin Jeon            //->addBlockStartParser(new BlockParser\SetExtHeadingParser(),   30)
5194a075eeSSungbin Jeon            ->addBlockStartParser(new BlockParser\ThematicBreakStartParser(),   20)
5294a075eeSSungbin Jeon            ->addBlockStartParser(new BlockParser\ListBlockStartParser(),            10)
5394a075eeSSungbin Jeon            ->addBlockStartParser(new BlockParser\IndentedCodeStartParser(),  -100)
5494a075eeSSungbin Jeon            //->addBlockStartParser(new BlockParser\LazyParagraphParser(), -200)
55c21fce6dSSungbin Jeon
5694a075eeSSungbin Jeon            //->addInlineParser(new InlineParser\NewlineParser(),     200)
57c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\BacktickParser(),    150)
58c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\EscapableParser(),    80)
59c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\EntityParser(),       70)
60c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\AutolinkParser(),     50)
61c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\HtmlInlineParser(),   40)
62c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\CloseBracketParser(), 30)
63c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\OpenBracketParser(),  20)
64c21fce6dSSungbin Jeon            ->addInlineParser(new InlineParser\BangParser(),         10)
65c21fce6dSSungbin Jeon
6694a075eeSSungbin Jeon            ->addRenderer(BlockElement\BlockQuote::class,    new BlockRenderer\BlockQuoteRenderer(),    0)
67*b0a36678SSungbin Jeon            ->addRenderer(CoreBlockElement\Document::class,      new BlockRenderer\DocumentRenderer(),      0)
6894a075eeSSungbin Jeon            ->addRenderer(BlockElement\FencedCode::class,    new BlockRenderer\FencedCodeRenderer(),    0)
6994a075eeSSungbin Jeon            ->addRenderer(BlockElement\Heading::class,       new BlockRenderer\HeadingRenderer(),       0)
7094a075eeSSungbin Jeon            //->addRenderer(BlockElement\HtmlBlock::class,     new BlockRenderer\HtmlBlockRenderer(),     0) # No raw HTML processing on Commonmarkside
7194a075eeSSungbin Jeon            ->addRenderer(BlockElement\IndentedCode::class,  new BlockRenderer\IndentedCodeRenderer(),  0)
7294a075eeSSungbin Jeon            ->addRenderer(BlockElement\ListBlock::class,     new BlockRenderer\ListBlockRenderer(),     0)
7394a075eeSSungbin Jeon            ->addRenderer(BlockElement\ListItem::class,      new BlockRenderer\ListItemRenderer(),      0)
74*b0a36678SSungbin Jeon            ->addRenderer(CoreBlockElement\Paragraph::class,     new BlockRenderer\ParagraphRenderer(),     0)
7594a075eeSSungbin Jeon            ->addRenderer(BlockElement\ThematicBreak::class, new BlockRenderer\ThematicBreakRenderer(), 0)
76c21fce6dSSungbin Jeon
7794a075eeSSungbin Jeon            ->addRenderer(InlineElement\Code::class,       new InlineRenderer\CodeRenderer(),       0)
7894a075eeSSungbin Jeon            ->addRenderer(InlineElement\Emphasis::class,   new InlineRenderer\EmphasisRenderer(),   0)
7994a075eeSSungbin Jeon            ->addRenderer(InlineElement\HtmlInline::class, new InlineRenderer\HtmlInlineRenderer(), 0)
8094a075eeSSungbin Jeon            ->addRenderer(InlineElement\Image::class,      new InlineRenderer\ImageRenderer(),      0)
8194a075eeSSungbin Jeon            ->addRenderer(InlineElement\Link::class,       new InlineRenderer\LinkRenderer(),       0)
8294a075eeSSungbin Jeon            ->addRenderer(InlineElement\Newline::class,    new InlineRenderer\NewlineRenderer(),    0)
8394a075eeSSungbin Jeon            ->addRenderer(InlineElement\Strong::class,     new InlineRenderer\StrongRenderer(),     0)
84*b0a36678SSungbin Jeon            ->addRenderer(CoreInlineElement\Text::class,       new InlineRenderer\TextRenderer(),       0)
85c21fce6dSSungbin Jeon        ;
86c21fce6dSSungbin Jeon
87*b0a36678SSungbin Jeon        if ($environment->getConfiguration()->get('commonmark/use_asterisk')) {
88c21fce6dSSungbin Jeon            $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('*'));
89c21fce6dSSungbin Jeon        }
90c21fce6dSSungbin Jeon
91*b0a36678SSungbin Jeon        if ($environment->getConfiguration()->get('commonmark/use_underscore')) {
92c21fce6dSSungbin Jeon            $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('_'));
93c21fce6dSSungbin Jeon        }
94c21fce6dSSungbin Jeon    }
95c21fce6dSSungbin Jeon}
96