* * 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\Mention; use League\CommonMark\Environment\Environment; use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; use League\CommonMark\Extension\CommonMark\Node\Inline\Emphasis; use League\CommonMark\Extension\Mention\Generator\MentionGeneratorInterface; use League\CommonMark\Extension\Mention\Generator\StringTemplateLinkGenerator; use League\CommonMark\Extension\Mention\Mention; use League\CommonMark\Extension\Mention\MentionParser; use League\CommonMark\MarkdownConverter; use League\CommonMark\Node\Inline\Text; use PHPUnit\Framework\TestCase; final class MentionParserTest extends TestCase { public function testMentionParser(): void { $input = 'See #123 for more information.'; $expected = '

See #123 for more information.

'; $mentionParser = new MentionParser('test', '#', '\d+', new StringTemplateLinkGenerator('https://www.example.com/%s')); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserWithMultiCharacterPrefix(): void { $input = 'Try asking u:colinodell about that.'; $expected = '

Try asking u:colinodell about that.

'; $mentionParser = new MentionParser('test', 'u:', '\w+', new StringTemplateLinkGenerator('https://www.example.com/users/%s')); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserWithMultiCharacterPrefixContainingSpecialRegexCharsThatShouldBeEscaped(): void { $input = 'I spend too much time on the /r/php subreddit.'; $expected = '

I spend too much time on the /r/php subreddit.

'; $mentionParser = new MentionParser('test', '/r/', '\w+', new StringTemplateLinkGenerator('https://www.reddit.com/r/%s')); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserWithoutSpaceInFront(): void { $input = 'See#123 for more information.'; $expected = '

See#123 for more information.

'; $mentionParser = new MentionParser('test', '#', '\d+', $this->createMock(MentionGeneratorInterface::class)); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserWithNonMatchingPrefix(): void { $input = 'See #123 for more information.'; $expected = '

See #123 for more information.

'; $mentionParser = new MentionParser('test', '@', '\d+', $this->createMock(MentionGeneratorInterface::class)); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserWithNonMatchingRegex(): void { $input = 'See #123 for more information.'; $expected = '

See #123 for more information.

'; $mentionParser = new MentionParser('test', '#', '[a-z]+', $this->createMock(MentionGeneratorInterface::class)); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserWithNullUrl(): void { $input = 'See #123 for more information.'; $expected = '

See #123 for more information.

'; $returnsNull = $this->createMock(MentionGeneratorInterface::class); $returnsNull->method('generateMention')->willReturn(null); $mentionParser = new MentionParser('test', '#', '\d+', $returnsNull); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserUsingCallback(): void { $callable = static function (Mention $mention) { // Stuff the three params into the URL just to prove we received them all properly $mention->setUrl(\sprintf('https://www.example.com/%s/%s/%s', $mention->getIdentifier(), $mention->getLabel(), $mention->getPrefix())); // Change the label $mention->setLabel('Replaced Label'); return $mention; }; $input = 'This should parse #123.'; $expected = '

This should parse Replaced Label.

'; $mentionParser = MentionParser::createWithCallback('test', '#', '\d+', $callable); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserUsingCallbackReturnsAbstractInline(): void { $callable = static function (Mention $mention) { // Pretend callback does some access logic to determine visibility. $emphasis = new Emphasis('*'); $emphasis->appendChild(new Text('[members only]')); return $emphasis; }; $input = 'This should parse #123.'; $expected = '

This should parse [members only].

'; $mentionParser = MentionParser::createWithCallback('test', '#', '\d+', $callable); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } public function testMentionParserWithNonWordCharacterBefore(): void { $input = "Test\n#123 for more information."; $expected = "

Test\n#123 for more information.

"; $mentionParser = new MentionParser( 'test', '#', '\d+', new StringTemplateLinkGenerator('https://www.example.com/%s') ); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addInlineParser($mentionParser); $converter = new MarkdownConverter($environment); $this->assertEquals($expected, \rtrim((string) $converter->convert($input))); } }