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\Renderer;
16
17use League\CommonMark\Extension\Footnote\Node\FootnoteContainer;
18use League\CommonMark\Node\Node;
19use League\CommonMark\Renderer\ChildNodeRendererInterface;
20use League\CommonMark\Renderer\NodeRendererInterface;
21use League\CommonMark\Util\HtmlElement;
22use League\CommonMark\Xml\XmlNodeRendererInterface;
23use League\Config\ConfigurationAwareInterface;
24use League\Config\ConfigurationInterface;
25
26final class FootnoteContainerRenderer implements NodeRendererInterface, XmlNodeRendererInterface, ConfigurationAwareInterface
27{
28    private ConfigurationInterface $config;
29
30    /**
31     * @param FootnoteContainer $node
32     *
33     * {@inheritDoc}
34     *
35     * @psalm-suppress MoreSpecificImplementedParamType
36     */
37    public function render(Node $node, ChildNodeRendererInterface $childRenderer): \Stringable
38    {
39        FootnoteContainer::assertInstanceOf($node);
40
41        $attrs = $node->data->getData('attributes');
42
43        $attrs->append('class', $this->config->get('footnote/container_class'));
44        $attrs->set('role', 'doc-endnotes');
45
46        $contents = new HtmlElement('ol', [], $childRenderer->renderNodes($node->children()));
47        if ($this->config->get('footnote/container_add_hr')) {
48            $contents = [new HtmlElement('hr', [], null, true), $contents];
49        }
50
51        return new HtmlElement('div', $attrs->export(), $contents);
52    }
53
54    public function setConfiguration(ConfigurationInterface $configuration): void
55    {
56        $this->config = $configuration;
57    }
58
59    public function getXmlTagName(Node $node): string
60    {
61        return 'footnote_container';
62    }
63
64    /**
65     * @return array<string, scalar>
66     */
67    public function getXmlAttributes(Node $node): array
68    {
69        return [];
70    }
71}
72