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