This is an automated email from the ASF dual-hosted git repository. michaelo pushed a commit to branch DOXIASITETOOLS-332 in repository https://gitbox.apache.org/repos/asf/maven-doxia-sitetools.git
commit 4b8f3031662147861efd798090c83918f927f456 Author: Michael Osipov <micha...@apache.org> AuthorDate: Fri Mar 8 16:22:52 2024 +0100 [DOXIASITETOOLS-332] Create anchors for indexable entries automatically This closes #139 --- .../doxia/siterenderer/DefaultSiteRenderer.java | 1 + .../maven/doxia/siterenderer/AptVerifier.java | 9 ++++ .../doxia/siterenderer/AttributesVerifier.java | 21 +++++++++ .../maven/doxia/siterenderer/EntitiesVerifier.java | 54 +++++++++++++++------- .../doxia/siterenderer/JavascriptVerifier.java | 4 ++ .../doxia/siterenderer/MultipleBlockVerifier.java | 4 ++ .../doxia/siterenderer/NestedItemsVerifier.java | 36 +++++++++------ .../resources/site-validate/xdoc/entityTest.xml | 10 ++-- .../src/test/resources/site/xdoc/macro.xml | 6 +-- .../src/test/resources/site/xdoc/nestedItems.xml | 6 +-- 10 files changed, 110 insertions(+), 41 deletions(-) diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java index 9c532ac..3c4ccc8 100644 --- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java +++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java @@ -322,6 +322,7 @@ public class DefaultSiteRenderer implements Renderer { Parser parser = doxia.getParser(docRenderingContext.getParserId()); // DOXIASITETOOLS-146 don't render comments from source markup parser.setEmitComments(false); + parser.setEmitAnchorsForIndexableEntries(true); // TODO: DOXIA-111: the filter used here must be checked generally. if (docRenderingContext.getAttribute("velocity") != null) { diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java index e9e1762..87584ab 100644 --- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java +++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java @@ -59,6 +59,9 @@ public class AptVerifier extends AbstractVerifier { HtmlSection section = (HtmlSection) elementIterator.next(); + HtmlAnchor anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Links", anchor.getAttribute("id")); HtmlHeading1 h1 = (HtmlHeading1) elementIterator.next(); assertNotNull(h1); assertEquals("Links", h1.asNormalizedText().trim()); @@ -101,6 +104,9 @@ public class AptVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Section_formatting.3A_italic_bold_mono", anchor.getAttribute("id")); h1 = (HtmlHeading1) elementIterator.next(); assertNotNull(h1); // Note: htmlunit strips the white space, actual result is ok @@ -122,6 +128,9 @@ public class AptVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("SubSection_formatting.3A_italic_bold_mono", anchor.getAttribute("id")); HtmlHeading2 h2 = (HtmlHeading2) elementIterator.next(); assertNotNull(h2); // Note: htmlunit strips the white space, actual result is ok diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AttributesVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AttributesVerifier.java index 4916a2b..1672cd6 100644 --- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AttributesVerifier.java +++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AttributesVerifier.java @@ -71,6 +71,9 @@ public class AttributesVerifier extends AbstractVerifier { HtmlSection section = (HtmlSection) elementIterator.next(); + HtmlAnchor anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("section", anchor.getAttribute("id")); HtmlHeading1 h1 = (HtmlHeading1) elementIterator.next(); assertNotNull(h1); assertEquals("section", h1.asNormalizedText().trim()); @@ -186,22 +189,34 @@ public class AttributesVerifier extends AbstractVerifier { assertEquals("pretty", pre.getAttribute("id")); section = (HtmlSection) elementIterator.next(); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Section_without_id", anchor.getAttribute("id")); h1 = (HtmlHeading1) elementIterator.next(); assertEquals("Section without id", h1.asNormalizedText().trim()); section = (HtmlSection) elementIterator.next(); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Subsection_without_id", anchor.getAttribute("id")); HtmlHeading2 h2 = (HtmlHeading2) elementIterator.next(); assertEquals("Subsection without id", h2.asNormalizedText().trim()); a = (HtmlAnchor) elementIterator.next(); assertEquals("section-id", a.getAttribute("id")); section = (HtmlSection) elementIterator.next(); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Section_with_id", anchor.getAttribute("id")); h1 = (HtmlHeading1) elementIterator.next(); assertEquals("Section with id", h1.asNormalizedText().trim()); a = (HtmlAnchor) elementIterator.next(); assertEquals("subsection-id", a.getAttribute("id")); section = (HtmlSection) elementIterator.next(); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Subsection_with_id", anchor.getAttribute("id")); h2 = (HtmlHeading2) elementIterator.next(); assertEquals("Subsection with id", h2.asNormalizedText().trim()); @@ -210,6 +225,9 @@ public class AttributesVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertEquals("bar", section.getAttribute("class")); assertEquals("foo", section.getAttribute("id")); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Section_name", anchor.getAttribute("id")); h1 = (HtmlHeading1) elementIterator.next(); assertEquals("Section name", h1.asNormalizedText().trim()); assertEquals("", h1.getAttribute("class")); @@ -219,6 +237,9 @@ public class AttributesVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertEquals("subbar", section.getAttribute("class")); assertEquals("subfoo", section.getAttribute("id")); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Subsection_name", anchor.getAttribute("id")); h2 = (HtmlHeading2) elementIterator.next(); assertEquals("Subsection name", h2.asNormalizedText().trim()); assertEquals("", h2.getAttribute("class")); diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java index 4d0d295..1528113 100644 --- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java +++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java @@ -20,6 +20,7 @@ package org.apache.maven.doxia.siterenderer; import java.util.Iterator; +import org.htmlunit.html.HtmlAnchor; import org.htmlunit.html.HtmlDivision; import org.htmlunit.html.HtmlElement; import org.htmlunit.html.HtmlHeading1; @@ -59,6 +60,11 @@ public class EntitiesVerifier extends AbstractVerifier { HtmlSection section = (HtmlSection) elementIterator.next(); + HtmlAnchor anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals( + "section_name_with_entities.3A_.27.26.27_.27.CE.91.27_.27.C2.A0.27_.27.3F.3F.27", + anchor.getAttribute("id")); HtmlHeading1 h1 = (HtmlHeading1) elementIterator.next(); assertNotNull(h1); assertEquals(h1.asNormalizedText().trim(), "section name with entities: '&' '\u0391' ' ' '\uD835\uDFED'"); @@ -66,20 +72,24 @@ public class EntitiesVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Entities", anchor.getAttribute("id")); + HtmlHeading2 h2 = (HtmlHeading2) elementIterator.next(); + assertNotNull(h2); + assertEquals("Entities", h2.asNormalizedText().trim()); + section = (HtmlSection) elementIterator.next(); assertNotNull(section); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals( + "Generic_Entities.3A_.27.26.27_.27.3C.27_.27.3E.27_.27.22.27_.27.27.27", anchor.getAttribute("id")); HtmlHeading3 h3 = (HtmlHeading3) elementIterator.next(); assertNotNull(h3); - assertEquals("Entities", h3.asNormalizedText().trim()); - - section = (HtmlSection) elementIterator.next(); - assertNotNull(section); - - HtmlHeading2 h2 = (HtmlHeading2) elementIterator.next(); - assertNotNull(h2); assertEquals( - "Generic Entities: '&' '<' '>' '\"' '''", h2.asNormalizedText().trim()); + "Generic Entities: '&' '<' '>' '\"' '''", h3.asNormalizedText().trim()); HtmlParagraph p = (HtmlParagraph) elementIterator.next(); assertNotNull(p); @@ -88,11 +98,15 @@ public class EntitiesVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); - h2 = (HtmlHeading2) elementIterator.next(); - assertNotNull(h2); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals( + "Local_Entities.3A_.27.CE.91.27_.27.CE.92.27_.27.CE.93.27_.27.3F.3F.27", anchor.getAttribute("id")); + h3 = (HtmlHeading3) elementIterator.next(); + assertNotNull(h3); assertEquals( "Local Entities: '\u0391' '\u0392' '\u0393' '\uD835\uDFED'", - h2.asNormalizedText().trim()); + h3.asNormalizedText().trim()); p = (HtmlParagraph) elementIterator.next(); assertNotNull(p); @@ -103,10 +117,13 @@ public class EntitiesVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); - h2 = (HtmlHeading2) elementIterator.next(); - assertNotNull(h2); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("DTD_Entities.3A_.27.27_.27.C2.A1.27_.27.C2.A2.27", anchor.getAttribute("id")); + h3 = (HtmlHeading3) elementIterator.next(); + assertNotNull(h3); assertEquals( - "DTD Entities: ' ' '\u00A1' '\u00A2'", h2.asNormalizedText().trim()); + "DTD Entities: ' ' '\u00A1' '\u00A2'", h3.asNormalizedText().trim()); p = (HtmlParagraph) elementIterator.next(); assertNotNull(p); @@ -115,9 +132,12 @@ public class EntitiesVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); - h3 = (HtmlHeading3) elementIterator.next(); - assertNotNull(h3); - assertEquals("CDATA", h3.asNormalizedText().trim()); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("CDATA", anchor.getAttribute("id")); + h2 = (HtmlHeading2) elementIterator.next(); + assertNotNull(h2); + assertEquals("CDATA", h2.asNormalizedText().trim()); HtmlDivision div = (HtmlDivision) elementIterator.next(); assertNotNull(div); diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java index 3acf2a0..56d1f35 100644 --- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java +++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java @@ -26,6 +26,7 @@ import java.util.List; import org.htmlunit.CollectingAlertHandler; import org.htmlunit.WebClient; +import org.htmlunit.html.HtmlAnchor; import org.htmlunit.html.HtmlElement; import org.htmlunit.html.HtmlHeading1; import org.htmlunit.html.HtmlMain; @@ -82,6 +83,9 @@ public class JavascriptVerifier extends AbstractVerifier { HtmlSection section = (HtmlSection) elementIterator.next(); assertNotNull(section); + HtmlAnchor anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Test", anchor.getAttribute("id")); HtmlHeading1 h1 = (HtmlHeading1) elementIterator.next(); assertNotNull(h1); assertEquals("Test", h1.asNormalizedText().trim()); diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/MultipleBlockVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/MultipleBlockVerifier.java index 1fc7823..49e5a5d 100644 --- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/MultipleBlockVerifier.java +++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/MultipleBlockVerifier.java @@ -20,6 +20,7 @@ package org.apache.maven.doxia.siterenderer; import java.util.Iterator; +import org.htmlunit.html.HtmlAnchor; import org.htmlunit.html.HtmlElement; import org.htmlunit.html.HtmlHeading1; import org.htmlunit.html.HtmlListItem; @@ -57,6 +58,9 @@ public class MultipleBlockVerifier extends AbstractVerifier { HtmlSection section = (HtmlSection) elementIterator.next(); assertNotNull(section); + HtmlAnchor anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("section_name", anchor.getAttribute("id")); HtmlHeading1 h1 = (HtmlHeading1) elementIterator.next(); assertNotNull(h1); assertEquals("section name", h1.asNormalizedText().trim()); diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java index a5566e3..5fa80d9 100644 --- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java +++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java @@ -20,12 +20,13 @@ package org.apache.maven.doxia.siterenderer; import java.util.Iterator; +import org.htmlunit.html.HtmlAnchor; import org.htmlunit.html.HtmlDefinitionDescription; import org.htmlunit.html.HtmlDefinitionList; import org.htmlunit.html.HtmlDefinitionTerm; import org.htmlunit.html.HtmlElement; import org.htmlunit.html.HtmlHeading1; -import org.htmlunit.html.HtmlHeading3; +import org.htmlunit.html.HtmlHeading2; import org.htmlunit.html.HtmlListItem; import org.htmlunit.html.HtmlMain; import org.htmlunit.html.HtmlOrderedList; @@ -62,6 +63,9 @@ public class NestedItemsVerifier extends AbstractVerifier { HtmlSection section = (HtmlSection) elementIterator.next(); assertNotNull(section); + HtmlAnchor anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("List_Section", anchor.getAttribute("id")); HtmlHeading1 h1 = (HtmlHeading1) elementIterator.next(); assertNotNull(h1); assertEquals("List Section", h1.asNormalizedText().trim()); @@ -73,12 +77,12 @@ public class NestedItemsVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); - section = (HtmlSection) elementIterator.next(); - assertNotNull(section); - - HtmlHeading3 h3 = (HtmlHeading3) elementIterator.next(); - assertNotNull(h3); - assertEquals("Unordered lists", h3.asNormalizedText().trim()); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Unordered_lists", anchor.getAttribute("id")); + HtmlHeading2 h2 = (HtmlHeading2) elementIterator.next(); + assertNotNull(h2); + assertEquals("Unordered lists", h2.asNormalizedText().trim()); HtmlParagraph p = (HtmlParagraph) elementIterator.next(); assertNotNull(p); @@ -164,9 +168,12 @@ public class NestedItemsVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); - h3 = (HtmlHeading3) elementIterator.next(); - assertNotNull(h3); - assertEquals("Ordered lists", h3.asNormalizedText().trim()); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Ordered_lists", anchor.getAttribute("id")); + h2 = (HtmlHeading2) elementIterator.next(); + assertNotNull(h2); + assertEquals("Ordered lists", h2.asNormalizedText().trim()); p = (HtmlParagraph) elementIterator.next(); assertNotNull(p); @@ -248,9 +255,12 @@ public class NestedItemsVerifier extends AbstractVerifier { section = (HtmlSection) elementIterator.next(); assertNotNull(section); - h3 = (HtmlHeading3) elementIterator.next(); - assertNotNull(h3); - assertEquals("Definition lists", h3.asNormalizedText().trim()); + anchor = (HtmlAnchor) elementIterator.next(); + assertNotNull(anchor); + assertEquals("Definition_lists", anchor.getAttribute("id")); + h2 = (HtmlHeading2) elementIterator.next(); + assertNotNull(h2); + assertEquals("Definition lists", h2.asNormalizedText().trim()); p = (HtmlParagraph) elementIterator.next(); assertNotNull(p); diff --git a/doxia-site-renderer/src/test/resources/site-validate/xdoc/entityTest.xml b/doxia-site-renderer/src/test/resources/site-validate/xdoc/entityTest.xml index 1b453ce..d1d8fa2 100644 --- a/doxia-site-renderer/src/test/resources/site-validate/xdoc/entityTest.xml +++ b/doxia-site-renderer/src/test/resources/site-validate/xdoc/entityTest.xml @@ -52,17 +52,17 @@ <section name="section name with entities: '&' 'Α' ' ' '&tritPos;'"> - <h3>Entities</h3> - <h2>Generic Entities: '&' '<' '>' '"' '''</h2> + <h2>Entities</h2> + <h3>Generic Entities: '&' '<' '>' '"' '''</h3> <p>'&' '<' '>' '"' '''</p> - <h2>Local Entities: 'Α' 'Β' 'Γ' '&tritPos;'</h2> + <h3>Local Entities: 'Α' 'Β' 'Γ' '&tritPos;'</h3> <p>'Α' 'Β' 'Γ' '&tritPos;𝟭' '&flo;ř' '&myCustomEntity;'</p> - <h2>DTD Entities: ' ' '¡' '¢'</h2> + <h3>DTD Entities: ' ' '¡' '¢'</h3> <p>' ' '¡' '¢'</p> - <h3>CDATA</h3> + <h2>CDATA</h2> <source><![CDATA[<project xmlns:ant="jelly:ant">]]></source> <p><![CDATA[' ' '¡']]></p> diff --git a/doxia-site-renderer/src/test/resources/site/xdoc/macro.xml b/doxia-site-renderer/src/test/resources/site/xdoc/macro.xml index 8266116..ea04d04 100644 --- a/doxia-site-renderer/src/test/resources/site/xdoc/macro.xml +++ b/doxia-site-renderer/src/test/resources/site/xdoc/macro.xml @@ -50,7 +50,7 @@ <section name="TITLE 1"> <subsection name="SUB TITLE 1.1"><p>bla bla...</p></subsection> <subsection name="SUB TITLE 1.2"><p>bla bla...</p> - <h4>SUB SUB TITLE 1.2.1</h4> + <h3>SUB SUB TITLE 1.2.1</h3> </subsection> <subsection name="SUB TITLE 1.3"><p>bla bla...</p></subsection> </section> @@ -58,7 +58,7 @@ <section name="TITLE 2"> <subsection name="SUB TITLE 2.1"><p>bla bla...</p></subsection> <subsection name="SUB TITLE 2.2"><p>bla bla...</p> - <h4>SUB SUB TITLE 2.2.1</h4> + <h3>SUB SUB TITLE 2.2.1</h3> </subsection> <subsection name="SUB TITLE 2.3"><p>bla bla...</p></subsection> </section> @@ -66,7 +66,7 @@ <section name="TITLE 3"> <subsection name="SUB TITLE 3.1"><p>bla bla...</p> </subsection> <subsection name="SUB TITLE 3.2"><p>bla bla...</p> - <h4>SUB SUB TITLE 3.2.1</h4> + <h3>SUB SUB TITLE 3.2.1</h3> </subsection> <subsection name="SUB TITLE 3.3"><p>bla bla...</p></subsection> </section> diff --git a/doxia-site-renderer/src/test/resources/site/xdoc/nestedItems.xml b/doxia-site-renderer/src/test/resources/site/xdoc/nestedItems.xml index 7573218..d8a7b9f 100644 --- a/doxia-site-renderer/src/test/resources/site/xdoc/nestedItems.xml +++ b/doxia-site-renderer/src/test/resources/site/xdoc/nestedItems.xml @@ -27,7 +27,7 @@ under the License. <body> <section name="List Section"> - <h3>Unordered lists</h3> + <h2>Unordered lists</h2> <p> Below is an unordered list, followed by six paragraphs. </p> @@ -92,7 +92,7 @@ under the License. Paragraph 6 below list. </p> - <h3>Ordered lists</h3> + <h2>Ordered lists</h2> <p> Below is an ordered list, followed by six paragraphs. </p> @@ -157,7 +157,7 @@ under the License. Paragraph 6 below list. </p> - <h3>Definition lists</h3> + <h2>Definition lists</h2> <p> Below is a definition list, followed by six paragraphs. </p>