From 44017a30165404bfd1c9c9524eae3899e1def91d Mon Sep 17 00:00:00 2001 From: upstream Date: Thu, 27 Aug 2026 23:37:32 +0200 Subject: [PATCH] Upstream thephpleague/commonmark state of the touched files before 9e0f3b147e --- .../InlinesOnly/InlinesOnlyExtension.php | 73 +++++++++++++++++++ .../InlinesOnly/InlinesOnlyFunctionalTest.php | 67 +++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 src/Extension/InlinesOnly/InlinesOnlyExtension.php create mode 100644 tests/functional/Extension/InlinesOnly/InlinesOnlyFunctionalTest.php diff --git a/src/Extension/InlinesOnly/InlinesOnlyExtension.php b/src/Extension/InlinesOnly/InlinesOnlyExtension.php new file mode 100644 index 0000000..7777510 --- /dev/null +++ b/src/Extension/InlinesOnly/InlinesOnlyExtension.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace League\CommonMark\Extension\InlinesOnly; + +use League\CommonMark as Core; +use League\CommonMark\Environment\EnvironmentBuilderInterface; +use League\CommonMark\Extension\CommonMark; +use League\CommonMark\Extension\CommonMark\Delimiter\Processor\EmphasisDelimiterProcessor; +use League\CommonMark\Extension\ConfigurableExtensionInterface; +use League\Config\ConfigurationBuilderInterface; +use Nette\Schema\Expect; + +final class InlinesOnlyExtension 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), + ])); + } + + // phpcs:disable Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma,Squiz.WhiteSpace.SemicolonSpacing.Incorrect + public function register(EnvironmentBuilderInterface $environment): void + { + $childRenderer = new ChildRenderer(); + + $environment + ->addInlineParser(new Core\Parser\Inline\NewlineParser(), 200) + ->addInlineParser(new CommonMark\Parser\Inline\BacktickParser(), 150) + ->addInlineParser(new CommonMark\Parser\Inline\EscapableParser(), 80) + ->addInlineParser(new CommonMark\Parser\Inline\EntityParser(), 70) + ->addInlineParser(new CommonMark\Parser\Inline\AutolinkParser(), 50) + ->addInlineParser(new CommonMark\Parser\Inline\HtmlInlineParser(), 40) + ->addInlineParser(new CommonMark\Parser\Inline\CloseBracketParser(), 30) + ->addInlineParser(new CommonMark\Parser\Inline\OpenBracketParser(), 20) + ->addInlineParser(new CommonMark\Parser\Inline\BangParser(), 10) + + ->addRenderer(Core\Node\Block\Document::class, $childRenderer, 0) + ->addRenderer(Core\Node\Block\Paragraph::class, $childRenderer, 0) + + ->addRenderer(CommonMark\Node\Inline\Code::class, new CommonMark\Renderer\Inline\CodeRenderer(), 0) + ->addRenderer(CommonMark\Node\Inline\Emphasis::class, new CommonMark\Renderer\Inline\EmphasisRenderer(), 0) + ->addRenderer(CommonMark\Node\Inline\HtmlInline::class, new CommonMark\Renderer\Inline\HtmlInlineRenderer(), 0) + ->addRenderer(CommonMark\Node\Inline\Image::class, new CommonMark\Renderer\Inline\ImageRenderer(), 0) + ->addRenderer(CommonMark\Node\Inline\Link::class, new CommonMark\Renderer\Inline\LinkRenderer(), 0) + ->addRenderer(Core\Node\Inline\Newline::class, new Core\Renderer\Inline\NewlineRenderer(), 0) + ->addRenderer(CommonMark\Node\Inline\Strong::class, new CommonMark\Renderer\Inline\StrongRenderer(), 0) + ->addRenderer(Core\Node\Inline\Text::class, new Core\Renderer\Inline\TextRenderer(), 0) + ; + + if ($environment->getConfiguration()->get('commonmark/use_asterisk')) { + $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('*')); + } + + if ($environment->getConfiguration()->get('commonmark/use_underscore')) { + $environment->addDelimiterProcessor(new EmphasisDelimiterProcessor('_')); + } + } +} diff --git a/tests/functional/Extension/InlinesOnly/InlinesOnlyFunctionalTest.php b/tests/functional/Extension/InlinesOnly/InlinesOnlyFunctionalTest.php new file mode 100644 index 0000000..8b06183 --- /dev/null +++ b/tests/functional/Extension/InlinesOnly/InlinesOnlyFunctionalTest.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace League\CommonMark\Tests\Functional\Extension\InlinesOnly; + +use League\CommonMark\Environment\Environment; +use League\CommonMark\Extension\InlinesOnly\InlinesOnlyExtension; +use League\CommonMark\MarkdownConverter; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; + +/** + * Tests the extension against sample files + */ +final class InlinesOnlyFunctionalTest extends TestCase +{ + private MarkdownConverter $converter; + + protected function setUp(): void + { + $environment = new Environment(); + $environment->addExtension(new InlinesOnlyExtension()); + $this->converter = new MarkdownConverter($environment); + } + + /** + * @dataProvider dataProvider + * + * @param string $markdown Markdown to parse + * @param string $html Expected result + */ + #[DataProvider('dataProvider')] + public function testExample(string $markdown, string $html): void + { + $actualResult = $this->converter->convert($markdown); + + $failureMessage = 'Unexpected result'; + $failureMessage .= "\n=== markdown ===============\n" . $markdown; + $failureMessage .= "\n=== expected ===============\n" . $html; + $failureMessage .= "\n=== got ====================\n" . $actualResult; + + $this->assertEquals($html, $actualResult, $failureMessage); + } + + /** + * @return array> + */ + public static function dataProvider(): array + { + $markdown = \file_get_contents(__DIR__ . '/inlines.md'); + $html = \file_get_contents(__DIR__ . '/inlines.html'); + + return [ + [$markdown, $html], + ]; + } +}