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\FrontMatter;
15
16use League\CommonMark\Environment\EnvironmentBuilderInterface;
17use League\CommonMark\Event\DocumentPreParsedEvent;
18use League\CommonMark\Event\DocumentRenderedEvent;
19use League\CommonMark\Extension\ExtensionInterface;
20use League\CommonMark\Extension\FrontMatter\Data\FrontMatterDataParserInterface;
21use League\CommonMark\Extension\FrontMatter\Data\LibYamlFrontMatterParser;
22use League\CommonMark\Extension\FrontMatter\Data\SymfonyYamlFrontMatterParser;
23use League\CommonMark\Extension\FrontMatter\Listener\FrontMatterPostRenderListener;
24use League\CommonMark\Extension\FrontMatter\Listener\FrontMatterPreParser;
25
26final class FrontMatterExtension implements ExtensionInterface
27{
28    /** @psalm-readonly */
29    private FrontMatterParserInterface $frontMatterParser;
30
31    public function __construct(?FrontMatterDataParserInterface $dataParser = null)
32    {
33        $this->frontMatterParser = new FrontMatterParser($dataParser ?? LibYamlFrontMatterParser::capable() ?? new SymfonyYamlFrontMatterParser());
34    }
35
36    public function getFrontMatterParser(): FrontMatterParserInterface
37    {
38        return $this->frontMatterParser;
39    }
40
41    public function register(EnvironmentBuilderInterface $environment): void
42    {
43        $environment->addEventListener(DocumentPreParsedEvent::class, new FrontMatterPreParser($this->frontMatterParser));
44        $environment->addEventListener(DocumentRenderedEvent::class, new FrontMatterPostRenderListener(), -500);
45    }
46}
47