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

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

commit 777f8d3654d71f278a51fa86ebaf49f943d77ffb
Author: Fred Eckertson <[email protected]>
AuthorDate: Wed Jun 1 22:07:08 2022 -0500

    [DOXIA-660] Add ability to hide table rows via CSS
    
    This closes #104
---
 .../maven/doxia/sink/impl/Xhtml5BaseSink.java      | 19 ++++++-
 .../maven/doxia/sink/impl/XhtmlBaseSink.java       | 19 ++++++-
 .../maven/doxia/sink/impl/Xhtml5BaseSinkTest.java  | 61 ++++++++++++++++++++++
 .../maven/doxia/sink/impl/XhtmlBaseSinkTest.java   | 61 ++++++++++++++++++++++
 4 files changed, 156 insertions(+), 4 deletions(-)

diff --git 
a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSink.java 
b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSink.java
index 91593240..a7bc84c7 100644
--- 
a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSink.java
+++ 
b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSink.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Stack;
+import java.util.regex.Pattern;
 
 import javax.swing.text.MutableAttributeSet;
 import javax.swing.text.html.HTML.Attribute;
@@ -64,6 +65,9 @@ public class Xhtml5BaseSink
     /** The PrintWriter to write the result. */
     private final PrintWriter writer;
 
+    /** Used to identify if a class string contains `hidden` */
+    private static final Pattern HIDDEN_CLASS_PATTERN = Pattern.compile( 
"(?:.*\\s|^)hidden(?:\\s.*|$)" );
+
     /** Used to collect text events mainly for the head events. */
     private StringBuffer textBuffer = new StringBuffer();
 
@@ -1523,7 +1527,10 @@ public class Xhtml5BaseSink
     }
 
     /**
-     * Rows are striped with two colors by adding the class <code>a</code> or 
<code>b</code>. {@inheritDoc}
+     * Rows are striped with two colors by adding the class <code>a</code> or 
<code>b</code>. If the provided attributes
+     * specify the <code>hidden</code> class, the next call to tableRow will 
set the same striping class as this one. A
+     * style for <code>hidden</code> or <code>table.bodyTable hidden</code> 
may need to be provided to actually hide
+     * such a row. {@inheritDoc}
      *
      * @see javax.swing.text.html.HTML.Tag#TR
      */
@@ -1539,9 +1546,14 @@ public class Xhtml5BaseSink
         }
 
         String rowClass = evenTableRow ? "a" : "b";
+        boolean hidden = false;
         if ( attrs.isDefined( Attribute.CLASS.toString() ) )
         {
             String givenRowClass = (String) attrs.getAttribute( 
Attribute.CLASS.toString() );
+            if ( HIDDEN_CLASS_PATTERN.matcher( givenRowClass ).matches() )
+            {
+                hidden = true;
+            }
             rowClass = givenRowClass + " " + rowClass;
         }
 
@@ -1549,7 +1561,10 @@ public class Xhtml5BaseSink
 
         writeStartTag( HtmlMarkup.TR, attrs );
 
-        evenTableRow = !evenTableRow;
+        if ( !hidden )
+        {
+            evenTableRow = !evenTableRow;
+        }
 
         if ( !this.cellCountStack.isEmpty() )
         {
diff --git 
a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java 
b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
index 1cc3f798..18e94088 100644
--- 
a/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
+++ 
b/doxia-core/src/main/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSink.java
@@ -30,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Stack;
+import java.util.regex.Pattern;
 
 import javax.swing.text.MutableAttributeSet;
 import javax.swing.text.html.HTML.Attribute;
@@ -68,6 +69,9 @@ public class XhtmlBaseSink
     /** The PrintWriter to write the result. */
     private final PrintWriter writer;
 
+    /** Used to identify if a class string contains `hidden` */
+    private static final Pattern HIDDEN_CLASS_PATTERN = Pattern.compile( 
"(?:.*\\s|^)hidden(?:\\s.*|$)" );
+
     /** Used to collect text events mainly for the head events. */
     private StringBuffer textBuffer = new StringBuffer();
 
@@ -1401,7 +1405,10 @@ public class XhtmlBaseSink
     }
 
     /**
-     * Rows are striped with two colors by adding the class <code>a</code> or 
<code>b</code>. {@inheritDoc}
+     * Rows are striped with two colors by adding the class <code>a</code> or 
<code>b</code>. If the provided attributes
+     * specify the <code>hidden</code> class, the next call to tableRow will 
set the same striping class as this one. A
+     * style for <code>hidden</code> or <code>table.bodyTable hidden</code> 
may need to be provided to actually hide
+     * such a row. {@inheritDoc}
      *
      * @see javax.swing.text.html.HTML.Tag#TR
      */
@@ -1416,9 +1423,14 @@ public class XhtmlBaseSink
         }
 
         String rowClass = evenTableRow ? "a" : "b";
+        boolean hidden = false;
         if ( attrs.isDefined( Attribute.CLASS.toString() ) )
         {
             String givenRowClass = (String) attrs.getAttribute( 
Attribute.CLASS.toString() );
+            if ( HIDDEN_CLASS_PATTERN.matcher( givenRowClass ).matches() )
+            {
+                hidden = true;
+            }
             rowClass = givenRowClass + " " + rowClass;
         }
 
