Author: ltheussl
Date: Wed Oct 10 13:32:23 2007
New Revision: 583606
URL: http://svn.apache.org/viewvc?rev=583606&view=rev
Log:
Handle sections and tables in analogy to xdoc parser.
Modified:
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
Modified:
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
URL:
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java?rev=583606&r1=583605&r2=583606&view=diff
==============================================================================
---
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
(original)
+++
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xhtml/src/main/java/org/apache/maven/doxia/module/xhtml/XhtmlParser.java
Wed Oct 10 13:32:23 2007
@@ -50,13 +50,6 @@
private Stack linktypes = new Stack();
/**
- * This stack is needed to keep track of the section nesting. Each time
- * a lower section heading is encounted, this stack raises, each time a
- * higher section heading is encountered, this stack lowers.
- */
- private Stack sections = new Stack();
-
- /**
* Indicates the last a-tag denoted a link
*/
private static final String LINK = "link";
@@ -69,6 +62,12 @@
/** Used for nested lists. */
private int orderedListDepth = 0;
+ /** For tables. */
+ private boolean hasCaption;
+
+ /** Counts section level. */
+ private int sectionLevel;
+
/** [EMAIL PROTECTED] */
protected void handleStartTag( XmlPullParser parser, Sink sink )
throws XmlPullParserException, MacroExecutionException
@@ -90,15 +89,45 @@
{
sink.body();
}
- else if ( parser.getName().equals( Tag.H1.toString() ) ||
parser.getName().equals( Tag.H2.toString() ) ||
- parser.getName().equals( Tag.H3.toString() ) ||
parser.getName().equals( Tag.H4.toString() ) ||
- parser.getName().equals( Tag.H5.toString() ) )
- {
- this.closeSubordinatedSections( parser.getName(), sink );
- this.startSection( this.sections.size(), sink );
- this.startSectionTitle( this.sections.size(), sink );
- this.sections.push( parser.getName() );
+ else if ( parser.getName().equals( Tag.H2.toString() ) )
+ {
+ closeOpenSections( Sink.SECTION_LEVEL_1, sink );
+
+ sink.section1();
+
+ sink.sectionTitle1();
+ }
+ else if ( parser.getName().equals( Tag.H3.toString() ) )
+ {
+ closeOpenSections( Sink.SECTION_LEVEL_2, sink );
+
+ sink.section2();
+
+ sink.sectionTitle2();
+ }
+ else if ( parser.getName().equals( Tag.H4.toString() ) )
+ {
+ closeOpenSections( Sink.SECTION_LEVEL_3, sink );
+
+ sink.section3();
+ sink.sectionTitle3();
+ }
+ else if ( parser.getName().equals( Tag.H5.toString() ) )
+ {
+ closeOpenSections( Sink.SECTION_LEVEL_4, sink );
+
+ sink.section4();
+
+ sink.sectionTitle4();
+ }
+ else if ( parser.getName().equals( Tag.H6.toString() ) )
+ {
+ closeOpenSections( Sink.SECTION_LEVEL_5, sink );
+
+ sink.section5();
+
+ sink.sectionTitle5();
}
else if ( parser.getName().equals( Tag.P.toString() ) )
{
@@ -261,6 +290,30 @@
else if ( parser.getName().equals( Tag.TABLE.toString() ) )
{
sink.table();
+
+ String border = parser.getAttributeValue( null,
Attribute.BORDER.toString() );
+
+ boolean grid = true;
+
+ if ( "0".equals( border ) )
+ {
+ grid = false;
+ }
+
+ String align = parser.getAttributeValue( null,
Attribute.ALIGN.toString() );
+
+ int[] justif = { JUSTIFY_CENTER };
+
+ if ( "left".equals( align ) )
+ {
+ justif[0] = JUSTIFY_LEFT;
+ }
+ else if ( "right".equals( align ) )
+ {
+ justif[0] = JUSTIFY_RIGHT;
+ }
+
+ sink.tableRows( justif, grid );
}
else if ( parser.getName().equals( Tag.TR.toString() ) )
{
@@ -268,11 +321,33 @@
}
else if ( parser.getName().equals( Tag.TH.toString() ) )
{
- sink.tableCell();
+ String colspan = parser.getAttributeValue( null,
Attribute.COLSPAN.toString() );
+ if ( colspan == null )
+ {
+ sink.tableHeaderCell();
+ }
+ else
+ {
+ sink.tableHeaderCell( colspan );
+ }
}
else if ( parser.getName().equals( Tag.TD.toString() ) )
{
- sink.tableCell();
+ String colspan = parser.getAttributeValue( null,
Attribute.COLSPAN.toString() );
+ if ( colspan == null )
+ {
+ sink.tableCell();
+ }
+ else
+ {
+ sink.tableCell( colspan );
+ }
+ }
+ else if ( parser.getName().equals( Tag.CAPTION.toString() ) )
+ {
+ sink.tableRows_();
+ this.hasCaption = true;
+ sink.tableCaption();
}
}
@@ -290,16 +365,10 @@
}
else if ( parser.getName().equals( Tag.BODY.toString() ) )
{
- //close all sections that are still open
- closeSubordinatedSections( "h0", sink );
+ closeOpenSections( 0, sink );
+
sink.body_();
}
- else if ( parser.getName().equals( Tag.H1.toString() ) ||
parser.getName().equals( Tag.H2.toString() ) ||
- parser.getName().equals( Tag.H3.toString() ) ||
parser.getName().equals( Tag.H4.toString() ) ||
- parser.getName().equals( Tag.H5.toString() ) )
- {
- this.closeSectionTitle( this.sections.size() - 1, sink );
- }
else if ( parser.getName().equals( Tag.P.toString() ) )
{
sink.paragraph_();
@@ -377,6 +446,13 @@
else if ( parser.getName().equals( Tag.TABLE.toString() ) )
{
+ if ( !hasCaption )
+ {
+ sink.tableRows_();
+ }
+
+ this.hasCaption = false;
+
sink.table_();
}
else if ( parser.getName().equals( Tag.TR.toString() ) )
@@ -385,12 +461,36 @@
}
else if ( parser.getName().equals( Tag.TH.toString() ) )
{
- sink.tableCell_();
+ sink.tableHeaderCell_();
}
else if ( parser.getName().equals( Tag.TD.toString() ) )
{
sink.tableCell_();
}
+ else if ( parser.getName().equals( Tag.CAPTION.toString() ) )
+ {
+ sink.tableCaption_();
+ }
+ else if ( parser.getName().equals( Tag.H2.toString() ) )
+ {
+ sink.sectionTitle1_();
+ }
+ else if ( parser.getName().equals( Tag.H3.toString() ) )
+ {
+ sink.sectionTitle2_();
+ }
+ else if ( parser.getName().equals( Tag.H4.toString() ) )
+ {
+ sink.sectionTitle3_();
+ }
+ else if ( parser.getName().equals( Tag.H5.toString() ) )
+ {
+ sink.sectionTitle4_();
+ }
+ else if ( parser.getName().equals( Tag.H6.toString() ) )
+ {
+ sink.sectionTitle5_();
+ }
}
/** [EMAIL PROTECTED] */
@@ -460,131 +560,41 @@
// Private methods
// ----------------------------------------------------------------------
- private void closeSubordinatedSections( String level, Sink sink )
- {
- if ( this.sections.size() > 0 )
- {
- String heading = (String) this.sections.peek();
- int otherlevel = Integer.parseInt( heading.substring( 1 ) );
- int mylevel = Integer.parseInt( level.substring( 1 ) );
- if ( otherlevel >= mylevel )
- {
- closeSection( this.sections.size(), sink );
- closeSubordinatedSections( level, sink );
- }
- }
- }
-
/**
- * Close a section of the specified level.
+ * Close open sections. The current level is set to newLevel afterwards.
*
- * @param level level of the section to close
- * @param sink the sink to write to
+ * @param newLevel the new section level, all upper levels have to be
closed.
+ * @param sink the sink to receive the events.
*/
- private void closeSection( int level, Sink sink )
+ private void closeOpenSections( int newLevel, Sink sink )
{
- this.sections.pop();
- switch ( level )
+ while ( this.sectionLevel >= newLevel )
{
- case 1:
- sink.section1_();
- break;
- case 2:
- sink.section2_();
- break;
- case 3:
- sink.section3_();
- break;
- case 4:
- sink.section4_();
- break;
- case 5:
+ if ( sectionLevel == Sink.SECTION_LEVEL_5)
+ {
sink.section5_();
- break;
- }
- }
+ }
+ else if ( sectionLevel == Sink.SECTION_LEVEL_4)
+ {
+ sink.section4_();
+ }
+ else if ( sectionLevel == Sink.SECTION_LEVEL_3)
+ {
+ sink.section3_();
+ }
+ else if ( sectionLevel == Sink.SECTION_LEVEL_2)
+ {
+ sink.section2_();
+ }
+ else if ( sectionLevel == Sink.SECTION_LEVEL_1)
+ {
+ sink.section1_();
+ }
- /**
- * Starts a new section of the specified level
- *
- * @param level level of the new section
- * @param sink the sink to write to
- */
- private void startSection( int level, Sink sink )
- {
- switch ( level )
- {
- case 0:
- sink.section1();
- break;
- case 1:
- sink.section2();
- break;
- case 2:
- sink.section3();
- break;
- case 3:
- sink.section4();
- break;
- case 4:
- sink.section5();
- break;
+ this.sectionLevel--;
}
- }
- /**
- * Closes the title of a section
- *
- * @param level level of the section
- * @param sink the sink to write to
- */
- private void closeSectionTitle( int level, Sink sink )
- {
- switch ( level )
- {
- case 0:
- sink.sectionTitle1_();
- break;
- case 1:
- sink.sectionTitle2_();
- break;
- case 2:
- sink.sectionTitle3_();
- break;
- case 3:
- sink.sectionTitle4_();
- break;
- case 4:
- sink.sectionTitle5_();
- break;
- }
+ this.sectionLevel = newLevel;
}
- /**
- * Starts the title of a new section
- *
- * @param level level of the new section
- * @param sink the sink to write to
- */
- private void startSectionTitle( int level, Sink sink )
- {
- switch ( level )
- {
- case 0:
- sink.sectionTitle1();
- break;
- case 1:
- sink.sectionTitle2();
- break;
- case 2:
- sink.sectionTitle3();
- break;
- case 3:
- sink.sectionTitle4();
- break;
- case 4:
- sink.sectionTitle5();
- break;
- }
- }
}