thephpleague /
commonmark
| 1 | <?php |
||
| 2 | |||
| 3 | declare(strict_types=1); |
||
| 4 | |||
| 5 | /* |
||
| 6 | * This file is part of the league/commonmark package. |
||
| 7 | * |
||
| 8 | * (c) Colin O'Dell <[email protected]> |
||
| 9 | * |
||
| 10 | * For the full copyright and license information, please view the LICENSE |
||
| 11 | * file that was distributed with this source code. |
||
| 12 | */ |
||
| 13 | |||
| 14 | namespace League\CommonMark\Extension\HeadingPermalink; |
||
| 15 | |||
| 16 | use League\CommonMark\Environment\EnvironmentAwareInterface; |
||
| 17 | use League\CommonMark\Environment\EnvironmentInterface; |
||
| 18 | use League\CommonMark\Event\DocumentParsedEvent; |
||
| 19 | use League\CommonMark\Extension\CommonMark\Node\Block\Heading; |
||
| 20 | use League\CommonMark\Node\Block\Document; |
||
| 21 | use League\CommonMark\Node\StringContainerHelper; |
||
| 22 | use League\CommonMark\Normalizer\TextNormalizerInterface; |
||
| 23 | use League\Config\ConfigurationInterface; |
||
| 24 | |||
| 25 | /** |
||
| 26 | * Searches the Document for Heading elements and adds HeadingPermalinks to each one |
||
| 27 | */ |
||
| 28 | final class HeadingPermalinkProcessor implements EnvironmentAwareInterface |
||
| 29 | { |
||
| 30 | public const INSERT_BEFORE = 'before'; |
||
| 31 | public const INSERT_AFTER = 'after'; |
||
| 32 | |||
| 33 | /** |
||
| 34 | * @var TextNormalizerInterface |
||
| 35 | * |
||
| 36 | * @psalm-readonly-allow-private-mutation |
||
| 37 | */ |
||
| 38 | private $slugNormalizer; |
||
| 39 | |||
| 40 | /** |
||
| 41 | * @var ConfigurationInterface |
||
| 42 | * |
||
| 43 | * @psalm-readonly-allow-private-mutation |
||
| 44 | */ |
||
| 45 | private $config; |
||
| 46 | |||
| 47 | 87 | public function setEnvironment(EnvironmentInterface $environment): void |
|
| 48 | { |
||
| 49 | 87 | $this->config = $environment->getConfiguration(); |
|
| 50 | 87 | $this->slugNormalizer = $environment->getSlugNormalizer(); |
|
| 51 | 84 | } |
|
| 52 | |||
| 53 | 84 | public function __invoke(DocumentParsedEvent $e): void |
|
| 54 | { |
||
| 55 | 84 | $min = (int) $this->config->get('heading_permalink/min_heading_level'); |
|
| 56 | 84 | $max = (int) $this->config->get('heading_permalink/max_heading_level'); |
|
| 57 | |||
| 58 | 84 | $slugLength = (int) $this->config->get('slug_normalizer/max_length'); |
|
| 59 | |||
| 60 | 84 | $walker = $e->getDocument()->walker(); |
|
| 61 | |||
| 62 | 84 | while ($event = $walker->next()) { |
|
| 63 | 84 | $node = $event->getNode(); |
|
| 64 | 84 | if ($node instanceof Heading && $event->isEntering() && $node->getLevel() >= $min && $node->getLevel() <= $max) { |
|
| 65 | 81 | $this->addHeadingLink($node, $e->getDocument(), $slugLength); |
|
| 66 | } |
||
| 67 | } |
||
| 68 | 84 | } |
|
| 69 | |||
| 70 | 81 | private function addHeadingLink(Heading $heading, Document $document, int $slugLength): void |
|
|
0 ignored issues
–
show
|
|||
| 71 | { |
||
| 72 | 81 | $text = StringContainerHelper::getChildText($heading); |
|
| 73 | 81 | $slug = $this->slugNormalizer->normalize($text, [ |
|
| 74 | 81 | 'node' => $heading, |
|
| 75 | 81 | 'length' => $slugLength, |
|
| 76 | ]); |
||
| 77 | |||
| 78 | 81 | $headingLinkAnchor = new HeadingPermalink($slug); |
|
| 79 | |||
| 80 | 81 | switch ($this->config->get('heading_permalink/insert')) { |
|
| 81 | 81 | case self::INSERT_BEFORE: |
|
| 82 | 72 | $heading->prependChild($headingLinkAnchor); |
|
| 83 | |||
| 84 | 72 | return; |
|
| 85 | 9 | case self::INSERT_AFTER: |
|
| 86 | 9 | $heading->appendChild($headingLinkAnchor); |
|
| 87 | |||
| 88 | 9 | return; |
|
| 89 | default: |
||
| 90 | throw new \RuntimeException("Invalid configuration value for heading_permalink/insert; expected 'before' or 'after'"); |
||
| 91 | } |
||
| 92 | } |
||
| 93 | } |
||
| 94 |
This check looks for parameters that have been defined for a function or method, but which are not used in the method body.