Author: ltheussl
Date: Tue Mar 10 15:48:59 2009
New Revision: 752148
URL: http://svn.apache.org/viewvc?rev=752148&view=rev
Log:
[DOXIA-296] HTML is escaped inside <source>. Clarify and simplify verbatim
handling of xhtml parsers.
Modified:
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/sink/XhtmlBaseSink.java
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
maven/doxia/doxia/trunk/doxia-sink-api/src/main/java/org/apache/maven/doxia/sink/Sink.java
Modified:
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
(original)
+++
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
Tue Mar 10 15:48:59 2009
@@ -55,8 +55,8 @@
/** Counts section level. */
private int sectionLevel;
- /** Verbatim level, increased whenever a <pre> tag is encountered. */
- private int verbatimLevel;
+ /** Verbatim flag, true whenever we are inside a <pre> tag. */
+ private boolean inVerbatim;
/** Used to recognize the case of img inside figure. */
private boolean inFigure;
@@ -91,11 +91,7 @@
SinkEventAttributeSet attribs = getAttributesFromParser( parser );
- if ( isVerbatim() )
- {
- handleVerbatim( parser, sink );
- }
- else if ( parser.getName().equals( Tag.H2.toString() ) )
+ if ( parser.getName().equals( Tag.H2.toString() ) )
{
handleSectionStart( sink, Sink.SECTION_LEVEL_1, attribs );
}
@@ -245,11 +241,7 @@
{
boolean visited = true;
- if ( isVerbatim() )
- {
- handleVerbatimEnd( parser, sink );
- }
- else if ( parser.getName().equals( Tag.P.toString() ) )
+ if ( parser.getName().equals( Tag.P.toString() ) )
{
if ( !inFigure )
{
@@ -633,30 +625,29 @@
}
/**
- * Decrease the current verbatim level.
+ * Stop verbatim mode.
*/
protected void verbatim_()
{
- verbatimLevel--;
+ this.inVerbatim = false;
}
/**
- * Increases the current verbatim level.
- * A value of 0 means that we are not in verbatim mode, every nested
<pre> tag increases the level.
+ * Start verbatim mode.
*/
protected void verbatim()
{
- verbatimLevel++;
+ this.inVerbatim = true;
}
/**
- * Checks if we are currently insid a <pre> tag.
+ * Checks if we are currently inside a <pre> tag.
*
* @return true if we are currently in verbatim mode.
*/
protected boolean isVerbatim()
{
- return ( this.verbatimLevel != 0 );
+ return this.inVerbatim;
}
/**
@@ -892,34 +883,4 @@
sink.tableRows( justif, grid );
}
-
- private void handleVerbatim( XmlPullParser parser, Sink sink )
- {
- if ( parser.getName().equals( Tag.PRE.toString() ) )
- {
- verbatim();
- }
-
- sink.text( getText( parser ) );
- }
-
- private void handleVerbatimEnd( XmlPullParser parser, Sink sink )
- {
- if ( parser.getName().equals( Tag.PRE.toString() ) )
- {
- verbatim_();
- if ( isVerbatim() )
- {
- sink.text( getText( parser ) );
- }
- else
- {
- sink.verbatim_();
- }
- }
- else
- {
- sink.text( getText( parser ) );
- }
- }
}
Modified:
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/sink/XhtmlBaseSink.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/sink/XhtmlBaseSink.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/sink/XhtmlBaseSink.java
(original)
+++
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/sink/XhtmlBaseSink.java
Tue Mar 10 15:48:59 2009
@@ -979,10 +979,11 @@
paragraph_();
}
- SinkEventAttributeSet att = new SinkEventAttributeSet();
+ SinkEventAttributeSet att = null;
if ( boxed )
{
+ att = new SinkEventAttributeSet();
att.addAttribute( SinkEventAttributes.DECORATION, "boxed" );
}
Modified:
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
(original)
+++
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
Tue Mar 10 15:48:59 2009
@@ -251,4 +251,42 @@
assertEquals( "paragraph_", ( (SinkEventElement) it.next() ).getName()
);
assertFalse( it.hasNext() );
}
+
+ /** @throws Exception */
+ public void testPreFormattedText()
+ throws Exception
+ {
+ String text = "<pre><a href=\"what.html\">what</a></pre>";
+
+ parser.parse( text, sink );
+
+ Iterator it = sink.getEventList().iterator();
+ assertEquals( "verbatim", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "link", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "verbatim_", ( (SinkEventElement) it.next() ).getName()
);
+ assertFalse( it.hasNext() );
+
+ text = "<pre><![CDATA[<a href=\"what.html\">what</a>]]></pre>";
+ sink.reset();
+ parser.parse( text, sink );
+
+ it = sink.getEventList().iterator();
+ assertEquals( "verbatim", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "verbatim_", ( (SinkEventElement) it.next() ).getName()
);
+ assertFalse( it.hasNext() );
+
+ text = "<pre><![CDATA[<pre>what</pre>]]></pre>";
+ sink.reset();
+ parser.parse( text, sink );
+
+ it = sink.getEventList().iterator();
+ assertEquals( "verbatim", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "verbatim_", ( (SinkEventElement) it.next() ).getName()
);
+ assertFalse( it.hasNext() );
+ }
+
}
Modified:
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
(original)
+++
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
Tue Mar 10 15:48:59 2009
@@ -47,16 +47,7 @@
{
isEmptyElement = parser.isEmptyElementTag();
- if ( isVerbatim() )
- {
- if ( parser.getName().equals( SOURCE_TAG.toString() ) )
- {
- verbatim();
- }
-
- sink.text( parser.getText() );
- }
- else if ( parser.getName().equals( QUESTION_TAG.toString() )
+ if ( parser.getName().equals( QUESTION_TAG.toString() )
|| parser.getName().equals( ANSWER_TAG.toString() ) )
{
// ignore
@@ -79,7 +70,7 @@
handleUnknown( parser, sink, TAG_TYPE_START );
}
- if ( !isVerbatim() && getLog().isDebugEnabled() )
+ if ( getLog().isDebugEnabled() )
{
String position = "[" + parser.getLineNumber() + ":"
+ parser.getColumnNumber() + "]";
@@ -94,27 +85,7 @@
protected void handleEndTag( XmlPullParser parser, Sink sink )
throws XmlPullParserException, MacroExecutionException
{
- if ( isVerbatim() )
- {
- if ( parser.getName().equals( SOURCE_TAG.toString() ) )
- {
- verbatim_();
-
- if ( isVerbatim() )
- {
- sink.text( parser.getText() );
- }
- else
- {
- sink.verbatim_();
- }
- }
- else
- {
- sink.text( parser.getText() );
- }
- }
- else if ( parser.getName().equals( QUESTION_TAG.toString() )
+ if ( parser.getName().equals( QUESTION_TAG.toString() )
|| parser.getName().equals( ANSWER_TAG.toString() ) )
{
// ignore
Modified:
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
(original)
+++
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
Tue Mar 10 15:48:59 2009
@@ -35,8 +35,8 @@
import org.apache.maven.doxia.parser.ParseException;
import org.apache.maven.doxia.parser.XhtmlBaseParser;
import org.apache.maven.doxia.sink.Sink;
-
import org.apache.maven.doxia.sink.SinkEventAttributeSet;
+
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
@@ -104,17 +104,7 @@
SinkEventAttributeSet attribs = getAttributesFromParser( parser );
- if ( isVerbatim() )
- {
- if ( parser.getName().equals( SOURCE_TAG.toString() )
- || parser.getName().equals( Tag.PRE.toString() ) )
- {
- verbatim();
- }
-
- sink.text( getText( parser ) );
- }
- else if ( parser.getName().equals( DOCUMENT_TAG.toString() ) )
+ if ( parser.getName().equals( DOCUMENT_TAG.toString() ) )
{
//Do nothing
return;
@@ -181,7 +171,7 @@
{
verbatim();
- attribs.addAttribute( SinkEventAttributeSet.DECORATION, "boxed" );
+ attribs.addAttributes( SinkEventAttributeSet.BOXED );
sink.verbatim( attribs );
}
@@ -253,7 +243,7 @@
handleUnknown( parser, sink, TAG_TYPE_START );
}
- if ( !isVerbatim() && getLog().isDebugEnabled() )
+ if ( getLog().isDebugEnabled() )
{
String position = "[" + parser.getLineNumber() + ":"
+ parser.getColumnNumber() + "]";
@@ -268,28 +258,7 @@
protected void handleEndTag( XmlPullParser parser, Sink sink )
throws XmlPullParserException, MacroExecutionException
{
- if ( isVerbatim() )
- {
- if ( parser.getName().equals( SOURCE_TAG.toString() )
- || parser.getName().equals( Tag.PRE.toString() ) )
- {
- verbatim_();
-
- if ( isVerbatim() )
- {
- sink.text( getText( parser ) );
- }
- else
- {
- sink.verbatim_();
- }
- }
- else
- {
- sink.text( getText( parser ) );
- }
- }
- else if ( parser.getName().equals( DOCUMENT_TAG.toString() ) )
+ if ( parser.getName().equals( DOCUMENT_TAG.toString() ) )
{
//Do nothing
return;
Modified:
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java
(original)
+++
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/test/java/org/apache/maven/doxia/module/xdoc/XdocParserTest.java
Tue Mar 10 15:48:59 2009
@@ -254,15 +254,37 @@
public void testSourceEventsList()
throws Exception
{
- String text = "<source></source>";
+ String text = "<source><a href=\"what.html\">what</a></source>";
SinkEventTestingSink sink = new SinkEventTestingSink();
parser.parse( text, sink );
Iterator it = sink.getEventList().iterator();
+ assertEquals( "verbatim", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "link", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "verbatim_", ( (SinkEventElement) it.next() ).getName()
);
+ assertFalse( it.hasNext() );
+
+ text = "<source><![CDATA[<a href=\"what.html\">what</a>]]></source>";
+ sink.reset();
+ parser.parse( text, sink );
+
+ it = sink.getEventList().iterator();
+ assertEquals( "verbatim", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "verbatim_", ( (SinkEventElement) it.next() ).getName()
);
+ assertFalse( it.hasNext() );
+ text = "<source><![CDATA[<source>what</source>]]></source>";
+ sink.reset();
+ parser.parse( text, sink );
+
+ it = sink.getEventList().iterator();
assertEquals( "verbatim", ( (SinkEventElement) it.next() ).getName() );
+ assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
assertEquals( "verbatim_", ( (SinkEventElement) it.next() ).getName()
);
assertFalse( it.hasNext() );
}
Modified:
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
(original)
+++
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
Tue Mar 10 15:48:59 2009
@@ -56,16 +56,7 @@
SinkEventAttributeSet attribs = getAttributesFromParser( parser );
- if ( isVerbatim() )
- {
- if ( parser.getName().equals( Tag.PRE.toString() ) )
- {
- verbatim();
- }
-
- sink.text( parser.getText() );
- }
- else if ( parser.getName().equals( Tag.HTML.toString() ) )
+ if ( parser.getName().equals( Tag.HTML.toString() ) )
{
//Do nothing
return;
@@ -142,7 +133,7 @@
{
if ( boxed )
{
- attribs.addAttribute( SinkEventAttributeSet.DECORATION,
"boxed" );
+ attribs.addAttributes( SinkEventAttributeSet.BOXED );
}
verbatim();
@@ -175,27 +166,7 @@
protected void handleEndTag( XmlPullParser parser, Sink sink )
throws XmlPullParserException, MacroExecutionException
{
- if ( isVerbatim() )
- {
- if ( parser.getName().equals( Tag.PRE.toString() ) )
- {
- verbatim_();
-
- if ( isVerbatim() )
- {
- sink.text( parser.getText() );
- }
- else
- {
- sink.verbatim_();
- }
- }
- else
- {
- sink.text( parser.getText() );
- }
- }
- else if ( parser.getName().equals( Tag.HTML.toString() ) )
+ if ( parser.getName().equals( Tag.HTML.toString() ) )
{
//Do nothing
return;
Modified:
maven/doxia/doxia/trunk/doxia-sink-api/src/main/java/org/apache/maven/doxia/sink/Sink.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-sink-api/src/main/java/org/apache/maven/doxia/sink/Sink.java?rev=752148&r1=752147&r2=752148&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-sink-api/src/main/java/org/apache/maven/doxia/sink/Sink.java
(original)
+++
maven/doxia/doxia/trunk/doxia-sink-api/src/main/java/org/apache/maven/doxia/sink/Sink.java
Tue Mar 10 15:48:59 2009
@@ -1081,6 +1081,17 @@
* Starts a verbatim block, ie a block where whitespace has semantic
relevance.
*
* <p>
+ * Text in a verbatim block must only be wrapped at the linebreaks in
the source,
+ * and spaces should not be collapsed. It should be displayed in a
fixed-width font to
+ * retain the formatting but the overall size may be chosen by the
implementation.
+ * </p>
+ *
+ * <p>
+ * Most Sink events may be emitted within a verbatim block, the only
elements explicitly
+ * forbidden are font-changing events and figures. Also, verbatim blocks
may not be nested.
+ * </p>
+ *
+ * <p>
* Supported attributes are the {...@link SinkEventAttributes base
attributes} plus:
* </p>
* <blockquote>