This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-doxia.git


The following commit(s) were added to refs/heads/master by this push:
     new 48166bc1 Support "name" attribute in "a" element still in XHTML5
48166bc1 is described below

commit 48166bc1857a09cd70257301408ec453b1060356
Author: Konrad Windszus <[email protected]>
AuthorDate: Tue Feb 10 20:27:20 2026 +0100

    Support "name" attribute in "a" element still in XHTML5
    
    This is also suggested by
    https://www.w3.org/TR/html5-diff/#obsolete-attributes:
    
    "The following attributes are allowed...:
    ... The name attribute on a."
    
    and https://html.spec.whatwg.org/#obsolete-but-conforming-features
    
    "Authors should not specify the name attribute on a elements. If the
    attribute is present, its value must not be the empty string and must
    neither be equal to the value of any of the IDs in the element's tree
    other than the element's own ID, if any, nor be equal to the value of
    any of the other name attributes on a elements in the element's tree. If
    this attribute is present and the element has an ID, then the
    attribute's value must be equal to the element's ID. In earlier versions
    of the language, this attribute was intended as a way to specify
    possible targets for fragments in URLs. The id attribute should be used
    instead."
    
    This closes #1020
---
 .../maven/doxia/parser/Xhtml1BaseParser.java       |  2 ++
 .../maven/doxia/parser/Xhtml5BaseParser.java       |  5 ++++
 .../maven/doxia/parser/AbstractParserTest.java     | 31 ++++++++++++++++++++++
 .../maven/doxia/parser/Xhtml5BaseParserTest.java   | 12 +++++++++
 .../doxia/module/markdown/MarkdownParserTest.java  | 29 +++++++-------------
 5 files changed, 60 insertions(+), 19 deletions(-)

