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