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\Footnote;
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 FootnoteRenderer implements NodeRendererInterface, XmlNodeRendererInterface, ConfigurationAwareInterface
27{
28    private ConfigurationInterface $config;
29
30    /**
31     * @param Footnote $node
32     *
33     * {@inheritDoc}
34     *
35     * @psalm-suppress MoreSpecificImplementedParamType
36     */
37    public function render(Node $node, ChildNodeRendererInterface $childRenderer): \Stringable
38    {
39        Footnote::assertInstanceOf($node);
40
41        $attrs = $node->data->getData('attributes');
42
43        $attrs->append('class', $this->config->get('footnote/footnote_class'));
44        $attrs->set('id', $this->config->get('footnote/footnote_id_prefix') . \mb_strtolower($node->getReference()->getLabel(), 'UTF-8'));
45        $attrs->set('role', 'doc-endnote');
46
47        return new HtmlElement(
48            'li',
49            $attrs->export(),
50            $childRenderer->renderNodes($node->children()),
51            true
52        );
53    }
54
55    public function setConfiguration(ConfigurationInterface $configuration): void
56    {
57        $this->config = $configuration;
58    }
59
60    public function getXmlTagName(Node $node): string
61    {
62        return 'footnote';
63    }
64
65    /**
66     * @param Footnote $node
67     *
68     * @return array<string, scalar>
69     *
70     * @psalm-suppress MoreSpecificImplementedParamType
71     */
72    public function getXmlAttributes(Node $node): array
73    {
74        Footnote::assertInstanceOf($node);
75
76        return [
77            'reference' => $node->getReference()->getLabel(),
78        ];
79    }
80}
81