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