1<?php
2
3/*
4 * This file is part of the league/commonmark package.
5 *
6 * (c) Colin O'Dell <colinodell@gmail.com>
7 * (c) Rezo Zero / Ambroise Maupate
8 *
9 * For the full copyright and license information, please view the LICENSE
10 * file that was distributed with this source code.
11 */
12
13declare(strict_types=1);
14
15namespace League\CommonMark\Extension\Footnote\Parser;
16
17use League\CommonMark\Parser\Block\BlockStart;
18use League\CommonMark\Parser\Block\BlockStartParserInterface;
19use League\CommonMark\Parser\Cursor;
20use League\CommonMark\Parser\MarkdownParserStateInterface;
21use League\CommonMark\Reference\Reference;
22use League\CommonMark\Util\RegexHelper;
23
24final class FootnoteStartParser implements BlockStartParserInterface
25{
26    public function tryStart(Cursor $cursor, MarkdownParserStateInterface $parserState): ?BlockStart
27    {
28        if ($cursor->isIndented() || $parserState->getLastMatchedBlockParser()->canHaveLazyContinuationLines()) {
29            return BlockStart::none();
30        }
31
32        $match = RegexHelper::matchFirst(
33            '/^\[\^([^\s^\]]+)\]\:(?:\s|$)/',
34            $cursor->getLine(),
35            $cursor->getNextNonSpacePosition()
36        );
37
38        if (! $match) {
39            return BlockStart::none();
40        }
41
42        $cursor->advanceToNextNonSpaceOrTab();
43        $cursor->advanceBy(\strlen($match[0]));
44        $str = $cursor->getRemainder();
45        \preg_replace('/^\[\^([^\s^\]]+)\]\:(?:\s|$)/', '', $str);
46
47        if (\preg_match('/^\[\^([^\s^\]]+)\]\:(?:\s|$)/', $match[0], $matches) !== 1) {
48            return BlockStart::none();
49        }
50
51        $reference      = new Reference($matches[1], $matches[1], $matches[1]);
52        $footnoteParser = new FootnoteParser($reference);
53
54        return BlockStart::of($footnoteParser)->at($cursor);
55    }
56}
57