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
+ // (< -> <), 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 \"Α\">]>"
+ + "<faqs title=\"&Α\"><part
id=\"General\"><title><Α</title>"
+ + "<faq id=\"id\"><question>>Α</question>"
+ +
"<answer><p><code><img></code>"Α</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(), "&Α" );
+
+ 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(), "&Α" );
+
+ 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(), "<Α" );
+
+ 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(), "<Α" );
+
+ 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] );
+ }
}