the browser-facing portion of osu!
at master 76 lines 4.5 kB view raw
1<?php 2 3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0. 4// See the LICENCE file in the repository root for full licence text. 5 6namespace App\Libraries\Markdown\Chat; 7 8use League\CommonMark\Environment\EnvironmentBuilderInterface; 9use League\CommonMark\Extension\Autolink\AutolinkExtension; 10use League\CommonMark\Extension\CommonMark\Delimiter\Processor\EmphasisDelimiterProcessor; 11use League\CommonMark\Extension\CommonMark\Node; 12use League\CommonMark\Extension\CommonMark\Parser; 13use League\CommonMark\Extension\CommonMark\Renderer; 14use League\CommonMark\Extension\ConfigurableExtensionInterface; 15use League\CommonMark\Node as CoreNode; 16use League\CommonMark\Parser as CoreParser; 17use League\CommonMark\Renderer as CoreRenderer; 18use League\Config\ConfigurationBuilderInterface; 19use Nette\Schema\Expect; 20 21final class Extension implements ConfigurableExtensionInterface 22{ 23 public function configureSchema(ConfigurationBuilderInterface $builder): void 24 { 25 $builder->addSchema('commonmark', Expect::structure([ 26 'use_asterisk' => Expect::bool(true), 27 'use_underscore' => Expect::bool(true), 28 'enable_strong' => Expect::bool(true), 29 'enable_em' => Expect::bool(true), 30 'unordered_list_markers' => Expect::listOf('string')->min(1)->default(['*', '+', '-'])->mergeDefaults(false), 31 ])); 32 } 33 34 public function register(EnvironmentBuilderInterface $environment): void 35 { 36 // phpcs:disable Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma,Squiz.WhiteSpace.SemicolonSpacing.Incorrect 37 $environment 38 ->addBlockStartParser(new Parser\Block\BlockQuoteStartParser(), 70) 39 ->addBlockStartParser(new Parser\Block\HeadingStartParser(), 60) 40 ->addBlockStartParser(new Parser\Block\FencedCodeStartParser(), 50) 41 ->addBlockStartParser(new Parser\Block\ThematicBreakStartParser(), 20) 42 ->addBlockStartParser(new Parser\Block\ListBlockStartParser(), 10) 43 ->addBlockStartParser(new Parser\Block\IndentedCodeStartParser(), -100) 44 45 ->addInlineParser(new CoreParser\Inline\NewlineParser(), 200) 46 ->addInlineParser(new Parser\Inline\BacktickParser(), 150) 47 ->addInlineParser(new Parser\Inline\EscapableParser(), 80) 48 ->addInlineParser(new Parser\Inline\AutolinkParser(), 50) 49 ->addInlineParser(new Parser\Inline\CloseBracketParser(), 30) 50 ->addInlineParser(new Parser\Inline\OpenBracketParser(), 20) 51 52 ->addRenderer(Node\Block\BlockQuote::class, new Renderer\Block\BlockQuoteRenderer(), 0) 53 ->addRenderer(CoreNode\Block\Document::class, new CoreRenderer\Block\DocumentRenderer(), 0) 54 ->addRenderer(Node\Block\FencedCode::class, new Renderer\Block\FencedCodeRenderer(), 0) 55 ->addRenderer(Node\Block\Heading::class, new Renderer\Block\HeadingRenderer(), 0) 56 ->addRenderer(Node\Block\IndentedCode::class, new Renderer\Block\IndentedCodeRenderer(), 0) 57 ->addRenderer(Node\Block\ListBlock::class, new Renderer\Block\ListBlockRenderer(), 0) 58 ->addRenderer(Node\Block\ListItem::class, new Renderer\Block\ListItemRenderer(), 0) 59 ->addRenderer(CoreNode\Block\Paragraph::class, new CoreRenderer\Block\ParagraphRenderer(), 0) 60 ->addRenderer(Node\Block\ThematicBreak::class, new Renderer\Block\ThematicBreakRenderer(), 0) 61 62 ->addRenderer(Node\Inline\Code::class, new Renderer\Inline\CodeRenderer(), 0) 63 ->addRenderer(Node\Inline\Emphasis::class, new Renderer\Inline\EmphasisRenderer(), 0) 64 ->addRenderer(Node\Inline\Image::class, new Renderer\Inline\ImageRenderer(), 0) 65 ->addRenderer(Node\Inline\Link::class, new Renderer\Inline\LinkRenderer(), 0) 66 ->addRenderer(CoreNode\Inline\Newline::class, new CoreRenderer\Inline\NewlineRenderer(), 0) 67 ->addRenderer(Node\Inline\Strong::class, new Renderer\Inline\StrongRenderer(), 0) 68 ->addRenderer(CoreNode\Inline\Text::class, new CoreRenderer\Inline\TextRenderer(), 0) 69 ; 70 71 $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('*')); 72 $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('_')); 73 74 $environment->addExtension(new AutolinkExtension()); 75 } 76}