diff options
Diffstat (limited to 'vendor/league/commonmark/src/Extension/Mention/MentionParser.php')
| -rw-r--r-- | vendor/league/commonmark/src/Extension/Mention/MentionParser.php | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/vendor/league/commonmark/src/Extension/Mention/MentionParser.php b/vendor/league/commonmark/src/Extension/Mention/MentionParser.php new file mode 100644 index 0000000000..7609184f7b --- /dev/null +++ b/vendor/league/commonmark/src/Extension/Mention/MentionParser.php @@ -0,0 +1,91 @@ +<?php + +/* + * 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\Extension\Mention; + +use League\CommonMark\Extension\Mention\Generator\CallbackGenerator; +use League\CommonMark\Extension\Mention\Generator\MentionGeneratorInterface; +use League\CommonMark\Extension\Mention\Generator\StringTemplateLinkGenerator; +use League\CommonMark\Inline\Parser\InlineParserInterface; +use League\CommonMark\InlineParserContext; + +final class MentionParser implements InlineParserInterface +{ + /** @var string */ + private $symbol; + + /** @var string */ + private $mentionRegex; + + /** @var MentionGeneratorInterface */ + private $mentionGenerator; + + public function __construct(string $symbol, string $mentionRegex, MentionGeneratorInterface $mentionGenerator) + { + $this->symbol = $symbol; + $this->mentionRegex = $mentionRegex; + $this->mentionGenerator = $mentionGenerator; + } + + public function getCharacters(): array + { + return [$this->symbol]; + } + + public function parse(InlineParserContext $inlineContext): bool + { + $cursor = $inlineContext->getCursor(); + + // The symbol must not have any other characters immediately prior + $previousChar = $cursor->peek(-1); + if ($previousChar !== null && $previousChar !== ' ') { + // peek() doesn't modify the cursor, so no need to restore state first + return false; + } + + // Save the cursor state in case we need to rewind and bail + $previousState = $cursor->saveState(); + + // Advance past the symbol to keep parsing simpler + $cursor->advance(); + + // Parse the mention match value + $identifier = $cursor->match($this->mentionRegex); + if ($identifier === null) { + // Regex failed to match; this isn't a valid mention + $cursor->restoreState($previousState); + + return false; + } + + $mention = $this->mentionGenerator->generateMention(new Mention($this->symbol, $identifier)); + + if ($mention === null) { + $cursor->restoreState($previousState); + + return false; + } + + $inlineContext->getContainer()->appendChild($mention); + + return true; + } + + public static function createWithStringTemplate(string $symbol, string $mentionRegex, string $urlTemplate): MentionParser + { + return new self($symbol, $mentionRegex, new StringTemplateLinkGenerator($urlTemplate)); + } + + public static function createWithCallback(string $symbol, string $mentionRegex, callable $callback): MentionParser + { + return new self($symbol, $mentionRegex, new CallbackGenerator($callback)); + } +} |
