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

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

commit aa73a3c6e8e1372c068edef76c4a46e829398a78
Author: Michael Osipov <micha...@apache.org>
AuthorDate: Mon Jun 5 21:05:29 2023 +0200

    [DOXIA-704] style and class attributes not merged when user-supplied in 
XHTML5 sink
---
 .../maven/doxia/parser/Xhtml5BaseParser.java       | 10 +--
 .../maven/doxia/sink/impl/Xhtml5BaseSink.java      | 74 ++++++++++++----------
 .../maven/doxia/sink/impl/Xhtml5BaseSinkTest.java  | 19 +++---
 .../maven/doxia/module/xdoc/XdocSinkTest.java      |  2 +-
 .../doxia-module-xdoc/src/test/resources/test.xml  |  4 +-
 .../maven/doxia/module/xhtml5/Xhtml5SinkTest.java  |  2 +-
 6 files changed, 61 insertions(+), 50 deletions(-)

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 6af7143e..2e9108e8 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
@@ -865,19 +865,19 @@ public class Xhtml5BaseParser extends AbstractXmlParser 
implements HtmlMarkup {
 
         if (style != null) {
             switch (style) {
-                case "list-style-type: upper-alpha":
+                case "list-style-type: upper-alpha;":
                     numbering = Sink.NUMBERING_UPPER_ALPHA;
                     break;
-                case "list-style-type: lower-alpha":
+                case "list-style-type: lower-alpha;":
                     numbering = Sink.NUMBERING_LOWER_ALPHA;
                     break;
-                case "list-style-type: upper-roman":
+                case "list-style-type: upper-roman;":
                     numbering = Sink.NUMBERING_UPPER_ROMAN;
                     break;
-                case "list-style-type: lower-roman":
+                case "list-style-type: lower-roman;":
                     numbering = Sink.NUMBERING_LOWER_ROMAN;
                     break;
-                case "list-style-type: decimal":
+                case "list-style-type: decimal;":
                     numbering = Sink.NUMBERING_DECIMAL;
                     break;
                 default:
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 565fa743..eca97681 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
@@ -19,7 +19,6 @@
 package org.apache.maven.doxia.sink.impl;
 
 import javax.swing.text.MutableAttributeSet;
-import javax.swing.text.html.HTML.Attribute;
 import javax.swing.text.html.HTML.Tag;
 
 import java.io.PrintWriter;
@@ -570,10 +569,13 @@ public class Xhtml5BaseSink extends AbstractXmlSink 
implements HtmlMarkup {
                 atts = new SinkEventAttributeSet(1);
             }
 
-            if (!atts.isDefined(SinkEventAttributes.CLASS)) {
-                atts.addAttribute(SinkEventAttributes.CLASS, "content");
+            String divClass = "content";
+            if (atts.isDefined(SinkEventAttributes.CLASS)) {
+                divClass += " " + 
atts.getAttribute(SinkEventAttributes.CLASS).toString();
             }
 
+            atts.addAttribute(SinkEventAttributes.CLASS, divClass);
+
             writeStartTag(contentStack.push(HtmlMarkup.DIV), atts);
         }
     }
@@ -703,24 +705,25 @@ public class Xhtml5BaseSink extends AbstractXmlSink 
implements HtmlMarkup {
             paragraph_();
         }
 
-        String style;
+        String olStyle = "list-style-type: ";
         switch (numbering) {
             case NUMBERING_UPPER_ALPHA:
-                style = "upper-alpha";
+                olStyle += "upper-alpha";
                 break;
             case NUMBERING_LOWER_ALPHA:
-                style = "lower-alpha";
+                olStyle += "lower-alpha";
                 break;
             case NUMBERING_UPPER_ROMAN:
-                style = "upper-roman";
+                olStyle += "upper-roman";
                 break;
             case NUMBERING_LOWER_ROMAN:
-                style = "lower-roman";
+                olStyle += "lower-roman";
                 break;
             case NUMBERING_DECIMAL:
             default:
-                style = "decimal";
+                olStyle += "decimal";
         }
+        olStyle += ";";
 
         MutableAttributeSet atts = SinkUtils.filterAttributes(attributes, 
SinkUtils.SINK_SECTION_ATTRIBUTES);
 
@@ -728,7 +731,11 @@ public class Xhtml5BaseSink extends AbstractXmlSink 
implements HtmlMarkup {
             atts = new SinkEventAttributeSet(1);
         }
 
-        atts.addAttribute(Attribute.STYLE, "list-style-type: " + style);
+        if (atts.isDefined(SinkEventAttributes.STYLE)) {
+            olStyle += " " + 
atts.getAttribute(SinkEventAttributes.STYLE).toString();
+        }
+
+        atts.addAttribute(SinkEventAttributes.STYLE, olStyle);
 
         writeStartTag(HtmlMarkup.OL, atts);
     }
@@ -1266,10 +1273,16 @@ public class Xhtml5BaseSink extends AbstractXmlSink 
implements HtmlMarkup {
 
         MutableAttributeSet att = new SinkEventAttributeSet();
 
-        if (!this.tableAttributes.isDefined(Attribute.CLASS.toString())) {
-            att.addAttribute(Attribute.CLASS, "bodyTable" + (grid ? " 
bodyTableBorder" : ""));
+        String tableClass = "bodyTable" + (grid ? " bodyTableBorder" : "");
+        if 
(this.tableAttributes.isDefined(SinkEventAttributes.CLASS.toString())) {
+            tableClass += " "
+                    + this.tableAttributes
+                            .getAttribute(SinkEventAttributes.CLASS)
+                            .toString();
         }
 
+        att.addAttribute(SinkEventAttributes.CLASS, tableClass);
+
         att.addAttributes(this.tableAttributes);
         this.tableAttributes.removeAttributes(this.tableAttributes);
 
@@ -1324,7 +1337,7 @@ public class Xhtml5BaseSink extends AbstractXmlSink 
implements HtmlMarkup {
             if (HIDDEN_CLASS_PATTERN.matcher(givenRowClass).matches()) {
                 hidden = true;
             }
-            rowClass = givenRowClass + " " + rowClass;
+            rowClass += " " + givenRowClass;
         }
 
         attrs.addAttribute(SinkEventAttributes.CLASS, rowClass);
@@ -1390,26 +1403,23 @@ public class Xhtml5BaseSink extends AbstractXmlSink 
implements HtmlMarkup {
                 && !cellJustifStack.isEmpty()
                 && getCellJustif() != null) {
             int cellCount = getCellCount();
-            if (cellCount < getCellJustif().length
-                    && (attributes == null || 
!attributes.isDefined(Attribute.STYLE.toString()))) {
-                Map<Integer, MutableAttributeSet> hash = new HashMap<>();
-                hash.put(
-                        Sink.JUSTIFY_CENTER,
-                        new SinkEventAttributeSet(SinkEventAttributes.STYLE, 
"text-align: center;").unmodifiable());
-                hash.put(
-                        Sink.JUSTIFY_LEFT,
-                        new SinkEventAttributeSet(SinkEventAttributes.STYLE, 
"text-align: left;").unmodifiable());
-                hash.put(
-                        Sink.JUSTIFY_RIGHT,
-                        new SinkEventAttributeSet(SinkEventAttributes.STYLE, 
"text-align: right;").unmodifiable());
-                MutableAttributeSet atts = 
hash.get(getCellJustif()[cellCount]);
-
+            int[] cellJustif = getCellJustif();
+            if (cellCount < cellJustif.length) {
                 if (attributes == null) {
                     attributes = new SinkEventAttributeSet();
                 }
-                if (atts != null) {
-                    attributes.addAttributes(atts);
+                Map<Integer, String> hash = new HashMap<>();
+                hash.put(Sink.JUSTIFY_CENTER, "center");
+                hash.put(Sink.JUSTIFY_LEFT, "left");
+                hash.put(Sink.JUSTIFY_RIGHT, "right");
+
+                String tdStyle = "text-align: " + 
hash.get(cellJustif[cellCount]) + ";";
+                if (attributes.isDefined(SinkEventAttributes.STYLE)) {
+                    tdStyle += " "
+                            + 
attributes.getAttribute(SinkEventAttributes.STYLE).toString();
                 }
+
+                attributes.addAttribute(SinkEventAttributes.STYLE, tdStyle);
             }
         }
 
@@ -1574,9 +1584,9 @@ public class Xhtml5BaseSink extends AbstractXmlSink 
implements HtmlMarkup {
 
         if (DoxiaUtils.isExternalLink(name)) {
             String linkClass = "externalLink";
-            if (atts.isDefined(Attribute.CLASS.toString())) {
-                String givenLinkClass = (String) 
atts.getAttribute(Attribute.CLASS.toString());
-                linkClass = givenLinkClass + " " + linkClass;
+            if (atts.isDefined(SinkEventAttributes.CLASS.toString())) {
+                String givenLinkClass = (String) 
atts.getAttribute(SinkEventAttributes.CLASS.toString());
+                linkClass += " " + givenLinkClass;
             }
 
             atts.addAttribute(SinkEventAttributes.CLASS, linkClass);
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 48705219..0d0bf606 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
@@ -445,7 +445,7 @@ public class Xhtml5BaseSinkTest {
             sink.numberedList_();
         }
 
-        assertEquals("<ol style=\"list-style-type: decimal\">" + LS + 
"<li></li></ol>", writer.toString());
+        assertEquals("<ol style=\"list-style-type: decimal;\">" + LS + 
"<li></li></ol>", writer.toString());
 
         writer = new StringWriter();
 
@@ -457,7 +457,8 @@ public class Xhtml5BaseSinkTest {
         }
 
         assertEquals(
-                "<ol style=\"list-style-type: decimal\">" + LS + "<li 
style=\"bold\"></li></ol>", writer.toString());
+                "<ol style=\"list-style-type: decimal; bold\">" + LS + "<li 
style=\"bold\"></li></ol>",
+                writer.toString());
     }
 
     /**
@@ -793,13 +794,13 @@ public class Xhtml5BaseSinkTest {
         StringBuilder expected = new StringBuilder("<table 
class=\"bodyTable\">");
         expected.append(EOL).append("<tr class=\"a\"></tr>").append(EOL);
         expected.append("<tr style=\"bold\" class=\"b\"></tr>").append(EOL);
-        expected.append("<tr class=\"hidden xyz abc a\"></tr>").append(EOL);
-        expected.append("<tr class=\"abc hidden xyz a\"></tr>").append(EOL);
+        expected.append("<tr class=\"a hidden xyz abc\"></tr>").append(EOL);
+        expected.append("<tr class=\"a abc hidden xyz\"></tr>").append(EOL);
         expected.append("<tr class=\"a\"></tr>").append(EOL);
-        expected.append("<tr class=\"not-hidden xyz b\"></tr>").append(EOL);
-        expected.append("<tr class=\"xyz not-hidden a\"></tr>").append(EOL);
-        expected.append("<tr style=\"bold\" class=\"xyz abc hidden 
b\"></tr>").append(EOL);
-        expected.append("<tr class=\"xyz hidden-not b\"></tr>").append(EOL);
+        expected.append("<tr class=\"b not-hidden xyz\"></tr>").append(EOL);
+        expected.append("<tr class=\"a xyz not-hidden\"></tr>").append(EOL);
+        expected.append("<tr style=\"bold\" class=\"b xyz abc 
hidden\"></tr>").append(EOL);
+        expected.append("<tr class=\"b xyz hidden-not\"></tr>").append(EOL);
         expected.append("<tr class=\"a\"></tr></table>");
 
         String xmlExpected = expected.toString();
@@ -912,7 +913,7 @@ public class Xhtml5BaseSinkTest {
         }
 
         assertEquals(
-                "<a style=\"bold\" class=\"cs1 cs2 externalLink\" 
href=\"https://www.apache.org\";></a>",
+                "<a style=\"bold\" class=\"externalLink cs1 cs2\" 
href=\"https://www.apache.org\";></a>",
                 writer.toString());
     }
 
diff --git 
a/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java
 
b/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java
index ee951c3b..66b81f17 100644
--- 
a/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java
+++ 
b/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocSinkTest.java
@@ -184,7 +184,7 @@ public class XdocSinkTest extends AbstractSinkTest {
 
     /** {@inheritDoc} */
     protected String getNumberedListBlock(String item) {
-        return "<ol style=\"list-style-type: lower-roman\">\n<li>" + item + 
"</li></ol>";
+        return "<ol style=\"list-style-type: lower-roman;\">\n<li>" + item + 
"</li></ol>";
     }
 
     /** {@inheritDoc} */
diff --git a/doxia-modules/doxia-module-xdoc/src/test/resources/test.xml 
b/doxia-modules/doxia-module-xdoc/src/test/resources/test.xml
index 8acb9059..211b884c 100644
--- a/doxia-modules/doxia-module-xdoc/src/test/resources/test.xml
+++ b/doxia-modules/doxia-module-xdoc/src/test/resources/test.xml
@@ -53,8 +53,8 @@
 
         <source>Verbatim text not contained in list item 3</source>
 
-        <ol style="list-style-type: decimal">
-          <li>Numbered item 1. <ol style="list-style-type: upper-alpha">
+        <ol style="list-style-type: decimal;">
+          <li>Numbered item 1. <ol style="list-style-type: upper-alpha;">
               <li>Numbered item A.</li>
               <li>Numbered item B.</li>
             </ol>
diff --git 
a/doxia-modules/doxia-module-xhtml5/src/test/java/org/apache/maven/doxia/module/xhtml5/Xhtml5SinkTest.java
 
b/doxia-modules/doxia-module-xhtml5/src/test/java/org/apache/maven/doxia/module/xhtml5/Xhtml5SinkTest.java
index f1dc2916..f87b9e1d 100644
--- 
a/doxia-modules/doxia-module-xhtml5/src/test/java/org/apache/maven/doxia/module/xhtml5/Xhtml5SinkTest.java
+++ 
b/doxia-modules/doxia-module-xhtml5/src/test/java/org/apache/maven/doxia/module/xhtml5/Xhtml5SinkTest.java
@@ -171,7 +171,7 @@ public class Xhtml5SinkTest extends AbstractSinkTest {
 
     /** {@inheritDoc} */
     protected String getNumberedListBlock(String item) {
-        return "<ol style=\"list-style-type: lower-roman\">\n<li>" + item + 
"</li></ol>";
+        return "<ol style=\"list-style-type: lower-roman;\">\n<li>" + item + 
"</li></ol>";
     }
 
     /** {@inheritDoc} */

Reply via email to