From 93dd07be423bcb9a9f7083269d2be22cda09123d Mon Sep 17 00:00:00 2001 From: alfonsobries Date: Thu, 7 Oct 2021 16:46:30 -0500 Subject: [PATCH 1/5] remove id_prefix on heading_permalink --- src/Providers/CommonMarkServiceProvider.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Providers/CommonMarkServiceProvider.php b/src/Providers/CommonMarkServiceProvider.php index 693e96be0..3fb18f7a2 100644 --- a/src/Providers/CommonMarkServiceProvider.php +++ b/src/Providers/CommonMarkServiceProvider.php @@ -49,15 +49,12 @@ use League\CommonMark\Extension\CommonMark\Renderer\Inline\EmphasisRenderer; use League\CommonMark\Extension\CommonMark\Renderer\Inline\HtmlInlineRenderer; use League\CommonMark\Extension\CommonMark\Renderer\Inline\StrongRenderer; -use League\CommonMark\Extension\ExternalLink\ExternalLinkExtension; -use League\CommonMark\Extension\HeadingPermalink\HeadingPermalinkExtension; use League\CommonMark\MarkdownConverterInterface; use League\CommonMark\Node\Block\Document; use League\CommonMark\Node\Block\Paragraph; use League\CommonMark\Node\Inline\Newline; use League\CommonMark\Node\Inline\Text; use League\CommonMark\Normalizer\SlugNormalizer; -use League\CommonMark\Parser\Block\ParagraphParser; use League\CommonMark\Parser\Inline\NewlineParser; use League\CommonMark\Renderer\Block\DocumentRenderer; use League\CommonMark\Renderer\Block\ParagraphRenderer; @@ -212,7 +209,7 @@ private function registerCommonMarkEnvironment(): void ], 'heading_permalink' => [ 'html_class' => 'heading-permalink', - 'id_prefix' => 'user-content', + 'id_prefix' => '', 'insert' => 'before', 'title' => 'Permalink', 'symbol' => '#', From 6d20c6e83caacd3c27cc6bef6f146493154c8484 Mon Sep 17 00:00:00 2001 From: alfonsobries Date: Thu, 7 Oct 2021 17:03:04 -0500 Subject: [PATCH 2/5] User a custom renderer instead --- .../HeadingPermalinkRenderer.php | 90 +++++++++++++++++++ src/Providers/CommonMarkServiceProvider.php | 5 +- 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php diff --git a/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php new file mode 100644 index 000000000..59dd5cd7c --- /dev/null +++ b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php @@ -0,0 +1,90 @@ +set('name', $slug);` line inside the `render` method. + * Cannot be extended since is declared as final. + */ +final class HeadingPermalinkRenderer implements NodeRendererInterface, XmlNodeRendererInterface, ConfigurationAwareInterface +{ + public const DEFAULT_SYMBOL = '¶'; + + /** @psalm-readonly-allow-private-mutation */ + private ConfigurationInterface $config; + + public function setConfiguration(ConfigurationInterface $configuration): void + { + $this->config = $configuration; + } + + /** + * @param HeadingPermalink $node + * + * {@inheritDoc} + * + * @psalm-suppress MoreSpecificImplementedParamType + */ + public function render(Node $node, ChildNodeRendererInterface $childRenderer): \Stringable + { + HeadingPermalink::assertInstanceOf($node); + + $slug = $node->getSlug(); + + $idPrefix = (string) $this->config->get('heading_permalink/id_prefix'); + if ($idPrefix !== '') { + $idPrefix .= '-'; + } + + $fragmentPrefix = (string) $this->config->get('heading_permalink/fragment_prefix'); + if ($fragmentPrefix !== '') { + $fragmentPrefix .= '-'; + } + + $attrs = $node->data->getData('attributes'); + $attrs->set('id', $idPrefix . $slug); + // $attrs->set('name', $slug); + $attrs->set('href', '#' . $fragmentPrefix . $slug); + $attrs->append('class', $this->config->get('heading_permalink/html_class')); + $attrs->set('aria-hidden', 'true'); + $attrs->set('title', $this->config->get('heading_permalink/title')); + + $symbol = $this->config->get('heading_permalink/symbol'); + \assert(\is_string($symbol)); + + return new HtmlElement('a', $attrs->export(), \htmlspecialchars($symbol), false); + } + + public function getXmlTagName(Node $node): string + { + return 'heading_permalink'; + } + + /** + * @param HeadingPermalink $node + * + * @return array + * + * @psalm-suppress MoreSpecificImplementedParamType + */ + public function getXmlAttributes(Node $node): array + { + HeadingPermalink::assertInstanceOf($node); + + return [ + 'slug' => $node->getSlug(), + ]; + } +} diff --git a/src/Providers/CommonMarkServiceProvider.php b/src/Providers/CommonMarkServiceProvider.php index 3fb18f7a2..c7a9055f6 100644 --- a/src/Providers/CommonMarkServiceProvider.php +++ b/src/Providers/CommonMarkServiceProvider.php @@ -4,6 +4,7 @@ namespace ARKEcosystem\Foundation\Providers; +use ARKEcosystem\Foundation\CommonMark\Extensions\HeadingPermalink\HeadingPermalinkRenderer; use ARKEcosystem\Foundation\CommonMark\Extensions\Highlighter\FencedCodeRenderer; use ARKEcosystem\Foundation\CommonMark\Extensions\Highlighter\IndentedCodeRenderer; use ARKEcosystem\Foundation\CommonMark\Extensions\Image\ImageRenderer; @@ -49,6 +50,7 @@ use League\CommonMark\Extension\CommonMark\Renderer\Inline\EmphasisRenderer; use League\CommonMark\Extension\CommonMark\Renderer\Inline\HtmlInlineRenderer; use League\CommonMark\Extension\CommonMark\Renderer\Inline\StrongRenderer; +use League\CommonMark\Extension\HeadingPermalink\HeadingPermalink; use League\CommonMark\MarkdownConverterInterface; use League\CommonMark\Node\Block\Document; use League\CommonMark\Node\Block\Paragraph; @@ -140,6 +142,7 @@ private function registerCommonMarkEnvironment(): void $environment = app(MarkdownConverterInterface::class)->getEnvironment(); $environment->addRenderer(FencedCode::class, new FencedCodeRenderer()); + $environment->addRenderer(HeadingPermalink::class, new HeadingPermalinkRenderer()); $environment->addBlockStartParser(new BlockQuoteStartParser(), 70); $environment->addBlockStartParser(new HeadingStartParser(), 60); @@ -209,7 +212,7 @@ private function registerCommonMarkEnvironment(): void ], 'heading_permalink' => [ 'html_class' => 'heading-permalink', - 'id_prefix' => '', + 'id_prefix' => 'user-content', 'insert' => 'before', 'title' => 'Permalink', 'symbol' => '#', From 8a3267421e186684d2327d1bbf6b781477cc033e Mon Sep 17 00:00:00 2001 From: alfonsobries Date: Thu, 7 Oct 2021 17:14:22 -0500 Subject: [PATCH 3/5] Update HeadingPermalinkRenderer.php --- .../HeadingPermalinkRenderer.php | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php index 59dd5cd7c..466d8beaf 100644 --- a/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php +++ b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php @@ -22,7 +22,6 @@ final class HeadingPermalinkRenderer implements NodeRendererInterface, XmlNodeRe { public const DEFAULT_SYMBOL = '¶'; - /** @psalm-readonly-allow-private-mutation */ private ConfigurationInterface $config; public function setConfiguration(ConfigurationInterface $configuration): void @@ -30,13 +29,6 @@ public function setConfiguration(ConfigurationInterface $configuration): void $this->config = $configuration; } - /** - * @param HeadingPermalink $node - * - * {@inheritDoc} - * - * @psalm-suppress MoreSpecificImplementedParamType - */ public function render(Node $node, ChildNodeRendererInterface $childRenderer): \Stringable { HeadingPermalink::assertInstanceOf($node); @@ -55,7 +47,7 @@ public function render(Node $node, ChildNodeRendererInterface $childRenderer): \ $attrs = $node->data->getData('attributes'); $attrs->set('id', $idPrefix . $slug); - // $attrs->set('name', $slug); + $attrs->set('name', $slug); $attrs->set('href', '#' . $fragmentPrefix . $slug); $attrs->append('class', $this->config->get('heading_permalink/html_class')); $attrs->set('aria-hidden', 'true'); @@ -72,13 +64,6 @@ public function getXmlTagName(Node $node): string return 'heading_permalink'; } - /** - * @param HeadingPermalink $node - * - * @return array - * - * @psalm-suppress MoreSpecificImplementedParamType - */ public function getXmlAttributes(Node $node): array { HeadingPermalink::assertInstanceOf($node); From eec8d26fcb1be661d10a690516447921e4b59233 Mon Sep 17 00:00:00 2001 From: alfonsobries Date: Thu, 7 Oct 2021 17:22:40 -0500 Subject: [PATCH 4/5] Update HeadingPermalinkRenderer.php --- .../Extensions/HeadingPermalink/HeadingPermalinkRenderer.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php index 466d8beaf..7c1e24710 100644 --- a/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php +++ b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php @@ -47,6 +47,8 @@ public function render(Node $node, ChildNodeRendererInterface $childRenderer): \ $attrs = $node->data->getData('attributes'); $attrs->set('id', $idPrefix . $slug); + // This line is the only difference against the original `league/commonmark` + // renderer $attrs->set('name', $slug); $attrs->set('href', '#' . $fragmentPrefix . $slug); $attrs->append('class', $this->config->get('heading_permalink/html_class')); From 0f6a67208aaf82cf386e8db99660b1128f24cea7 Mon Sep 17 00:00:00 2001 From: alfonsobries Date: Thu, 7 Oct 2021 17:23:29 -0500 Subject: [PATCH 5/5] Update HeadingPermalinkRenderer.php --- .../Extensions/HeadingPermalink/HeadingPermalinkRenderer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php index 7c1e24710..74ef9dca6 100644 --- a/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php +++ b/src/CommonMark/Extensions/HeadingPermalink/HeadingPermalinkRenderer.php @@ -47,7 +47,7 @@ public function render(Node $node, ChildNodeRendererInterface $childRenderer): \ $attrs = $node->data->getData('attributes'); $attrs->set('id', $idPrefix . $slug); - // This line is the only difference against the original `league/commonmark` + // This line is the only difference from the original `league/commonmark` // renderer $attrs->set('name', $slug); $attrs->set('href', '#' . $fragmentPrefix . $slug);