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