diff --git 
a/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml1BaseParser.java 
b/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml1BaseParser.java
index a915c812..860f96f4 100644
--- 
a/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml1BaseParser.java
+++ 
b/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml1BaseParser.java
@@ -118,6 +118,8 @@ public class Xhtml1BaseParser extends Xhtml5BaseParser {
     private static final Map<String, String> ELEMENT_MAPPING_TABLE = new 
HashMap<>();
 
     static {
+        // although obsolete attribute "name" is still allowed, however 
strongly recommended to be replaced by "id"
+        // (https://www.w3.org/TR/html5-diff/#obsolete-attributes)
         ATTRIBUTE_MAPPING_TABLE.put(
                 "a", Collections.singleton(new AttributeMapping("name", "id", 
AttributeMapping.MergeSemantics.IGNORE)));
 
diff --git 
a/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml5BaseParser.java 
b/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml5BaseParser.java
index 31232f9f..dbfed392 100644
--- 
a/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml5BaseParser.java
+++ 
b/doxia-core/src/main/java/org/apache/maven/doxia/parser/Xhtml5BaseParser.java
@@ -826,6 +826,11 @@ public class Xhtml5BaseParser extends AbstractXmlParser 
implements HtmlMarkup {
             isLink = true;
         } else {
             String id = (String) attribs.getAttribute(Attribute.ID.toString());
+            if (id == null) {
+                // although the "name" attribute is obsolete in HTML5, it is 
still allowed
+                // (https://www.w3.org/TR/html5-diff/#obsolete-attributes)
+                id = (String) attribs.getAttribute(Attribute.NAME.toString());
+            }
             if (id != null) {
                 sink.anchor(validAnchor(id), attribs);
                 isAnchor = true;
diff --git 
a/doxia-core/src/test/java/org/apache/maven/doxia/parser/AbstractParserTest.java
 
b/doxia-core/src/test/java/org/apache/maven/doxia/parser/AbstractParserTest.java
index d90ee119..26bfa9c5 100644
--- 
a/doxia-core/src/test/java/org/apache/maven/doxia/parser/AbstractParserTest.java
+++ 
b/doxia-core/src/test/java/org/apache/maven/doxia/parser/AbstractParserTest.java
@@ -249,6 +249,37 @@ public abstract class AbstractParserTest extends 
AbstractModuleTest {
         assertEventSuffix(it);
     }
 
+    /**
+     * Parse the file and return a {@link SinkEventTestingSink}.
+     *
+     * @param file the file to parse with {@link #parser}
+     * @return a sink to test parsing events
+     * @throws ParseException if the document parsing failed
+     * @throws IOException if an I/O error occurs while closing test reader
+     */
+    protected SinkEventTestingSink parseFileToEventTestingSink(String file) 
throws ParseException, IOException {
+        SinkEventTestingSink sink;
+        try (Reader reader = getTestReader(file)) {
+            sink = new SinkEventTestingSink();
+            createParser().parse(reader, sink);
+        }
+        return sink;
+    }
+
+    /**
+     * Parse the text and return a {@link SinkEventTestingSink}.
+     *
+     * @param file the file to parse with {@link #parser}
+     * @return a sink to test parsing events
+     * @throws ParseException if the document parsing failed
+     */
+    protected SinkEventTestingSink parseSourceToEventTestingSink(String text) 
throws ParseException {
+        SinkEventTestingSink sink;
+        sink = new SinkEventTestingSink();
+        createParser().parse(text, sink);
+        return sink;
+    }
+
     public static void assertSinkEquals(SinkEventElement element, String name, 
Object... args) {
         assertEquals(name, element.getName(), "Name of element doesn't match");
         assertArrayEquals(args, element.getArgs(), "Arguments don't match");
diff --git 
a/doxia-core/src/test/java/org/apache/maven/doxia/parser/Xhtml5BaseParserTest.java
 
b/doxia-core/src/test/java/org/apache/maven/doxia/parser/Xhtml5BaseParserTest.java
index 5ea893a6..1777e648 100644
--- 
a/doxia-core/src/test/java/org/apache/maven/doxia/parser/Xhtml5BaseParserTest.java
+++ 
b/doxia-core/src/test/java/org/apache/maven/doxia/parser/Xhtml5BaseParserTest.java
@@ -942,4 +942,16 @@ class Xhtml5BaseParserTest extends AbstractParserTest {
     protected String getVerbatimCodeSource() {
         return "<pre><code>&lt;&gt;{}=#*</code></pre>";
     }
+
+    @Test
+    void anchorWithName() throws ParseException {
+        String text = "<a name=\"test\"></a>";
+
+        parser.parse(text, sink);
+
+        Iterator<SinkEventElement> it = sink.getEventList().iterator();
+        // first attribute is the id, second is all given attributes
+        assertSinkEquals(it.next(), "anchor", "test", new 
SinkEventAttributeSet("name", "test"));
+        assertSinkEquals(it, "anchor_");
+    }
 }
diff --git 
a/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java
 
b/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java
index 5d644616..1fad1a69 100644
--- 
a/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java
+++ 
b/doxia-modules/doxia-module-markdown/src/test/java/org/apache/maven/doxia/module/markdown/MarkdownParserTest.java
@@ -32,7 +32,6 @@ import org.apache.maven.doxia.parser.ParseException;
 import org.apache.maven.doxia.sink.SinkEventAttributes;
 import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
 import org.apache.maven.doxia.sink.impl.SinkEventElement;
-import org.apache.maven.doxia.sink.impl.SinkEventTestingSink;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -651,24 +650,6 @@ class MarkdownParserTest extends AbstractParserTest {
         assertFalse(it.hasNext());
     }
 
-    /**
-     * Parse the file and return a {@link SinkEventTestingSink}.
-     *
-     * @param file the file to parse with {@link #parser}
-     * @return a sink to test parsing events
-     * @throws ParseException if the document parsing failed
-     * @throws IOException if an I/O error occurs while closing test reader
-     */
-    protected SinkEventTestingSink parseFileToEventTestingSink(String file) 
throws ParseException, IOException {
-        SinkEventTestingSink sink;
-        try (Reader reader = getTestReader(file)) {
-            sink = new SinkEventTestingSink();
-            parser.parse(reader, sink);
-        }
-
-        return sink;
-    }
-
     protected String parseFileToHtml(String file) throws ParseException, 
IOException {
         try (Reader reader = getTestReader(file)) {
             return parser.toXhtml(reader).toString();
@@ -897,4 +878,14 @@ class MarkdownParserTest extends AbstractParserTest {
     protected String getVerbatimCodeSource() {
         return "```" + EOL + "<>{}=#*" + EOL + "```";
     }
+
+    @Test
+    void anchorWithName() throws ParseException {
+        Iterator<SinkEventElement> eventIterator = 
parseSourceToEventTestingSink("<a name=\"my-anchor\">test</a>")
+                .getEventList()
+                .iterator();
+        assertEventPrefix(eventIterator);
+        assertSinkStartsWith(eventIterator, "paragraph", "anchor", "text", 
"anchor_", "paragraph_");
+        assertEventSuffix(eventIterator);
+    }
 }

Reply via email to