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 &lt;pre&gt; tag is encountered. */
-    private int verbatimLevel;
+    /** Verbatim flag, true whenever we are inside a &lt;pre&gt; 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 
&lt;pre&gt; tag increases the level.
+     * Start verbatim mode.
      */
     protected void verbatim()
     {
-        verbatimLevel++;
+        this.inVerbatim = true;
     }
 
     /**
-     * Checks if we are currently insid a &lt;pre&gt; tag.
+     * Checks if we are currently inside a &lt;pre&gt; 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>


Reply via email to