1<?php
2
3declare(strict_types=1);
4
5/*
6 * This file is part of the league/commonmark package.
7 *
8 * (c) Colin O'Dell <colinodell@gmail.com>
9 *
10 * For the full copyright and license information, please view the LICENSE
11 * file that was distributed with this source code.
12 */
13
14namespace League\CommonMark\Extension\Embed;
15
16use League\CommonMark\Parser\Block\BlockStart;
17use League\CommonMark\Parser\Block\BlockStartParserInterface;
18use League\CommonMark\Parser\Cursor;
19use League\CommonMark\Parser\MarkdownParserStateInterface;
20use League\CommonMark\Util\LinkParserHelper;
21
22class EmbedStartParser implements BlockStartParserInterface
23{
24    public function tryStart(Cursor $cursor, MarkdownParserStateInterface $parserState): ?BlockStart
25    {
26        if ($cursor->isIndented() || $parserState->getParagraphContent() !== null || ! ($parserState->getActiveBlockParser()->isContainer())) {
27            return BlockStart::none();
28        }
29
30        // 0-3 leading spaces are okay
31        $cursor->advanceToNextNonSpaceOrTab();
32
33        // The line must begin with "https://"
34        if (! str_starts_with($cursor->getRemainder(), 'https://')) {
35            return BlockStart::none();
36        }
37
38        // A valid link must be found next
39        if (($dest = LinkParserHelper::parseLinkDestination($cursor)) === null) {
40            return BlockStart::none();
41        }
42
43        // Skip any trailing whitespace
44        $cursor->advanceToNextNonSpaceOrTab();
45
46        // We must be at the end of the line; otherwise, this link was not by itself
47        if (! $cursor->isAtEnd()) {
48            return BlockStart::none();
49        }
50
51        return BlockStart::of(new EmbedParser($dest))->at($cursor);
52    }
53}
54