@@ -1426,7 +1438,10 @@ public class XhtmlBaseSink
 
         writeStartTag( HtmlMarkup.TR, attrs );
 
-        evenTableRow = !evenTableRow;
+        if ( !hidden )
+        {
+            evenTableRow = !evenTableRow;
+        }
 
         if ( !this.cellCountStack.isEmpty() )
         {
diff --git 
a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSinkTest.java
 
b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSinkTest.java
index 86edcc21..6bc76fbc 100644
--- 
a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSinkTest.java
+++ 
b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/Xhtml5BaseSinkTest.java
@@ -1104,6 +1104,67 @@ public class Xhtml5BaseSinkTest
         assertEquals( xmlExpected, writer.toString() );
     }
 
+    /**
+     * Test striping for hidden rows in tableRow method.
+     */
+    @Test
+    public void testHiddenTableRowStriping()
+    {
+        try
+        {
+            SinkEventAttributeSet attributes2 = new SinkEventAttributeSet();
+            SinkEventAttributeSet attributes3 = new SinkEventAttributeSet();
+            attributes3.addAttributes( attributes );
+            sink = new Xhtml5BaseSink( writer );
+
+            sink.tableRow();
+            sink.tableRow_();
+            sink.tableRow( attributes );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "hidden xyz 
abc" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "abc hidden 
xyz" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            sink.tableRow();
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "not-hidden 
xyz" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "xyz 
not-hidden" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            attributes3.addAttribute( SinkEventAttributes.CLASS, "xyz abc 
hidden" );
+            sink.tableRow( attributes3 );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "xyz 
hidden-not" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            sink.tableRow();
+            sink.tableRow_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        StringBuilder sbExpeted = new StringBuilder( "<table border=\"0\" 
class=\"bodyTable\">" );
+        sbExpeted.append( EOL ).append( "<tr class=\"a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr style=\"bold\" class=\"b\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"hidden xyz abc a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"abc hidden xyz a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"a\"></tr>" ).append( EOL );
+        sbExpeted.append( "<tr class=\"not-hidden xyz b\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"xyz not-hidden a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr style=\"bold\" class=\"xyz abc hidden 
b\"></tr>" ).append( EOL );
+        sbExpeted.append( "<tr class=\"xyz hidden-not b\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"a\"></tr>" );
+
+        String xmlExpected = sbExpeted.toString();
+        assertEquals( xmlExpected, writer.toString() );
+    }
+
     /**
      * Test of tableCell method, of class Xhtml5BaseSink.
      */
diff --git 
a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
 
b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
index ecacdd4a..ece60a56 100644
--- 
a/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
+++ 
b/doxia-core/src/test/java/org/apache/maven/doxia/sink/impl/XhtmlBaseSinkTest.java
@@ -726,6 +726,67 @@ public class XhtmlBaseSinkTest
         assertEquals( xmlExpected, writer.toString() );
     }
 
+    /**
+     * Test striping for hidden rows in tableRow method.
+     */
+    @Test
+    public void testHiddenTableRowStriping()
+    {
+        try
+        {
+            SinkEventAttributeSet attributes2 = new SinkEventAttributeSet();
+            SinkEventAttributeSet attributes3 = new SinkEventAttributeSet();
+            attributes3.addAttributes( attributes );
+            sink = new XhtmlBaseSink( writer );
+
+            sink.tableRow();
+            sink.tableRow_();
+            sink.tableRow( attributes );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "hidden xyz 
abc" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "abc hidden 
xyz" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            sink.tableRow();
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "not-hidden 
xyz" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "xyz 
not-hidden" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            attributes3.addAttribute( SinkEventAttributes.CLASS, "xyz abc 
hidden" );
+            sink.tableRow( attributes3 );
+            sink.tableRow_();
+            attributes2.addAttribute( SinkEventAttributes.CLASS, "xyz 
hidden-not" );
+            sink.tableRow( attributes2 );
+            sink.tableRow_();
+            sink.tableRow();
+            sink.tableRow_();
+        }
+        finally
+        {
+            sink.close();
+        }
+
+        StringBuilder sbExpeted = new StringBuilder( "<table border=\"0\" 
class=\"bodyTable\">" );
+        sbExpeted.append( EOL ).append( "<tr class=\"a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr style=\"bold\" class=\"b\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"hidden xyz abc a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"abc hidden xyz a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"a\"></tr>" ).append( EOL );
+        sbExpeted.append( "<tr class=\"not-hidden xyz b\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"xyz not-hidden a\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr style=\"bold\" class=\"xyz abc hidden 
b\"></tr>" ).append( EOL );
+        sbExpeted.append( "<tr class=\"xyz hidden-not b\"></tr>" ).append( EOL 
);
+        sbExpeted.append( "<tr class=\"a\"></tr>" );
+
+        String xmlExpected = sbExpeted.toString();
+        assertEquals( xmlExpected, writer.toString() );
+    }
+
     /**
      * Test of tableCell method, of class XhtmlBaseSink.
      */

Reply via email to