From d1877e41f9cffa3aad9eee90ca48f548a4a22e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Fornal?= <24961583+Florian3k@users.noreply.github.com> Date: Sat, 15 Mar 2025 17:45:13 +0100 Subject: [PATCH] Scaladoc: fix generation of unique header ids (#22779) This PR fixes the generation of unique header id's. Previously, the id's were deduplicated globally, now they are deduplicated only within one page. Custom logic for that was removed, we now rely on `HeaderIdGenerator` from flexmark. [Cherry-picked 8734fbd664c8f91a3845925fa27c5a87cb8d98b1] --- .../markdown/SectionRenderingExtension.scala | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/comments/markdown/SectionRenderingExtension.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/comments/markdown/SectionRenderingExtension.scala index f2b2546c11ad..072591ea57bc 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/comments/markdown/SectionRenderingExtension.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/comments/markdown/SectionRenderingExtension.scala @@ -26,21 +26,17 @@ object SectionRenderingExtension extends HtmlRenderer.HtmlRendererExtension: def rendererOptions(opt: MutableDataHolder): Unit = () case class AnchorLink(link: String) extends BlankLine(BasedSequence.EmptyBasedSequence()) - object SectionHandler extends CustomNodeRenderer[Section]: - val repeatedIds: mutable.Map[(NodeRendererContext, String), Int] = mutable.Map() + class SectionHandler extends CustomNodeRenderer[Section]: val idGenerator = new HeaderIdGenerator.Factory().create() + idGenerator.setResolveDupes(true) override def render(node: Section, c: NodeRendererContext, html: HtmlWriter): Unit = val Section(header, body) = node - val headerText = header.getText.toString - val idSuffix = repeatedIds.getOrElseUpdate((c, headerText), 0) - val ifSuffixStr = if(idSuffix == 0) then "" else idSuffix.toString - repeatedIds.update((c, headerText), idSuffix + 1) /* #19524 flexmark's `HeaderIdGenerator` does not appear to be thread-safe, * so we protect its usage with a full `synchronize`. */ val id = idGenerator.synchronized { - idGenerator.getId(headerText + ifSuffixStr) + idGenerator.getId(header.getText) } val anchor = AnchorLink(s"#$id") @@ -68,13 +64,12 @@ object SectionRenderingExtension extends HtmlRenderer.HtmlRendererExtension: object Render extends NodeRenderer: override def getNodeRenderingHandlers: JSet[NodeRenderingHandler[_]] = JSet( - new NodeRenderingHandler(classOf[Section], SectionHandler), + new NodeRenderingHandler(classOf[Section], new SectionHandler), new NodeRenderingHandler(classOf[AnchorLink], AnchorLinkHandler) ) object Factory extends NodeRendererFactory: override def apply(options: DataHolder): NodeRenderer = Render - def extend(htmlRendererBuilder: HtmlRenderer.Builder, tpe: String): Unit = htmlRendererBuilder.nodeRendererFactory(Factory)