| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- <?php
- declare(strict_types=1);
- /*
- * This file is part of the league/commonmark package.
- *
- * (c) Colin O'Dell <colinodell@gmail.com>
- *
- * 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 = '<p>See <a href="https://www.example.com/123">#123</a> for more information.</p>';
- $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 = '<p>Try asking <a href="https://www.example.com/users/colinodell">u:colinodell</a> about that.</p>';
- $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 = '<p>I spend too much time on the <a href="https://www.reddit.com/r/php">/r/php</a> subreddit.</p>';
- $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 = '<p>See#123 for more information.</p>';
- $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 = '<p>See #123 for more information.</p>';
- $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 = '<p>See #123 for more information.</p>';
- $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 = '<p>See #123 for more information.</p>';
- $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 = '<p>This should parse <a href="https://www.example.com/123/#123/#">Replaced Label</a>.</p>';
- $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 = '<p>This should parse <em>[members only]</em>.</p>';
- $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 = "<p>Test\n<a href=\"https://www.example.com/123\">#123</a> for more information.</p>";
- $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)));
- }
- }
|