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>