Author: ltheussl
Date: Mon May 18 11:50:49 2009
New Revision: 775908

URL: http://svn.apache.org/viewvc?rev=775908&view=rev
Log:
Clean up comment, entity and cdata handling in FmlParser. Add test case for 
entities.

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

Modified: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.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/FmlParser.java?rev=775908&r1=775907&r2=775908&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java
 Mon May 18 11:50:49 2009
@@ -275,23 +275,29 @@
     protected void handleText( XmlPullParser parser, Sink sink )
         throws XmlPullParserException
     {
-        if ( buffer != null && parser.getText() != null )
+        if ( inQuestion || inAnswer )
         {
             buffer.append( parser.getText() );
         }
+        // only text contents in fml files are within <question> or <answer>,
+        // except <title> which is registered via nextText().
     }
 
     /** {...@inheritdoc} */
     protected void handleCdsect( XmlPullParser parser, Sink sink )
         throws XmlPullParserException
     {
-        if ( buffer != null && parser.getText() != null )
+        String cdSection = parser.getText();
+
+        if ( inQuestion || inAnswer )
+        {
+            buffer.append( LESS_THAN ).append( BANG ).append( 
LEFT_SQUARE_BRACKET ).append( CDATA )
+                    .append( LEFT_SQUARE_BRACKET ).append( cdSection ).append( 
RIGHT_SQUARE_BRACKET )
+                    .append( RIGHT_SQUARE_BRACKET ).append( GREATER_THAN );
+        }
+        else
         {
-            buffer.append( String.valueOf( LESS_THAN ) ).append( 
String.valueOf( BANG ) )
-                .append( String.valueOf( LEFT_SQUARE_BRACKET ) ).append( 
String.valueOf( CDATA ) )
-                .append( String.valueOf( LEFT_SQUARE_BRACKET ) ).append( 
parser.getText() )
-                .append( String.valueOf( RIGHT_SQUARE_BRACKET ) )
-                .append( String.valueOf( RIGHT_SQUARE_BRACKET ) ).append( 
String.valueOf( GREATER_THAN ) );
+            sink.text( cdSection );
         }
     }
 
@@ -299,17 +305,42 @@
     protected void handleComment( XmlPullParser parser, Sink sink )
         throws XmlPullParserException
     {
-        sink.comment( parser.getText().trim() );
+        String comment = parser.getText();
+
+        if ( inQuestion || inAnswer )
+        {
+            buffer.append( LESS_THAN ).append( BANG ).append( MINUS ).append( 
MINUS )
+                    .append( comment ).append( MINUS ).append( MINUS ).append( 
GREATER_THAN );
+        }
+        else
+        {
+            sink.comment( comment.trim() );
+        }
     }
 
     /** {...@inheritdoc} */
     protected void handleEntity( XmlPullParser parser, Sink sink )
         throws XmlPullParserException
     {
-        if ( buffer != null && parser.getText() != null )
+        if ( inQuestion || inAnswer )
+        {
+            if ( buffer != null && parser.getText() != null )
+            {
+                String text = parser.getText();
+
+                // parser.getText() returns the entity replacement text
+                // (&lt; -> <), need to re-escape them
+                if ( text.length() == 1 )
+                {
+                    text = HtmlTools.escapeHTML( text );
+                }
+
+                buffer.append( text );
+            }
+        }
+        else
         {
-            // TODO: why are entities HTML-escaped?
-            buffer.append( HtmlTools.escapeHTML( parser.getText() ) );
+            super.handleEntity( parser, sink );
         }
     }
 

Modified: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java?rev=775908&r1=775907&r2=775908&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/test/java/org/apache/maven/doxia/module/fml/FmlParserTest.java
 Mon May 18 11:50:49 2009
@@ -114,7 +114,7 @@
         assertEquals( "link", ( (SinkEventElement) it.next() ).getName() );
         assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
         assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
-        assertEquals( "paragraph_", ( (SinkEventElement) it.next() ).getName() 
);        
+        assertEquals( "paragraph_", ( (SinkEventElement) it.next() ).getName() 
);
         assertEquals( "definition_", ( (SinkEventElement) it.next() 
).getName() );
         assertEquals( "definitionList_", ( (SinkEventElement) it.next() 
).getName() );
         assertEquals( "section1_", ( (SinkEventElement) it.next() ).getName() 
);
@@ -122,4 +122,108 @@
         assertFalse( it.hasNext() );
     }
 
