Author: ltheussl
Date: Sat Nov  3 14:01:48 2007
New Revision: 591688

URL: http://svn.apache.org/viewvc?rev=591688&view=rev
Log:
[DOXIA-148] Remove html specifics, use XhtmlBaseParser.

Added:
    
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
   (with props)
    
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlMarkup.java
   (with props)
Modified:
    
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlParser.java

Added: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.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/FmlContentParser.java?rev=591688&view=auto
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
 (added)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
 Sat Nov  3 14:01:48 2007
@@ -0,0 +1,67 @@
+package org.apache.maven.doxia.module.fml;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.doxia.macro.MacroExecutionException;
+import org.apache.maven.doxia.parser.XhtmlBaseParser;
+import org.apache.maven.doxia.sink.Sink;
+
+import org.codehaus.plexus.util.xml.pull.XmlPullParser;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+/**
+ * Parse Fml questions and answers, these may contain arbitrary xdoc elements.
+ *
+ * @author ltheussl
+ * @version $Id$
+ * @since 1.0
+ */
+public class FmlContentParser
+    extends XhtmlBaseParser
+    implements FmlMarkup
+{
+    /** [EMAIL PROTECTED] */
+    protected void handleStartTag( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException, MacroExecutionException
+    {
+        if ( parser.getName().equals( SOURCE_TAG.toString() ) )
+        {
+            sink.verbatim( true );
+        }
+        else if ( !baseStartTag( parser, sink ) )
+        {
+            // TODO: log( "Unrecognized start tag!" );
+        }
+    }
+
+    /** [EMAIL PROTECTED] */
+    protected void handleEndTag( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException, MacroExecutionException
+    {
+        if ( parser.getName().equals( SOURCE_TAG.toString() ) )
+        {
+            sink.verbatim_();
+        }
+        else if ( !baseEndTag( parser, sink ) )
+        {
+            // TODO: log( "Unrecognized end tag!" );
+        }
+    }
+}

Propchange: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlContentParser.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlMarkup.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/FmlMarkup.java?rev=591688&view=auto
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlMarkup.java
 (added)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlMarkup.java
 Sat Nov  3 14:01:48 2007
@@ -0,0 +1,102 @@
+package org.apache.maven.doxia.module.fml;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import javax.swing.text.html.HTML.Tag;
+
+import org.apache.maven.doxia.markup.XmlMarkup;
+
+/**
+ * List of <code>FML</code> markups.
+ * <br/>
+ * FML uses several  [EMAIL PROTECTED] javax.swing.text.html.HTML.Tag} and 
[EMAIL PROTECTED] javax.swing.text.html.HTML.Attribute}
+ * as markups and custom tags.
+ *
+ * @author ltheussl
+ * @version $Id$
+ * @since 1.0
+ */
+public interface FmlMarkup
+    extends XmlMarkup
+{
+    // ----------------------------------------------------------------------
+    // Specific Fml tags
+    // ----------------------------------------------------------------------
+
+    /** Fml tag for <code>faqs</code> */
+    Tag FAQS_TAG = new Tag()
+    {
+        /** [EMAIL PROTECTED] */
+        public String toString()
+        {
+            return "faqs";
+        }
+    };
+
+    /** Fml tag for <code>part</code> */
+    Tag PART_TAG = new Tag()
+    {
+        /** [EMAIL PROTECTED] */
+        public String toString()
+        {
+            return "part";
+        }
+    };
+
+    /** Fml tag for <code>faq</code> */
+    Tag FAQ_TAG = new Tag()
+    {
+        /** [EMAIL PROTECTED] */
+        public String toString()
+        {
+            return "faq";
+        }
+    };
+
+    /** Fml tag for <code>question</code> */
+    Tag QUESTION_TAG = new Tag()
+    {
+        /** [EMAIL PROTECTED] */
+        public String toString()
+        {
+            return "question";
+        }
+    };
+
+    /** Fml tag for <code>answer</code> */
+    Tag ANSWER_TAG = new Tag()
+    {
+        /** [EMAIL PROTECTED] */
+        public String toString()
+        {
+            return "answer";
+        }
+    };
+
+    /** Fml tag for <code>source</code> */
+    Tag SOURCE_TAG = new Tag()
+    {
+        /** [EMAIL PROTECTED] */
+        public String toString()
+        {
+            return "source";
+        }
+    };
+}

Propchange: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlMarkup.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-fml/src/main/java/org/apache/maven/doxia/module/fml/FmlMarkup.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

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=591688&r1=591687&r2=591688&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
 Sat Nov  3 14:01:48 2007
@@ -24,13 +24,20 @@
 import java.io.StringReader;
 import java.util.Iterator;
 
-import org.apache.maven.doxia.util.HtmlTools;
+import javax.swing.text.html.HTML.Attribute;
+import javax.swing.text.html.HTML.Tag;
+
+import org.apache.maven.doxia.macro.MacroExecutionException;
 import org.apache.maven.doxia.module.fml.model.Faq;
 import org.apache.maven.doxia.module.fml.model.Faqs;
 import org.apache.maven.doxia.module.fml.model.Part;
+import org.apache.maven.doxia.parser.AbstractXmlParser;
 import org.apache.maven.doxia.parser.ParseException;
 import org.apache.maven.doxia.parser.Parser;
+import org.apache.maven.doxia.parser.XhtmlBaseParser;
 import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.doxia.util.HtmlTools;
+
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.MXParser;
 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
@@ -40,38 +47,44 @@
  * Parse a fml model and emit events into the specified doxia Sink.
  *
  * @author <a href="mailto:[EMAIL PROTECTED]">Emmanuel Venisse</a>
+ * @author ltheussl
  * @version $Id$
  * @since 1.0
- * @plexus.component role-hint="fml"
+ * @plexus.component role="org.apache.maven.doxia.parser.Parser" 
role-hint="fml"
  */
 public class FmlParser
-    implements Parser
+    extends AbstractXmlParser
+    implements FmlMarkup
 {
+    /** Collect a faqs model. */
+    private final Faqs faqs = new Faqs();
+
+    /** Collect a part. */
+    private Part currentPart;
+
+    /** Collect a single faq. */
+    private Faq currentFaq;
+
+    /** An indication on if we're inside a question. */
+    private boolean inQuestion;
+
+    /** An indication on if we're inside an answer. */
+    private boolean inAnswer;
+
+    /** Used to collect text events. */
+    private StringBuffer buffer;
+
+
     /** [EMAIL PROTECTED] */
     public void parse( Reader reader, Sink sink )
         throws ParseException
     {
-        Faqs faqs;
-        try
-        {
-            XmlPullParser parser = new MXParser();
-
-            parser.setInput( reader );
-
-            faqs = parseFml( parser, sink );
-        }
-        catch ( XmlPullParserException ex )
-        {
-            throw new ParseException( "Error parsing the model: " + 
ex.getMessage(), ex );
-        }
-        catch ( IOException ex )
-        {
-            throw new ParseException( "Error reading the model: " + 
ex.getMessage(), ex );
-        }
+        // this populates faqs
+        super.parse( reader, sink );
 
         try
         {
-            createSink( faqs, sink );
+            writeFaqs( faqs, sink );
         }
         catch ( XmlPullParserException e )
         {
@@ -84,186 +97,183 @@
     }
 
     /** [EMAIL PROTECTED] */
-    public int getType()
-    {
-        return XML_TYPE;
-    }
-
-    /**
-     * Parses an fml and emits the events into the given sink.
-     *
-     * @param parser The parser to use.
-     * @param sink The sink to consume the event.
-     * @return Faqs The parsed faqs model.
-     * @throws IOException if the model cannot be read.
-     * @throws XmlPullParserException if the model cannot be parsed.
-     */
-    public Faqs parseFml( XmlPullParser parser, Sink sink )
-        throws IOException, XmlPullParserException
+    protected void handleStartTag( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException, MacroExecutionException
     {
-        Faqs faqs = new Faqs();
-
-        Part currentPart = null;
-
-        Faq currentFaq = null;
-
-        boolean inQuestion = false;
-
-        boolean inAnswer = false;
+        if ( parser.getName().equals( FAQS_TAG.toString() ) )
+        {
+            String title = parser.getAttributeValue( null, "title" );
 
-        StringBuffer buffer = null;
+            if ( title != null )
+            {
+                faqs.setTitle( title );
+            }
 
-        int eventType = parser.getEventType();
+            String toplink = parser.getAttributeValue( null, "toplink" );
 
-        while ( eventType != XmlPullParser.END_DOCUMENT )
-        {
-            if ( eventType == XmlPullParser.START_TAG )
+            if ( toplink != null )
             {
-                if ( parser.getName().equals( "faqs" ) )
-                {
-                    String title = parser.getAttributeValue( null, "title" );
-
-                    if ( title != null )
-                    {
-                        faqs.setTitle( title );
-                    }
-
-                    String toplink = parser.getAttributeValue( null, "toplink" 
);
-
-                    if ( toplink != null )
-                    {
-                        if ( toplink.equalsIgnoreCase( "true" ) )
-                        {
-                            faqs.setToplink( true );
-                        }
-                        else
-                        {
-                            faqs.setToplink( false );
-                        }
-                    }
-                }
-                else if ( parser.getName().equals( "part" ) )
-                {
-                    currentPart = new Part();
-                    currentPart.setId( parser.getAttributeValue( null, "id" ) 
);
-                }
-                else if ( parser.getName().equals( "title" ) )
-                {
-                    currentPart.setTitle( parser.nextText().trim() );
-                }
-                else if ( parser.getName().equals( "faq" ) )
+                if ( toplink.equalsIgnoreCase( "true" ) )
                 {
-                    currentFaq = new Faq();
-                    currentFaq.setId( parser.getAttributeValue( null, "id" ) );
+                    faqs.setToplink( true );
                 }
-                if ( parser.getName().equals( "question" ) )
-                {
-                    buffer = new StringBuffer();
-                    inQuestion = true;
-                }
-                else if ( parser.getName().equals( "answer" ) )
+                else
                 {
-                    buffer = new StringBuffer();
-                    inAnswer = true;
+                    faqs.setToplink( false );
                 }
-                else if ( inQuestion || inAnswer )
-                {
-                    buffer.append( "<" );
+            }
+        }
+        else if ( parser.getName().equals( PART_TAG.toString() ) )
+        {
+            currentPart = new Part();
 
-                    buffer.append( parser.getName() );
+            currentPart.setId( parser.getAttributeValue( null, 
Attribute.ID.toString() ) );
+        }
+        else if ( parser.getName().equals( Tag.TITLE.toString() ) )
+        {
+            try
+            {
+                currentPart.setTitle( parser.nextText().trim() );
+            }
+            catch ( IOException e )
+            {
+                throw new XmlPullParserException( "Error reading title: " + 
e.getMessage(), parser, e );
+            }
+        }
+        else if ( parser.getName().equals( FAQ_TAG.toString() ) )
+        {
+            currentFaq = new Faq();
 
-                    int count = parser.getAttributeCount();
+            currentFaq.setId( parser.getAttributeValue( null, 
Attribute.ID.toString() ) );
+        }
+        if ( parser.getName().equals( QUESTION_TAG.toString() ) )
+        {
+            buffer = new StringBuffer();
 
-                    for ( int i = 0; i < count; i++ )
-                    {
-                        buffer.append( " " );
+            buffer.append( String.valueOf( LESS_THAN ) ).append( 
parser.getName() )
+                .append( String.valueOf( GREATER_THAN ) );
 
-                        buffer.append( parser.getAttributeName( i ) );
+            inQuestion = true;
+        }
+        else if ( parser.getName().equals( ANSWER_TAG.toString() ) )
+        {
+            buffer = new StringBuffer();
 
-                        buffer.append( "=" );
+            buffer.append( String.valueOf( LESS_THAN ) ).append( 
parser.getName() )
+                .append( String.valueOf( GREATER_THAN ) );
 
-                        buffer.append( "\"" );
+            inAnswer = true;
+        }
+        else if ( inQuestion || inAnswer )
+        {
+            buffer.append( String.valueOf( LESS_THAN ) ).append( 
parser.getName() );
 
-                        buffer.append( HtmlTools.escapeHTML( 
parser.getAttributeValue( i ) ) );
+            int count = parser.getAttributeCount();
 
-                        buffer.append( "\"" );
-                    }
+            for ( int i = 0; i < count; i++ )
+            {
+                buffer.append( String.valueOf( SPACE ) ).append( 
parser.getAttributeName( i ) );
 
-                    buffer.append( ">" );
-                }
+                buffer.append( String.valueOf( EQUAL ) ).append( 
String.valueOf( QUOTE ) );
+
+                buffer.append( HtmlTools.escapeHTML( parser.getAttributeValue( 
i ) ) );
+
+                buffer.append( String.valueOf( QUOTE ) );
             }
-            else if ( eventType == XmlPullParser.END_TAG )
-            {
-                if ( parser.getName().equals( "faqs" ) )
-                {
-                    // Do nothing
-                }
-                else if ( parser.getName().equals( "part" ) )
-                {
-                    faqs.addPart( currentPart );
 
-                    currentPart = null;
-                }
-                else if ( parser.getName().equals( "faq" ) )
-                {
-                    currentPart.addFaq( currentFaq );
+            buffer.append( String.valueOf( GREATER_THAN ) );
+        }
+    }
 
-                    currentFaq = null;
-                }
-                if ( parser.getName().equals( "question" ) )
-                {
-                    currentFaq.setQuestion( buffer.toString() );
+    /** [EMAIL PROTECTED] */
+    protected void handleEndTag( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException, MacroExecutionException
+    {
+        if ( parser.getName().equals( FAQS_TAG.toString() ) )
+        {
+            // Do nothing
+        }
+        else if ( parser.getName().equals( PART_TAG.toString() ) )
+        {
+            faqs.addPart( currentPart );
 
-                    inQuestion = false;
-                }
-                else if ( parser.getName().equals( "answer" ) )
-                {
-                    currentFaq.setAnswer( buffer.toString() );
+            currentPart = null;
+        }
+        else if ( parser.getName().equals( FAQ_TAG.toString() ) )
+        {
+            currentPart.addFaq( currentFaq );
 
-                    inAnswer = false;
-                }
-                else if ( inQuestion || inAnswer )
-                {
-                    if ( buffer.charAt( buffer.length() - 1 ) == ' ' )
-                    {
-                        buffer.deleteCharAt( buffer.length() - 1 );
-                    }
+            currentFaq = null;
+        }
+        if ( parser.getName().equals( QUESTION_TAG.toString() ) )
+        {
+            buffer.append( String.valueOf( LESS_THAN ) ).append( 
String.valueOf( SLASH ) )
+                .append( parser.getName() ).append( String.valueOf( 
GREATER_THAN ) );
 
-                    buffer.append( "</" );
+            currentFaq.setQuestion( buffer.toString() );
 
-                    buffer.append( parser.getName() );
+            inQuestion = false;
+        }
+        else if ( parser.getName().equals( ANSWER_TAG.toString() ) )
+        {
+            buffer.append( String.valueOf( LESS_THAN ) ).append( 
String.valueOf( SLASH ) )
+                .append( parser.getName() ).append( String.valueOf( 
GREATER_THAN ) );
 
-                    buffer.append( ">" );
-                }
-            }
-            else if ( eventType == XmlPullParser.CDSECT )
-            {
-                if ( buffer != null && parser.getText() != null )
-                {
-                    buffer.append( "<![CDATA[" );
-                    buffer.append( parser.getText() );
-                    buffer.append( "]]>" );
-                }
-            }
-            else if ( eventType == XmlPullParser.TEXT )
-            {
-                if ( buffer != null && parser.getText() != null )
-                {
-                    buffer.append( parser.getText() );
-                }
-            }
-            else if ( eventType == XmlPullParser.ENTITY_REF )
+            currentFaq.setAnswer( buffer.toString() );
+
+            inAnswer = false;
+        }
+        else if ( inQuestion || inAnswer )
+        {
+            if ( buffer.charAt( buffer.length() - 1 ) == SPACE )
             {
-                if ( buffer != null && parser.getText() != null )
-                {
-                    buffer.append( HtmlTools.escapeHTML( parser.getText() ) );
-                }
+                buffer.deleteCharAt( buffer.length() - 1 );
             }
 
-            eventType = parser.nextToken();
+            buffer.append( String.valueOf( LESS_THAN ) ).append( 
String.valueOf( SLASH ) )
+                .append( parser.getName() ).append( String.valueOf( 
GREATER_THAN ) );
+        }
+    }
+
+    /** [EMAIL PROTECTED] */
+    protected void handleText( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException
+    {
+        if ( buffer != null && parser.getText() != null )
+        {
+            buffer.append( parser.getText() );
+        }
+    }
+
+    /** [EMAIL PROTECTED] */
+    protected void handleCdsect( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException
+    {
+        if ( buffer != null && parser.getText() != null )
+        {
+            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 ) );
         }
+    }
 
-        return faqs;
+    /** [EMAIL PROTECTED] */
+    protected void handleComment( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException
+    {
+        sink.comment( parser.getText().trim() );
+    }
+
+    /** [EMAIL PROTECTED] */
+    protected void handleEntity( XmlPullParser parser, Sink sink )
+        throws XmlPullParserException
+    {
+        if ( buffer != null && parser.getText() != null )
+        {
+            buffer.append( HtmlTools.escapeHTML( parser.getText() ) );
+        }
     }
 
     /**
@@ -273,10 +283,13 @@
      * @param sink The sink to consume the event.
      * @throws IOException if something goes wrong.
      * @throws XmlPullParserException if something goes wrong.
+     * @throws ParseException if something goes wrong.
      */
-    private void createSink( Faqs faqs, Sink sink )
-        throws IOException, XmlPullParserException
+    private void writeFaqs( Faqs faqs, Sink sink )
+        throws IOException, XmlPullParserException, ParseException
     {
+        FmlContentParser xdocParser = new FmlContentParser();
+
         sink.head();
         sink.title();
         sink.text( faqs.getTitle() );
@@ -298,6 +311,7 @@
         for ( Iterator partIterator = faqs.getParts().iterator(); 
partIterator.hasNext(); )
         {
             Part part = (Part) partIterator.next();
+
             if ( StringUtils.isNotEmpty( part.getTitle() ) )
             {
                 sink.paragraph();
@@ -308,17 +322,20 @@
             }
 
             sink.numberedList( Sink.NUMBERING_DECIMAL );
+
             for ( Iterator faqIterator = part.getFaqs().iterator(); 
faqIterator.hasNext(); )
             {
                 Faq faq = (Faq) faqIterator.next();
                 sink.numberedListItem();
-                sink.link( "#" + HtmlTools.encodeId( faq.getId() ) );
-                sink.rawText( faq.getQuestion() );
+                sink.link( faq.getId() );
+                xdocParser.parse( faq.getQuestion(), sink );
                 sink.link_();
                 sink.numberedListItem_();
             }
+
             sink.numberedList_();
         }
+
         sink.section1_();
 
         // 
----------------------------------------------------------------------
@@ -328,25 +345,30 @@
         for ( Iterator partIterator = faqs.getParts().iterator(); 
partIterator.hasNext(); )
         {
             Part part = (Part) partIterator.next();
+
             if ( StringUtils.isNotEmpty( part.getTitle() ) )
             {
                 sink.section1();
+
                 sink.sectionTitle1();
                 sink.text( part.getTitle() );
                 sink.sectionTitle1_();
             }
 
             sink.definitionList();
+
             for ( Iterator faqIterator = part.getFaqs().iterator(); 
faqIterator.hasNext(); )
             {
                 Faq faq = (Faq) faqIterator.next();
+
                 sink.definedTerm();
                 sink.anchor( faq.getId() );
-                sink.rawText( faq.getQuestion() );
+                xdocParser.parse( faq.getQuestion(), sink );
                 sink.anchor_();
                 sink.definedTerm_();
+
                 sink.definition();
-                writeAnswer( sink, faq.getAnswer() );
+                xdocParser.parse( faq.getAnswer(), sink );
 
                 if ( faqs.isToplink() )
                 {
@@ -357,8 +379,10 @@
                 {
                     sink.horizontalRule();
                 }
+
                 sink.definition_();
             }
+
             sink.definitionList_();
 
             if ( StringUtils.isNotEmpty( part.getTitle() ) )
@@ -371,156 +395,29 @@
     }
 
     /**
-     * Writes an answer to the sink.
-     *
-     * @param sink The sink to consume the event.
-     * @param answer The answer to be written.
-     * @throws IOException if something goes wrong.
-     * @throws XmlPullParserException if something goes wrong.
-     */
-    private void writeAnswer( Sink sink, String answer )
-        throws IOException, XmlPullParserException
-    {
-        int startSource = answer.indexOf( "<source>" );
-        if ( startSource != -1 )
-        {
-            writeAnswerWithSource( sink, answer );
-        }
-        else
-        {
-            sink.rawText( answer );
-        }
-    }
-
-    /**
      * Writes a toplink element.
      *
      * @param sink The sink to consume the event.
      */
     private void writeTopLink( Sink sink )
     {
-        sink.rawText( "<table border=\"0\">" );
-        sink.rawText( "<tr><td align=\"right\">" );
+        int[] justify = { Parser.JUSTIFY_RIGHT };
 
-        sink.link( "#top" );
-        sink.text( "[top]" );
-        sink.link_();
+        sink.table();
 
-        sink.rawText( "</td></tr>" );
-        sink.rawText( "</table>" );
-    }
-
-    /**
-     * Writes an answer to the sink that contains a <source> element.
-     *
-     * @param sink The sink to consume the event.
-     * @param answer The answer to be written.
-     * @throws IOException if something goes wrong.
-     * @throws XmlPullParserException if something goes wrong.
-     */
-    private void writeAnswerWithSource( Sink sink, String answer )
-        throws IOException, XmlPullParserException
-    {
-        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
-                    {
-                        StringBuffer buffer = new StringBuffer();
-                        buffer.append( "<" + parser.getName() );
-
-                        int count = parser.getAttributeCount();
-
-                        for ( int i = 0; i < count; i++ )
-                        {
-                            buffer.append( " " );
-
-                            buffer.append( parser.getAttributeName( i ) );
-
-                            buffer.append( "=" );
-
-                            buffer.append( "\"" );
+        sink.tableRows( justify, false );
 
-                            buffer.append( HtmlTools.escapeHTML( 
parser.getAttributeValue( i ) ) );
-
-                            buffer.append( "\"" );
-                        }
+        sink.tableRow();
+        sink.tableCell();
+        sink.link( "top" );
+        sink.text( "[top]" );
+        sink.link_();
+        sink.tableCell_();
+        sink.tableRow_();
 
-                        buffer.append( ">" );
+        sink.tableRows_();
 
-                        sink.rawText( buffer.toString() );
-                    }
-                }
-            }
-            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();
-        }
+        sink.table_();
     }
+
 }


Reply via email to