[DOXIA-764] Trim left the text inside <source>
It is block element in XDoc but potentially an inline element in the
Sink (XHTML emits <pre><code>)
diff --git a/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java b/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
index 7ca832d..e6f006a 100644
--- a/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
+++ b/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
@@ -31,6 +31,7 @@
import java.util.Map;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.maven.doxia.macro.MacroExecutionException;
import org.apache.maven.doxia.macro.MacroRequest;
import org.apache.maven.doxia.macro.manager.MacroNotFoundException;
@@ -80,6 +81,8 @@
*/
private boolean inHead;
+ private boolean inSource;
+
/**
* Indicates that <title> was called from <properties> or <head>.
*/
@@ -159,6 +162,7 @@
attribs.addAttributes(SinkEventAttributeSet.SOURCE);
sink.verbatim(attribs);
+ inSource = true;
} else if (parser.getName().equals(PROPERTIES_TAG.toString())) {
if (!inHead) // we might be in head from a <head> already
{
@@ -216,6 +220,7 @@
verbatim_();
sink.verbatim_();
+ inSource = false;
} else if (parser.getName().equals(PROPERTIES_TAG.toString())) {
// Do nothing, head is closed with BODY start.
} else if (parser.getName().equals(MACRO_TAG.toString())) {
@@ -241,6 +246,23 @@
isEmptyElement = false;
}
+ /** {@inheritDoc} */
+ protected void handleText(XmlPullParser parser, Sink sink) throws XmlPullParserException {
+ // almost a copy of super.handleText(parser, sink), but with the following changes:
+ // trim left the first text inside source tag because it is emitted inside an inline tag
+ String text = parser.getText();
+ if (inSource) {
+ text = parser.getText();
+ if (text != null && text.length() > 0) {
+ text = StringUtils.stripStart(text, null);
+ }
+ inSource = false;
+ }
+ if ((text != null && !text.isEmpty()) && !isScriptBlock()) {
+ sink.text(text);
+ }
+ }
+
protected void consecutiveSections(int newLevel, Sink sink) {
closeOpenSections(newLevel, sink);
openMissingSections(newLevel, sink);
diff --git a/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java b/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java
index f8bff32..e605d6e 100644
--- a/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java
+++ b/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java
@@ -291,6 +291,15 @@
it = parseText(text);
assertSinkEquals(it, "verbatim", "text", "verbatim_");
+
+ // the source should be trimmed left (DOXIA-764) because it is becoming the Sink.verbatim() method (which is
+ // inline)
+ text = "<source>\n" + "some.code() </source>";
+ it = parseText(text);
+
+ assertSinkEquals(it.next(), "verbatim", SinkEventAttributeSet.SOURCE);
+ assertSinkEquals(it.next(), "text", "some.code() ", null);
+ assertSinkEquals(it, "verbatim_");
}
@Test