From 05128733380ae59a2e259234682a503f278d28f0 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 13:28:22 +0100 Subject: [PATCH 01/10] Bump composer deps --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 0f07717..13d3f31 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "symfony/finder": "^6.4.17", "twig/twig": "^3.20", "illuminate/collections": "^8.53.1||^9.52.16", - "league/commonmark": "^1.6.7", + "league/commonmark": "^2.0", "spatie/yaml-front-matter": "^2.1" }, "require-dev": { From 72c7768b907b3cebbc4125c0ed918b13c29715b3 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 13:42:56 +0100 Subject: [PATCH 02/10] Upgrade core PrimerExtension --- .../Markdown/PrimerExtension.php | 139 ++++++++++++------ 1 file changed, 92 insertions(+), 47 deletions(-) diff --git a/src/DocumentParsers/Markdown/PrimerExtension.php b/src/DocumentParsers/Markdown/PrimerExtension.php index 413ac13..ef0c9b9 100644 --- a/src/DocumentParsers/Markdown/PrimerExtension.php +++ b/src/DocumentParsers/Markdown/PrimerExtension.php @@ -2,71 +2,116 @@ namespace Rareloop\Primer\DocumentParsers\Markdown; -use League\CommonMark\Block\Parser as BlockParser; +use League\CommonMark\Extension\CommonMark\Node\Block\BlockQuote; +use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode; +use League\CommonMark\Extension\CommonMark\Node\Block\Heading; +use League\CommonMark\Extension\CommonMark\Node\Block\HtmlBlock; +use League\CommonMark\Extension\CommonMark\Node\Block\IndentedCode; +use League\CommonMark\Extension\CommonMark\Node\Block\ListBlock; +use League\CommonMark\Extension\CommonMark\Node\Block\ListItem; +use League\CommonMark\Extension\CommonMark\Node\Block\ThematicBreak; +use League\CommonMark\Extension\CommonMark\Node\Inline\Code; +use League\CommonMark\Extension\CommonMark\Node\Inline\Emphasis; +use League\CommonMark\Extension\CommonMark\Node\Inline\HtmlInline; +use League\CommonMark\Extension\CommonMark\Node\Inline\Image; +use League\CommonMark\Extension\CommonMark\Node\Inline\Link; +use League\CommonMark\Extension\CommonMark\Node\Inline\Strong; +use League\CommonMark\Extension\CommonMark\Parser\Block\BlockQuoteStartParser; +use League\CommonMark\Extension\CommonMark\Parser\Block\FencedCodeStartParser; +use League\CommonMark\Extension\CommonMark\Parser\Block\HeadingStartParser; +use League\CommonMark\Extension\CommonMark\Parser\Block\HtmlBlockStartParser; +use League\CommonMark\Extension\CommonMark\Parser\Block\ListBlockStartParser; +use League\CommonMark\Extension\CommonMark\Parser\Block\ThematicBreakStartParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\AutolinkParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\BacktickParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\BangParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\CloseBracketParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\EntityParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\EscapableParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\HtmlInlineParser; +use League\CommonMark\Extension\CommonMark\Parser\Inline\OpenBracketParser; +use League\CommonMark\Extension\CommonMark\Renderer\Block\BlockQuoteRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Block\FencedCodeRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Block\HeadingRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Block\HtmlBlockRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Block\IndentedCodeRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Block\ListBlockRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Block\ListItemRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Block\ThematicBreakRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Inline\CodeRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Inline\EmphasisRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Inline\HtmlInlineRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Inline\ImageRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Inline\LinkRenderer; +use League\CommonMark\Extension\CommonMark\Renderer\Inline\StrongRenderer; use League\CommonMark\Extension\ExtensionInterface; -use League\CommonMark\Block\Element as BlockElement; -use League\CommonMark\Inline\Parser as InlineParser; -use League\CommonMark\Block\Renderer as BlockRenderer; -use League\CommonMark\Inline\Element as InlineElement; -use League\CommonMark\ConfigurableEnvironmentInterface; -use League\CommonMark\Inline\Renderer as InlineRenderer; -use League\CommonMark\Delimiter\Processor\EmphasisDelimiterProcessor; +use League\CommonMark\Environment\EnvironmentBuilderInterface; +use League\CommonMark\Extension\CommonMark\Delimiter\Processor\EmphasisDelimiterProcessor; +use League\CommonMark\Node\Block\Document; +use League\CommonMark\Node\Block\Paragraph; +use League\CommonMark\Node\Inline\Newline; +use League\CommonMark\Node\Inline\Text; +use League\CommonMark\Parser\Inline\NewlineParser; +use League\CommonMark\Renderer\Block\DocumentRenderer; +use League\CommonMark\Renderer\Block\ParagraphRenderer; +use League\CommonMark\Renderer\Inline\NewlineRenderer; +use League\CommonMark\Renderer\Inline\TextRenderer; /** * Primer flavoured Markdown setup. It is the same as the CommonMarkCoreExtension but with the - * `IndentedCodeParser` removed to allow for embedded Twig code in Markdown to be interpretted + * `IndentedCodeStartParser` removed to allow for embedded Twig code in Markdown to be interpretted * rather than code blocked. */ class PrimerExtension implements ExtensionInterface { - public function register(ConfigurableEnvironmentInterface $environment) + public function register(EnvironmentBuilderInterface $environment): void { $environment - ->addBlockParser(new BlockParser\BlockQuoteParser(), 70) - ->addBlockParser(new BlockParser\ATXHeadingParser(), 60) - ->addBlockParser(new BlockParser\FencedCodeParser(), 50) - ->addBlockParser(new BlockParser\HtmlBlockParser(), 40) - ->addBlockParser(new BlockParser\SetExtHeadingParser(), 30) - ->addBlockParser(new BlockParser\ThematicBreakParser(), 20) - ->addBlockParser(new BlockParser\ListParser(), 10) - ->addBlockParser(new BlockParser\LazyParagraphParser(), -200) + ->addBlockStartParser(new BlockQuoteStartParser(), 70) + ->addBlockStartParser(new HeadingStartParser(), 60) + ->addBlockStartParser(new FencedCodeStartParser(), 50) + ->addBlockStartParser(new HtmlBlockStartParser(), 40) + ->addBlockStartParser(new ThematicBreakStartParser(), 20) + ->addBlockStartParser(new ListBlockStartParser(), 10) - ->addInlineParser(new InlineParser\NewlineParser(), 200) - ->addInlineParser(new InlineParser\BacktickParser(), 150) - ->addInlineParser(new InlineParser\EscapableParser(), 80) - ->addInlineParser(new InlineParser\EntityParser(), 70) - ->addInlineParser(new InlineParser\AutolinkParser(), 50) - ->addInlineParser(new InlineParser\HtmlInlineParser(), 40) - ->addInlineParser(new InlineParser\CloseBracketParser(), 30) - ->addInlineParser(new InlineParser\OpenBracketParser(), 20) - ->addInlineParser(new InlineParser\BangParser(), 10) + ->addInlineParser(new NewlineParser(), 200) + ->addInlineParser(new BacktickParser(), 150) + ->addInlineParser(new EscapableParser(), 80) + ->addInlineParser(new EntityParser(), 70) + ->addInlineParser(new AutolinkParser(), 50) + ->addInlineParser(new HtmlInlineParser(), 40) + ->addInlineParser(new CloseBracketParser(), 30) + ->addInlineParser(new OpenBracketParser(), 20) + ->addInlineParser(new BangParser(), 10) - ->addBlockRenderer(BlockElement\BlockQuote::class, new BlockRenderer\BlockQuoteRenderer(), 0) - ->addBlockRenderer(BlockElement\Document::class, new BlockRenderer\DocumentRenderer(), 0) - ->addBlockRenderer(BlockElement\FencedCode::class, new BlockRenderer\FencedCodeRenderer(), 0) - ->addBlockRenderer(BlockElement\Heading::class, new BlockRenderer\HeadingRenderer(), 0) - ->addBlockRenderer(BlockElement\HtmlBlock::class, new BlockRenderer\HtmlBlockRenderer(), 0) - ->addBlockRenderer(BlockElement\IndentedCode::class, new BlockRenderer\IndentedCodeRenderer(), 0) - ->addBlockRenderer(BlockElement\ListBlock::class, new BlockRenderer\ListBlockRenderer(), 0) - ->addBlockRenderer(BlockElement\ListItem::class, new BlockRenderer\ListItemRenderer(), 0) - ->addBlockRenderer(BlockElement\Paragraph::class, new BlockRenderer\ParagraphRenderer(), 0) - ->addBlockRenderer(BlockElement\ThematicBreak::class, new BlockRenderer\ThematicBreakRenderer(), 0) + ->addRenderer(BlockQuote::class, new BlockQuoteRenderer(), 0) + ->addRenderer(Document::class, new DocumentRenderer(), 0) + ->addRenderer(FencedCode::class, new FencedCodeRenderer(), 0) + ->addRenderer(Heading::class, new HeadingRenderer(), 0) + ->addRenderer(HtmlBlock::class, new HtmlBlockRenderer(), 0) + ->addRenderer(IndentedCode::class, new IndentedCodeRenderer(), 0) + ->addRenderer(ListBlock::class, new ListBlockRenderer(), 0) + ->addRenderer(ListItem::class, new ListItemRenderer(), 0) + ->addRenderer(Paragraph::class, new ParagraphRenderer(), 0) + ->addRenderer(ThematicBreak::class, new ThematicBreakRenderer(), 0) - ->addInlineRenderer(InlineElement\Code::class, new InlineRenderer\CodeRenderer(), 0) - ->addInlineRenderer(InlineElement\Emphasis::class, new InlineRenderer\EmphasisRenderer(), 0) - ->addInlineRenderer(InlineElement\HtmlInline::class, new InlineRenderer\HtmlInlineRenderer(), 0) - ->addInlineRenderer(InlineElement\Image::class, new InlineRenderer\ImageRenderer(), 0) - ->addInlineRenderer(InlineElement\Link::class, new InlineRenderer\LinkRenderer(), 0) - ->addInlineRenderer(InlineElement\Newline::class, new InlineRenderer\NewlineRenderer(), 0) - ->addInlineRenderer(InlineElement\Strong::class, new InlineRenderer\StrongRenderer(), 0) - ->addInlineRenderer(InlineElement\Text::class, new InlineRenderer\TextRenderer(), 0); + ->addRenderer(Code::class, new CodeRenderer(), 0) + ->addRenderer(Emphasis::class, new EmphasisRenderer(), 0) + ->addRenderer(HtmlInline::class, new HtmlInlineRenderer(), 0) + ->addRenderer(Image::class, new ImageRenderer(), 0) + ->addRenderer(Link::class, new LinkRenderer(), 0) + ->addRenderer(Newline::class, new NewlineRenderer(), 0) + ->addRenderer(Strong::class, new StrongRenderer(), 0) + ->addRenderer(Text::class, new TextRenderer(), 0); - if ($environment->getConfig('use_asterisk', true)) { + + if ($environment->getConfiguration()->get('commonmark/use_asterisk')) { $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('*')); } - if ($environment->getConfig('use_underscore', true)) { + if ($environment->getConfiguration()->get('commonmark/use_underscore')) { $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('_')); } } } +c From ca23bd72fdf84032e5f680828a567dee8271a53e Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 13:52:27 +0100 Subject: [PATCH 03/10] Fix trailing character --- src/DocumentParsers/Markdown/PrimerExtension.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/DocumentParsers/Markdown/PrimerExtension.php b/src/DocumentParsers/Markdown/PrimerExtension.php index ef0c9b9..c004fed 100644 --- a/src/DocumentParsers/Markdown/PrimerExtension.php +++ b/src/DocumentParsers/Markdown/PrimerExtension.php @@ -74,7 +74,7 @@ public function register(EnvironmentBuilderInterface $environment): void ->addBlockStartParser(new ThematicBreakStartParser(), 20) ->addBlockStartParser(new ListBlockStartParser(), 10) - ->addInlineParser(new NewlineParser(), 200) + ->addInlineParser(new NewlineParser(), 200) ->addInlineParser(new BacktickParser(), 150) ->addInlineParser(new EscapableParser(), 80) ->addInlineParser(new EntityParser(), 70) @@ -114,4 +114,3 @@ public function register(EnvironmentBuilderInterface $environment): void } } } -c From 020c0f74ddf88d353a45301da25c271016f629d9 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 13:56:33 +0100 Subject: [PATCH 04/10] Fix formatting + comment out indentedcodestart parser --- src/DocumentParsers/Markdown/PrimerExtension.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/DocumentParsers/Markdown/PrimerExtension.php b/src/DocumentParsers/Markdown/PrimerExtension.php index c004fed..9051d94 100644 --- a/src/DocumentParsers/Markdown/PrimerExtension.php +++ b/src/DocumentParsers/Markdown/PrimerExtension.php @@ -73,8 +73,9 @@ public function register(EnvironmentBuilderInterface $environment): void ->addBlockStartParser(new HtmlBlockStartParser(), 40) ->addBlockStartParser(new ThematicBreakStartParser(), 20) ->addBlockStartParser(new ListBlockStartParser(), 10) + // ->addBlockStartParser(new IndentedCodeStartParser(), -100) - ->addInlineParser(new NewlineParser(), 200) + ->addInlineParser(new NewlineParser(), 200) ->addInlineParser(new BacktickParser(), 150) ->addInlineParser(new EscapableParser(), 80) ->addInlineParser(new EntityParser(), 70) @@ -85,14 +86,14 @@ public function register(EnvironmentBuilderInterface $environment): void ->addInlineParser(new BangParser(), 10) ->addRenderer(BlockQuote::class, new BlockQuoteRenderer(), 0) - ->addRenderer(Document::class, new DocumentRenderer(), 0) + ->addRenderer(Document::class, new DocumentRenderer(), 0) ->addRenderer(FencedCode::class, new FencedCodeRenderer(), 0) ->addRenderer(Heading::class, new HeadingRenderer(), 0) ->addRenderer(HtmlBlock::class, new HtmlBlockRenderer(), 0) ->addRenderer(IndentedCode::class, new IndentedCodeRenderer(), 0) ->addRenderer(ListBlock::class, new ListBlockRenderer(), 0) ->addRenderer(ListItem::class, new ListItemRenderer(), 0) - ->addRenderer(Paragraph::class, new ParagraphRenderer(), 0) + ->addRenderer(Paragraph::class, new ParagraphRenderer(), 0) ->addRenderer(ThematicBreak::class, new ThematicBreakRenderer(), 0) ->addRenderer(Code::class, new CodeRenderer(), 0) @@ -100,9 +101,9 @@ public function register(EnvironmentBuilderInterface $environment): void ->addRenderer(HtmlInline::class, new HtmlInlineRenderer(), 0) ->addRenderer(Image::class, new ImageRenderer(), 0) ->addRenderer(Link::class, new LinkRenderer(), 0) - ->addRenderer(Newline::class, new NewlineRenderer(), 0) + ->addRenderer(Newline::class, new NewlineRenderer(), 0) ->addRenderer(Strong::class, new StrongRenderer(), 0) - ->addRenderer(Text::class, new TextRenderer(), 0); + ->addRenderer(Text::class, new TextRenderer(), 0); if ($environment->getConfiguration()->get('commonmark/use_asterisk')) { From 7c879c4240559ead17a97460f1b572c527d58d88 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 13:58:49 +0100 Subject: [PATCH 05/10] Migrate environment creation --- src/DocumentParsers/MarkdownDocumentParser.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/DocumentParsers/MarkdownDocumentParser.php b/src/DocumentParsers/MarkdownDocumentParser.php index 0249f3b..27b1e57 100644 --- a/src/DocumentParsers/MarkdownDocumentParser.php +++ b/src/DocumentParsers/MarkdownDocumentParser.php @@ -3,7 +3,9 @@ namespace Rareloop\Primer\DocumentParsers; use League\CommonMark\CommonMarkConverter; -use League\CommonMark\Environment; +use League\CommonMark\Environment\Environment; +use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; +use League\CommonMark\Util\HtmlFilter; use Rareloop\Primer\DocumentParsers\Markdown\PrimerExtension; use Rareloop\Primer\Contracts\DocumentParser; use Rareloop\Primer\Document; @@ -20,19 +22,18 @@ public function parse(Document $document): Document protected function createEnvironment(): Environment { - $environment = new Environment(); - $environment->addExtension(new PrimerExtension()); - $environment->mergeConfig([ + $environment = new Environment([ 'renderer' => [ 'block_separator' => "\n", 'inner_separator' => "\n", 'soft_break' => "\n", ], 'safe' => false, // deprecated option - 'html_input' => Environment::HTML_INPUT_ALLOW, + 'html_input' => HtmlFilter::ALLOW, 'allow_unsafe_links' => true, 'max_nesting_level' => INF, ]); + $environment->addExtension(new PrimerExtension()); return $environment; } From 516960dd55a0e89e22092ec0b959fdbd4733eb4c Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 14:14:00 +0100 Subject: [PATCH 06/10] Fix MarkDocumentParse test --- src/DocumentParsers/Markdown/PrimerExtension.php | 16 +++++++++++++++- src/DocumentParsers/MarkdownDocumentParser.php | 10 +++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/DocumentParsers/Markdown/PrimerExtension.php b/src/DocumentParsers/Markdown/PrimerExtension.php index 9051d94..5c1cb9d 100644 --- a/src/DocumentParsers/Markdown/PrimerExtension.php +++ b/src/DocumentParsers/Markdown/PrimerExtension.php @@ -47,6 +47,7 @@ use League\CommonMark\Extension\ExtensionInterface; use League\CommonMark\Environment\EnvironmentBuilderInterface; use League\CommonMark\Extension\CommonMark\Delimiter\Processor\EmphasisDelimiterProcessor; +use League\CommonMark\Extension\ConfigurableExtensionInterface; use League\CommonMark\Node\Block\Document; use League\CommonMark\Node\Block\Paragraph; use League\CommonMark\Node\Inline\Newline; @@ -56,14 +57,27 @@ use League\CommonMark\Renderer\Block\ParagraphRenderer; use League\CommonMark\Renderer\Inline\NewlineRenderer; use League\CommonMark\Renderer\Inline\TextRenderer; +use League\Config\ConfigurationBuilderInterface; +use Nette\Schema\Expect; /** * Primer flavoured Markdown setup. It is the same as the CommonMarkCoreExtension but with the * `IndentedCodeStartParser` removed to allow for embedded Twig code in Markdown to be interpretted * rather than code blocked. */ -class PrimerExtension implements ExtensionInterface +class PrimerExtension implements ConfigurableExtensionInterface { + public function configureSchema(ConfigurationBuilderInterface $builder): void + { + $builder->addSchema('commonmark', Expect::structure([ + 'use_asterisk' => Expect::bool(true), + 'use_underscore' => Expect::bool(true), + 'enable_strong' => Expect::bool(true), + 'enable_em' => Expect::bool(true), + 'unordered_list_markers' => Expect::listOf('string')->min(1)->default(['*', '+', '-'])->mergeDefaults(false), + ])); + } + public function register(EnvironmentBuilderInterface $environment): void { $environment diff --git a/src/DocumentParsers/MarkdownDocumentParser.php b/src/DocumentParsers/MarkdownDocumentParser.php index 27b1e57..7e109a8 100644 --- a/src/DocumentParsers/MarkdownDocumentParser.php +++ b/src/DocumentParsers/MarkdownDocumentParser.php @@ -5,6 +5,7 @@ use League\CommonMark\CommonMarkConverter; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; +use League\CommonMark\MarkdownConverter; use League\CommonMark\Util\HtmlFilter; use Rareloop\Primer\DocumentParsers\Markdown\PrimerExtension; use Rareloop\Primer\Contracts\DocumentParser; @@ -14,8 +15,11 @@ class MarkdownDocumentParser implements DocumentParser { public function parse(Document $document): Document { - $converter = new CommonMarkConverter([], $this->createEnvironment()); - $document->setContent($converter->convertToHtml($document->content())); + $converter = new MarkdownConverter($this->createEnvironment()); + + $document->setContent( + $converter->convert($document->content()) + ); return $document; } @@ -31,7 +35,7 @@ protected function createEnvironment(): Environment 'safe' => false, // deprecated option 'html_input' => HtmlFilter::ALLOW, 'allow_unsafe_links' => true, - 'max_nesting_level' => INF, + 'max_nesting_level' => PHP_INT_MAX, ]); $environment->addExtension(new PrimerExtension()); From ea8bb5ee29af2d1225f66015caa7a3cb1d98bd96 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 14:24:08 +0100 Subject: [PATCH 07/10] Address PHPCS issues --- .../Markdown/PrimerExtension.php | 81 ++++++++++--------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/src/DocumentParsers/Markdown/PrimerExtension.php b/src/DocumentParsers/Markdown/PrimerExtension.php index 5c1cb9d..2716a9e 100644 --- a/src/DocumentParsers/Markdown/PrimerExtension.php +++ b/src/DocumentParsers/Markdown/PrimerExtension.php @@ -69,55 +69,60 @@ class PrimerExtension implements ConfigurableExtensionInterface { public function configureSchema(ConfigurationBuilderInterface $builder): void { - $builder->addSchema('commonmark', Expect::structure([ - 'use_asterisk' => Expect::bool(true), - 'use_underscore' => Expect::bool(true), - 'enable_strong' => Expect::bool(true), - 'enable_em' => Expect::bool(true), - 'unordered_list_markers' => Expect::listOf('string')->min(1)->default(['*', '+', '-'])->mergeDefaults(false), - ])); + $builder->addSchema( + 'commonmark', + Expect::structure( + [ + 'use_asterisk' => Expect::bool(true), + 'use_underscore' => Expect::bool(true), + 'enable_strong' => Expect::bool(true), + 'enable_em' => Expect::bool(true), + 'unordered_list_markers' => Expect::listOf('string')->min(1)->default(['*', '+', '-'])->mergeDefaults(false), + ] + ) + ); } public function register(EnvironmentBuilderInterface $environment): void { $environment - ->addBlockStartParser(new BlockQuoteStartParser(), 70) - ->addBlockStartParser(new HeadingStartParser(), 60) - ->addBlockStartParser(new FencedCodeStartParser(), 50) - ->addBlockStartParser(new HtmlBlockStartParser(), 40) - ->addBlockStartParser(new ThematicBreakStartParser(), 20) - ->addBlockStartParser(new ListBlockStartParser(), 10) + ->addBlockStartParser(new BlockQuoteStartParser(), 70) + ->addBlockStartParser(new HeadingStartParser(), 60) + ->addBlockStartParser(new FencedCodeStartParser(), 50) + ->addBlockStartParser(new HtmlBlockStartParser(), 40) + ->addBlockStartParser(new ThematicBreakStartParser(), 20) + ->addBlockStartParser(new ListBlockStartParser(), 10) // ->addBlockStartParser(new IndentedCodeStartParser(), -100) - ->addInlineParser(new NewlineParser(), 200) - ->addInlineParser(new BacktickParser(), 150) - ->addInlineParser(new EscapableParser(), 80) - ->addInlineParser(new EntityParser(), 70) - ->addInlineParser(new AutolinkParser(), 50) - ->addInlineParser(new HtmlInlineParser(), 40) + ->addInlineParser(new NewlineParser(), 200) + ->addInlineParser(new BacktickParser(), 150) + ->addInlineParser(new EscapableParser(), 80) + ->addInlineParser(new EntityParser(), 70) + ->addInlineParser(new AutolinkParser(), 50) + ->addInlineParser(new HtmlInlineParser(), 40) ->addInlineParser(new CloseBracketParser(), 30) - ->addInlineParser(new OpenBracketParser(), 20) - ->addInlineParser(new BangParser(), 10) + ->addInlineParser(new OpenBracketParser(), 20) + ->addInlineParser(new BangParser(), 10) - ->addRenderer(BlockQuote::class, new BlockQuoteRenderer(), 0) - ->addRenderer(Document::class, new DocumentRenderer(), 0) - ->addRenderer(FencedCode::class, new FencedCodeRenderer(), 0) - ->addRenderer(Heading::class, new HeadingRenderer(), 0) - ->addRenderer(HtmlBlock::class, new HtmlBlockRenderer(), 0) - ->addRenderer(IndentedCode::class, new IndentedCodeRenderer(), 0) - ->addRenderer(ListBlock::class, new ListBlockRenderer(), 0) - ->addRenderer(ListItem::class, new ListItemRenderer(), 0) - ->addRenderer(Paragraph::class, new ParagraphRenderer(), 0) + ->addRenderer(BlockQuote::class, new BlockQuoteRenderer(), 0) + ->addRenderer(Document::class, new DocumentRenderer(), 0) + ->addRenderer(FencedCode::class, new FencedCodeRenderer(), 0) + ->addRenderer(Heading::class, new HeadingRenderer(), 0) + ->addRenderer(HtmlBlock::class, new HtmlBlockRenderer(), 0) + ->addRenderer(IndentedCode::class, new IndentedCodeRenderer(), 0) + ->addRenderer(ListBlock::class, new ListBlockRenderer(), 0) + ->addRenderer(ListItem::class, new ListItemRenderer(), 0) + ->addRenderer(Paragraph::class, new ParagraphRenderer(), 0) ->addRenderer(ThematicBreak::class, new ThematicBreakRenderer(), 0) - ->addRenderer(Code::class, new CodeRenderer(), 0) - ->addRenderer(Emphasis::class, new EmphasisRenderer(), 0) - ->addRenderer(HtmlInline::class, new HtmlInlineRenderer(), 0) - ->addRenderer(Image::class, new ImageRenderer(), 0) - ->addRenderer(Link::class, new LinkRenderer(), 0) - ->addRenderer(Newline::class, new NewlineRenderer(), 0) - ->addRenderer(Strong::class, new StrongRenderer(), 0) - ->addRenderer(Text::class, new TextRenderer(), 0); + ->addRenderer(Code::class, new CodeRenderer(), 0) + ->addRenderer(Emphasis::class, new EmphasisRenderer(), 0) + ->addRenderer(HtmlInline::class, new HtmlInlineRenderer(), 0) + ->addRenderer(Image::class, new ImageRenderer(), 0) + ->addRenderer(Link::class, new LinkRenderer(), 0) + ->addRenderer(Newline::class, new NewlineRenderer(), 0) + ->addRenderer(Strong::class, new StrongRenderer(), 0) + ->addRenderer(Text::class, new TextRenderer(), 0); if ($environment->getConfiguration()->get('commonmark/use_asterisk')) { From 30b6e6f15d16d33f47c9cf3da1ee55768f3ebb84 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 14:27:29 +0100 Subject: [PATCH 08/10] Composer bump --- composer.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 13d3f31..965783c 100644 --- a/composer.json +++ b/composer.json @@ -2,17 +2,17 @@ "name": "rareloop/primer-core", "require": { "php": ">=8.1", - "symfony/finder": "^6.4.17", - "twig/twig": "^3.20", + "symfony/finder": "^6.4.24", + "twig/twig": "^3.21.1", "illuminate/collections": "^8.53.1||^9.52.16", - "league/commonmark": "^2.0", + "league/commonmark": "^2.7.1", "spatie/yaml-front-matter": "^2.1" }, "require-dev": { - "phpunit/phpunit": "^9.6.22", - "php-coveralls/php-coveralls": "^2.7", + "phpunit/phpunit": "^9.6.23", + "php-coveralls/php-coveralls": "^2.8", "mockery/mockery": "^1.6.12", - "squizlabs/php_codesniffer": "^3.12.2", + "squizlabs/php_codesniffer": "^3.13.2", "mikey179/vfsstream": "^1.6.12", "antecedent/patchwork": "^2.2.1" }, From 35a7f85381318939460bd58210404950d0471c93 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 14:37:39 +0100 Subject: [PATCH 09/10] Remove deprecated config --- src/DocumentParsers/MarkdownDocumentParser.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/DocumentParsers/MarkdownDocumentParser.php b/src/DocumentParsers/MarkdownDocumentParser.php index 7e109a8..de016c0 100644 --- a/src/DocumentParsers/MarkdownDocumentParser.php +++ b/src/DocumentParsers/MarkdownDocumentParser.php @@ -32,7 +32,6 @@ protected function createEnvironment(): Environment 'inner_separator' => "\n", 'soft_break' => "\n", ], - 'safe' => false, // deprecated option 'html_input' => HtmlFilter::ALLOW, 'allow_unsafe_links' => true, 'max_nesting_level' => PHP_INT_MAX, From 75d348f46ab4a2d91216f3d4f12a78d77675bba6 Mon Sep 17 00:00:00 2001 From: Tom Harper Date: Tue, 5 Aug 2025 14:39:53 +0100 Subject: [PATCH 10/10] fix phpcs issue --- src/DocumentParsers/Markdown/PrimerExtension.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/DocumentParsers/Markdown/PrimerExtension.php b/src/DocumentParsers/Markdown/PrimerExtension.php index 2716a9e..1b962b8 100644 --- a/src/DocumentParsers/Markdown/PrimerExtension.php +++ b/src/DocumentParsers/Markdown/PrimerExtension.php @@ -73,11 +73,17 @@ public function configureSchema(ConfigurationBuilderInterface $builder): void 'commonmark', Expect::structure( [ - 'use_asterisk' => Expect::bool(true), - 'use_underscore' => Expect::bool(true), - 'enable_strong' => Expect::bool(true), - 'enable_em' => Expect::bool(true), - 'unordered_list_markers' => Expect::listOf('string')->min(1)->default(['*', '+', '-'])->mergeDefaults(false), + 'use_asterisk' => Expect::bool(true), + 'use_underscore' => Expect::bool(true), + 'enable_strong' => Expect::bool(true), + 'enable_em' => Expect::bool(true), + 'unordered_list_markers' => Expect::listOf('string') + ->min(1) + ->default([ + '*', + '+', + '-' + ])->mergeDefaults(false), ] ) );