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. */
