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