You are viewing a plain text version of this content. The canonical link for it is here.
Posted to doxia-commits@maven.apache.org by vs...@apache.org on 2006/08/23 22:13:00 UTC

svn commit: r434153 - /maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java

Author: vsiveton
Date: Wed Aug 23 13:13:00 2006
New Revision: 434153

URL: http://svn.apache.org/viewvc?rev=434153&view=rev
Log:
MNG-2475: Need to finish escaping html in http://maven.apache.org/general.html#Compiling-J2SE-5

o fixed the bug if <source>...<source>1.5</source> ..</source> is found in the answer
o used the XmlPullParser to handle that

Modified:
    maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java

Modified: maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java
URL: http://svn.apache.org/viewvc/maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java?rev=434153&r1=434152&r2=434153&view=diff
==============================================================================
--- maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java (original)
+++ maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java Wed Aug 23 13:13:00 2006
@@ -16,6 +16,10 @@
  * limitations under the License.
  */
 
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Iterator;
+
 import org.apache.maven.doxia.module.HtmlTools;
 import org.apache.maven.doxia.module.fml.model.Faq;
 import org.apache.maven.doxia.module.fml.model.Faqs;
@@ -27,9 +31,6 @@
 import org.codehaus.plexus.util.xml.pull.MXParser;
 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
 
-import java.io.Reader;
-import java.util.Iterator;
-
 /**
  * Parse a fml model and emit events into the specified doxia Sink.
  *
@@ -41,6 +42,9 @@
 public class FmlParser
     implements Parser
 {
+    /**
+     * @see org.apache.maven.doxia.parser.Parser#parse(java.io.Reader, org.apache.maven.doxia.sink.Sink)
+     */
     public void parse( Reader reader, Sink sink )
         throws ParseException
     {
@@ -55,15 +59,23 @@
         }
         catch ( Exception ex )
         {
-            throw new ParseException( "Error parsing the model.", ex );
+            throw new ParseException( "Error parsing the model: " + ex.getMessage(), ex );
         }
 
-        createSink( faqs, sink );
+        try
+        {
+            createSink( faqs, sink );
+        }
+        catch ( Exception e )
+        {
+            throw new ParseException( "Error creating sink: " + e.getMessage(), e );
+        }
     }
 
     /**
      * @param parser
      * @param sink
+     * @return Faqs
      * @throws Exception
      */
     public Faqs parseFml( XmlPullParser parser, Sink sink )
@@ -244,7 +256,13 @@
         return faqs;
     }
 
+    /**
+     * @param faqs
+     * @param sink
+     * @throws Exception
+     */
     private void createSink( Faqs faqs, Sink sink )
+        throws Exception
     {
         sink.head();
         sink.title();
@@ -335,18 +353,18 @@
         sink.body_();
     }
 
+    /**
+     * @param sink
+     * @param answer
+     * @throws Exception
+     */
     private void writeAnswer( Sink sink, String answer )
+        throws Exception
     {
         int startSource = answer.indexOf( "<source>" );
-        int endSource = answer.indexOf( "</source>" );
         if ( startSource != -1 )
         {
-            sink.rawText( answer.substring( 0, startSource ) );
-            sink.verbatim( true );
-            sink.text( answer.substring( startSource + "<source>".length(), endSource ) );
-            sink.verbatim_();
-            // need to write the end of answer that can contain other source tag
-            writeAnswer( sink, answer.substring( endSource + "</source>".length() ) );
+            writeAnswerWithSource( sink, answer );
         }
         else
         {
@@ -354,6 +372,9 @@
         }
     }
 
+    /**
+     * @param sink
+     */
     private void writeTopLink( Sink sink )
     {
         sink.rawText( "<table border=\"0\">" );
@@ -365,5 +386,94 @@
 
         sink.rawText( "</td></tr>" );
         sink.rawText( "</table>" );
+    }
+
+    /**
+     * @param sink
+     * @param answer
+     * @throws Exception
+     */
+    private void writeAnswerWithSource( Sink sink, String answer )
+        throws Exception
+    {
+        XmlPullParser parser = new MXParser();
+        parser.setInput( new StringReader( "<answer>" + answer + "</answer>" ) );
+
+        int countSource = 0;
+        int eventType = parser.getEventType();
+
+        while ( eventType != XmlPullParser.END_DOCUMENT )
+        {
+            if ( eventType == XmlPullParser.START_TAG )
+            {
+                if ( parser.getName().equals( "source" ) && countSource == 0 )
+                {
+                    sink.verbatim( true );
+                    countSource++;
+                }
+                else if ( parser.getName().equals( "source" ) )
+                {
+                    sink.rawText( HtmlTools.escapeHTML( "<" + parser.getName() + ">" ) );
+                    countSource++;
+                }
+                else if ( parser.getName().equals( "answer" ) )
+                {
+                    // nop
+                }
+                else
+                {
+                    if ( countSource > 0 )
+                    {
+                        sink.rawText( HtmlTools.escapeHTML( "<" + parser.getName() + ">" ) );
+                    }
+                    else
+                    {
+                        sink.rawText( "<" + parser.getName() + ">" );
+                    }
+                }
+            }
+            else if ( eventType == XmlPullParser.END_TAG )
+            {
+                if ( parser.getName().equals( "source" ) && countSource == 1 )
+                {
+                    countSource--;
+                    sink.verbatim_();
+                }
+                else if ( parser.getName().equals( "source" ) )
+                {
+                    sink.rawText( HtmlTools.escapeHTML( "</" + parser.getName() + ">" ) );
+                    countSource--;
+                }
+                else if ( parser.getName().equals( "answer" ) )
+                {
+                    // nop
+                }
+                else
+                {
+                    if ( countSource > 0 )
+                    {
+                        sink.rawText( HtmlTools.escapeHTML( "</" + parser.getName() + ">" ) );
+                    }
+                    else
+                    {
+                        sink.rawText( "</" + parser.getName() + ">" );
+                    }
+                }
+            }
+            else if ( eventType == XmlPullParser.CDSECT )
+            {
+                sink.rawText( HtmlTools.escapeHTML( parser.getText() ) );
+            }
+            else if ( eventType == XmlPullParser.TEXT )
+            {
+                sink.rawText( HtmlTools.escapeHTML( parser.getText() ) );
+            }
+            else if ( eventType == XmlPullParser.ENTITY_REF )
+            {
+                sink.rawText( HtmlTools.escapeHTML( parser.getText() ) );
+            }
+
+            eventType = parser.nextToken();
+        }
     }
 }