Author: ltheussl
Date: Sat Sep 22 11:22:11 2007
New Revision: 578469

URL: http://svn.apache.org/viewvc?rev=578469&view=rev
Log:
Fix table captions, numbered lists and sectionings beyond sub-sections.

Modified:
    
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
    
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocSink.java

Modified: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java?rev=578469&r1=578468&r2=578469&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java
 Sat Sep 22 11:22:11 2007
@@ -75,6 +75,12 @@
     /** The macro parameters. */
     private Map macroParameters = new HashMap();
 
+    /** For tables. */
+    private boolean hasCaption;
+
+    /** Counts section level. */
+    private int sectionLevel;
+
     /** [EMAIL PROTECTED] */
     public void parse( Reader source, Sink sink )
         throws ParseException
@@ -124,6 +130,8 @@
         }
         else if ( parser.getName().equals( SECTION_TAG.toString() ) )
         {
+            closeOpenSections( Sink.SECTION_LEVEL_1, sink );
+
             sink.section1();
 
             sink.sectionTitle1();
@@ -138,6 +146,8 @@
         }
         else if ( parser.getName().equals( SUBSECTION_TAG.toString() ) )
         {
+            closeOpenSections( Sink.SECTION_LEVEL_2, sink );
+
             sink.section2();
 
             sink.sectionTitle2();
@@ -150,17 +160,28 @@
 
             sink.sectionTitle2_();
         }
-        // TODO section3 section4 section5
         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() ) )
@@ -177,7 +198,36 @@
         }
         else if ( parser.getName().equals( Tag.OL.toString() ) )
         {
-            sink.numberedList( Sink.NUMBERING_DECIMAL );
+            int numbering = Sink.NUMBERING_DECIMAL;
+
+            // this will have to be generalized if we handle styles
+            String style = parser.getAttributeValue( null, 
Attribute.STYLE.toString() );
+
+            if ( style != null )
+            {
+                if ( "list-style-type: upper-alpha".equals( style ) )
+                {
+                    numbering = Sink.NUMBERING_UPPER_ALPHA;
+                }
+                else if ( "list-style-type: lower-alpha".equals( style ) )
+                {
+                    numbering = Sink.NUMBERING_LOWER_ALPHA;
+                }
+                else if ( "list-style-type: upper-roman".equals( style ) )
+                {
+                    numbering = Sink.NUMBERING_UPPER_ROMAN;
+                }
+                else if ( "list-style-type: lower-roman".equals( style ) )
+                {
+                    numbering = Sink.NUMBERING_LOWER_ROMAN;
+                }
+                else if ( "list-style-type: decimal".equals( style ) )
+                {
+                    numbering = Sink.NUMBERING_DECIMAL;
+                }
+            }
+
+            sink.numberedList( numbering );
             orderedListDepth++;
         }
         else if ( parser.getName().equals( Tag.LI.toString() ) )
@@ -294,6 +344,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() ) )
         {
@@ -323,6 +397,12 @@
                 sink.tableCell( colspan );
             }
         }
+        else if ( parser.getName().equals( Tag.CAPTION.toString() ) )
+        {
+            sink.tableRows_();
+            this.hasCaption = true;
+            sink.tableCaption();
+        }
 
         // 
----------------------------------------------------------------------
         // Empty elements: <br/>, <hr/> and <img />
@@ -378,6 +458,8 @@
         }
         else if ( parser.getName().equals( Tag.BODY.toString() ) )
         {
+            closeOpenSections( 0, sink );
+
             sink.body_();
         }
         else if ( parser.getName().equals( Tag.P.toString() ) )
@@ -496,6 +578,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() ) )
@@ -510,12 +599,20 @@
         {
             sink.tableCell_();
         }
+        else if ( parser.getName().equals( Tag.CAPTION.toString() ) )
+        {
+            sink.tableCaption_();
+        }
         else if ( parser.getName().equals( SECTION_TAG.toString() ) )
         {
+            closeOpenSections( 0, sink );
+
             sink.section1_();
         }
         else if ( parser.getName().equals( SUBSECTION_TAG.toString() ) )
         {
+            closeOpenSections( Sink.SECTION_LEVEL_1, sink );
+
             sink.section2_();
         }
         else if ( parser.getName().equals( Tag.H4.toString() ) )
@@ -591,4 +688,34 @@
 
         sink.rawText( String.valueOf( GREATER_THAN ) );
     }
+
+    /**
+     * Close open h4, h5, h6 sections. The current level is set to newLevel 
afterwards.
+     *
+     * @param newLevel the new section level, all upper levels have to be 
closed.
+     * @param sink the sink to receive the events.
+     */
+    private void closeOpenSections( int newLevel, Sink sink )
+    {
+        while ( this.sectionLevel > newLevel )
+        {
+            if ( sectionLevel == Sink.SECTION_LEVEL_5)
+            {
+                sink.section5_();
+            }
+            else if ( sectionLevel == Sink.SECTION_LEVEL_4)
+            {
+                sink.section4_();
+            }
+            else if ( sectionLevel == Sink.SECTION_LEVEL_3)
+            {
+                sink.section3_();
+            }
+
+            this.sectionLevel--;
+        }
+
+        this.sectionLevel = newLevel;
+    }
+
 }

Modified: 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocSink.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocSink.java?rev=578469&r1=578468&r2=578469&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocSink.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocSink.java
 Sat Sep 22 11:22:11 2007
@@ -690,10 +690,7 @@
      */
     public void table()
     {
-        MutableAttributeSet att = new SimpleAttributeSet();
-        att.addAttribute( Attribute.ALIGN, "center" );
-
-        writeStartTag( Tag.TABLE, att );
+        // start table with tableRows
     }
 
     /**
@@ -713,6 +710,8 @@
      */
     public void tableRows( int[] justification, boolean grid )
     {
+        this.cellJustif = justification;
+
         MutableAttributeSet att = new SimpleAttributeSet();
         att.addAttribute( Attribute.ALIGN, "center" );
         att.addAttribute( Attribute.BORDER, ( grid ? "1" : "0" ) );
@@ -726,7 +725,7 @@
      */
     public void tableRows_()
     {
-        writeEndTag( Tag.TABLE );
+        // nop
     }
 
     /**
@@ -835,24 +834,21 @@
 
     /**
      * [EMAIL PROTECTED]
-     * @see javax.swing.text.html.HTML.Tag#P
-     * @see javax.swing.text.html.HTML.Tag#I
+     * @see javax.swing.text.html.HTML.Tag#CAPTION
      */
     public void tableCaption()
     {
-        writeStartTag( Tag.P );
-        writeStartTag( Tag.I );
+        // TODO: tableCaption should be written before tableRows
+        writeStartTag( Tag.CAPTION );
     }
 
     /**
      * [EMAIL PROTECTED]
-     * @see javax.swing.text.html.HTML.Tag#P
-     * @see javax.swing.text.html.HTML.Tag#I
+     * @see javax.swing.text.html.HTML.Tag#CAPTION
      */
     public void tableCaption_()
     {
-        writeEndTag( Tag.I );
-        writeEndTag( Tag.P );
+        writeEndTag( Tag.CAPTION );
     }
 
     /**


Reply via email to