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] ); + } }