diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesAttributeProvider.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesAttributeProvider.java index 6e593aff1e..24527558ad 100644 --- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesAttributeProvider.java +++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesAttributeProvider.java @@ -58,7 +58,9 @@ public void setAttributes(@NotNull Node node, @NotNull AttributablePart part, @N attributes.addValue(CLASS_ATTR, attributeNode.getValue()); } else if (attributeNode.isId()) { if (node instanceof AnchorRefTarget) { - // was already provided via setAnchorRefId + // was already provided via setAnchorRefId, we only have to read it + attributes.remove(Attribute.ID_ATTR); + attributes.addValue(Attribute.ID_ATTR, ((AnchorRefTarget) node).getAnchorRefId()); } else { attributes.remove(Attribute.ID_ATTR); attributes.addValue(Attribute.ID_ATTR, attributeNode.getValue()); diff --git a/flexmark-ext-attributes/src/test/java/com/vladsch/flexmark/ext/attributes/HtmlRendererHeadingIdsTest.java b/flexmark-ext-attributes/src/test/java/com/vladsch/flexmark/ext/attributes/HtmlRendererHeadingIdsTest.java new file mode 100644 index 0000000000..0708022460 --- /dev/null +++ b/flexmark-ext-attributes/src/test/java/com/vladsch/flexmark/ext/attributes/HtmlRendererHeadingIdsTest.java @@ -0,0 +1,80 @@ +package com.vladsch.flexmark.ext.attributes; + +import com.vladsch.flexmark.ast.Heading; +import com.vladsch.flexmark.ast.Text; +import com.vladsch.flexmark.html.HtmlRenderer; +import com.vladsch.flexmark.parser.Parser; +import com.vladsch.flexmark.util.ast.Node; +import com.vladsch.flexmark.util.data.MutableDataSet; +import org.junit.Test; + +import java.io.IOException; +import java.util.Arrays; + +import static org.junit.Assert.*; + +public class HtmlRendererHeadingIdsTest { + + @Test + public void parserShouldReadHeadingIdsFromMarkdown() throws IOException { + String title = "Heading with ID"; + String id = "heading-id-1"; + String markdownSource = "# " + title + " {#" + id + "}"; + Node parsed = parse(markdownSource); + + assertTrue(parsed.hasChildren()); + Node heading = parsed.getFirstChild(); + assertEquals(Heading.class, heading.getClass()); + assertEquals(id, ((Heading) heading).getAnchorRefId()); + assertTrue(((Heading) heading).isExplicitAnchorRefId()); + assertTrue(heading.hasChildren()); + + Node headingText = heading.getFirstChild(); + assertEquals(Text.class, headingText.getClass()); + assertEquals(title, headingText.getChars().toString()); + + Node headingAttributes = headingText.getNext(); + assertEquals(AttributesNode.class, headingAttributes.getClass()); + assertEquals("#" + id, ((AttributesNode) headingAttributes).getText().toString()); + assertTrue(headingAttributes.hasChildren()); + + Node headingId = headingAttributes.getFirstChild(); + assertEquals(AttributeNode.class, headingId.getClass()); + assertEquals(id, ((AttributeNode) headingId).getValue().toString()); + assertFalse(headingId.hasChildren()); + } + + @Test + public void headingWithoutIdShouldNotGetGeneratedIdInHtml() { + String markdownSource = "# Heading without ID"; + Node parsed = parse(markdownSource); + String rendered = createRendererNotGeneratingButRenderingIds().render(parsed); + assertEquals("