|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace App\Markdown; |
| 4 | + |
| 5 | +use InvalidArgumentException; |
| 6 | +use League\CommonMark\Extension\CommonMark\Node\Inline\Link; |
| 7 | +use League\CommonMark\Extension\CommonMark\Renderer\Inline\LinkRenderer as InlineLinkRenderer; |
| 8 | +use League\CommonMark\Node\Node; |
| 9 | +use League\CommonMark\Renderer\ChildNodeRendererInterface; |
| 10 | +use League\CommonMark\Renderer\NodeRendererInterface; |
| 11 | +use League\CommonMark\Xml\XmlNodeRendererInterface; |
| 12 | +use League\Config\ConfigurationAwareInterface; |
| 13 | +use League\Config\ConfigurationInterface; |
| 14 | +use Tempest\Support\Regex; |
| 15 | + |
| 16 | +final class LinkRenderer implements NodeRendererInterface, XmlNodeRendererInterface, ConfigurationAwareInterface |
| 17 | +{ |
| 18 | + private ConfigurationInterface $config; |
| 19 | + |
| 20 | + public function render(Node $node, ChildNodeRendererInterface $childRenderer): \Stringable |
| 21 | + { |
| 22 | + if (! ($node instanceof Link)) { |
| 23 | + throw new InvalidArgumentException('Node must be instance of ' . Link::class); |
| 24 | + } |
| 25 | + |
| 26 | + // Replace .md at the end, before a / or a # |
| 27 | + $node->setUrl( |
| 28 | + Regex\replace($node->getUrl(), '/\.md((?=[\/#?])|$)/', '') |
| 29 | + ); |
| 30 | + |
| 31 | + $renderer = new InlineLinkRenderer; |
| 32 | + $renderer->setConfiguration($this->config); |
| 33 | + |
| 34 | + return $renderer->render($node, $childRenderer); |
| 35 | + } |
| 36 | + |
| 37 | + public function setConfiguration(ConfigurationInterface $configuration): void |
| 38 | + { |
| 39 | + $this->config = $configuration; |
| 40 | + } |
| 41 | + |
| 42 | + public function getXmlTagName(Node $node): string |
| 43 | + { |
| 44 | + return 'link'; |
| 45 | + } |
| 46 | + |
| 47 | + public function getXmlAttributes(Node $node): array |
| 48 | + { |
| 49 | + if (! ($node instanceof Link)) { |
| 50 | + throw new InvalidArgumentException('Node must be instance of ' . Link::class); |
| 51 | + } |
| 52 | + |
| 53 | + return [ |
| 54 | + 'destination' => $node->getUrl(), |
| 55 | + 'title' => $node->getTitle() ?? '', |
| 56 | + ]; |
| 57 | + } |
| 58 | +} |
0 commit comments