+    /** @throws Exception  */
+    public void testEntities()
+        throws Exception
+    {
+        final String text = "<!DOCTYPE test [<!ENTITY Alpha \"&#913;\">]>"
+                + "<faqs title=\"&amp;&Alpha;\"><part 
id=\"General\"><title>&lt;&Alpha;</title>"
+                + "<faq id=\"id\"><question>&gt;&Alpha;</question>"
+                + 
"<answer><p><code>&lt;img&gt;</code>&quot;&Alpha;</p></answer>"
+                + "</faq></part></faqs>";
+
+        SinkEventTestingSink sink = new SinkEventTestingSink();
+        FmlParser parser = (FmlParser) createParser();
+
+        parser.setValidate( false );
+        parser.parse( text, sink );
+
+        Iterator it = sink.getEventList().iterator();
+
+        assertEquals( "head", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "title", ( (SinkEventElement) it.next() ).getName() );
+
+        // head title TODO: should be two events
+        assertTextEvent( (SinkEventElement) it.next(), "&&#913;" );
+
+        assertEquals( "title_", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "head_", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "body", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "section1", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "sectionTitle1", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "anchor", ( (SinkEventElement) it.next() ).getName() );
+
+        // faq title TODO: should be two events
+        assertTextEvent( (SinkEventElement) it.next(), "&&#913;" );
+
+        assertEquals( "anchor_", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "sectionTitle1_", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "paragraph", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "bold", ( (SinkEventElement) it.next() ).getName() );
+
+        // part title in TOC TODO: should be two events
+        assertTextEvent( (SinkEventElement) it.next(), "<&#913;" );
+
+        assertEquals( "bold_", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "paragraph_", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "numberedList", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "numberedListItem", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "link", ( (SinkEventElement) it.next() ).getName() );
+
+        // question in TOC
+        assertTextEvent( (SinkEventElement) it.next(), ">" );
+        assertTextEvent( (SinkEventElement) it.next(), "\u0391" );
+
+        assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "numberedListItem_", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "numberedList_", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "section1_", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "section1", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "sectionTitle1", ( (SinkEventElement) it.next() 
).getName() );
+
+        // part title TODO: should be two events
+        assertTextEvent( (SinkEventElement) it.next(), "<&#913;" );
+
+        assertEquals( "sectionTitle1_", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "definitionList", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "definedTerm", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "anchor", ( (SinkEventElement) it.next() ).getName() );
+
+        // question
+        assertTextEvent( (SinkEventElement) it.next(), ">" );
+        assertTextEvent( (SinkEventElement) it.next(), "\u0391" );
+
+        assertEquals( "anchor_", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "definedTerm_", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "definition", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "paragraph", ( (SinkEventElement) it.next() ).getName() 
);
+
+        // answer
+        assertEquals( "monospaced", ( (SinkEventElement) it.next() ).getName() 
);
+        assertTextEvent( (SinkEventElement) it.next(), "<" );
+        assertTextEvent( (SinkEventElement) it.next(), "img" );
+        assertTextEvent( (SinkEventElement) it.next(), ">" );
+        assertEquals( "monospaced_", ( (SinkEventElement) it.next() 
).getName() );
+        assertTextEvent( (SinkEventElement) it.next(), "\"" );
+        assertTextEvent( (SinkEventElement) it.next(), "\u0391" );
+
+        assertEquals( "paragraph_", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "paragraph", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "link", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "text", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
+        assertEquals( "paragraph_", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "definition_", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "definitionList_", ( (SinkEventElement) it.next() 
).getName() );
+        assertEquals( "section1_", ( (SinkEventElement) it.next() ).getName() 
);
+        assertEquals( "body_", ( (SinkEventElement) it.next() ).getName() );
+
+        assertFalse( it.hasNext() );
+    }
+
+    private void assertTextEvent( SinkEventElement textEvt, String string )
+    {
+        assertEquals( "text", textEvt.getName() );
+        assertEquals( string, textEvt.getArgs()[0] );
+    }
 }


Reply via email to