Author: ltheussl Date: Tue May 12 20:18:35 2009 New Revision: 774060 URL: http://svn.apache.org/viewvc?rev=774060&view=rev Log: include toc sub-items in toc and pdf bookmarks
Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java?rev=774060&r1=774059&r2=774060&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java (original) +++ maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java Tue May 12 20:18:35 2009 @@ -23,6 +23,8 @@ import java.util.Calendar; import java.util.Iterator; +import java.util.List; +import java.util.Stack; import javax.swing.text.MutableAttributeSet; import javax.swing.text.html.HTML.Tag; @@ -63,6 +65,9 @@ /** Content in head is ignored in aggregated documents. */ private boolean ignoreText; + /** Used to get the current position in the TOC. */ + private final Stack tocStack = new Stack(); + /** * Constructor. * @@ -685,23 +690,62 @@ writeEmptyTag( TABLE_COLUMN_TAG, "column-width", "5in" ); // TODO writeStartTag( TABLE_BODY_TAG, "" ); - int count = 0; + writeTocItems( toc.getItems(), 1 ); + + writeEndTag( TABLE_BODY_TAG ); + writeEndTag( TABLE_TAG ); + writeEndTag( FLOW_TAG ); + writeEndTag( PAGE_SEQUENCE_TAG ); + } - for ( Iterator k = toc.getItems().iterator(); k.hasNext(); ) + private void writeTocItems( List tocItems, int level ) + { + final int maxTocLevel = 4; + + if ( level < 1 || level > maxTocLevel ) + { + return; + } + + tocStack.push( new NumberedListItem( NUMBERING_DECIMAL ) ); + + for ( Iterator k = tocItems.iterator(); k.hasNext(); ) { DocumentTOCItem tocItem = (DocumentTOCItem) k.next(); - count++; String ref = getIdName( tocItem.getRef() ); writeStartTag( TABLE_ROW_TAG, "keep-with-next", "auto" ); + + if ( level > 2 ) + { + for ( int i = 0; i < level - 2; i++ ) + { + writeStartTag( TABLE_CELL_TAG ); + writeEmptyTag( BLOCK_TAG, "" ); + writeEndTag( TABLE_CELL_TAG ); + } + } + writeStartTag( TABLE_CELL_TAG, "toc.cell" ); writeStartTag( BLOCK_TAG, "toc.number.style" ); - write( Integer.toString( count ) ); + + NumberedListItem current = (NumberedListItem) tocStack.peek(); + current.next(); + write( currentTocNumber() ); + writeEndTag( BLOCK_TAG ); writeEndTag( TABLE_CELL_TAG ); - writeStartTag( TABLE_CELL_TAG, "number-columns-spanned", "3", "toc.cell" ); - MutableAttributeSet atts = getFoConfiguration().getAttributeSet( "toc.h1.style" ); + + String span = "3"; + + if ( level > 2 ) + { + span = Integer.toString( 5 - level ); + } + + writeStartTag( TABLE_CELL_TAG, "number-columns-spanned", span, "toc.cell" ); + MutableAttributeSet atts = getFoConfiguration().getAttributeSet( "toc.h" + level + ".style" ); atts.addAttribute( "text-align-last", "justify" ); writeStartTag( BLOCK_TAG, atts ); writeStartTag( BASIC_LINK_TAG, "internal-destination", ref ); @@ -714,14 +758,26 @@ writeEndTag( BLOCK_TAG ); writeEndTag( TABLE_CELL_TAG ); writeEndTag( TABLE_ROW_TAG ); + + if ( tocItem.getItems() != null ) + { + writeTocItems( tocItem.getItems(), level + 1 ); + } } - writeEndTag( TABLE_BODY_TAG ); - writeEndTag( TABLE_TAG ); - writeEndTag( FLOW_TAG ); - writeEndTag( PAGE_SEQUENCE_TAG ); + tocStack.pop(); + } + + private String currentTocNumber() + { + String ch = ( (NumberedListItem) tocStack.get( 0 ) ).getListItemSymbol(); + for ( int i = 1; i < tocStack.size(); i++ ) + { + ch = ch + "." + ( (NumberedListItem) tocStack.get( i ) ).getListItemSymbol(); + } + return ch; } /** @@ -731,38 +787,38 @@ */ protected void pdfBookmarks() { - if ( this.docModel == null ) + if ( docModel == null || docModel.getToc() == null ) { return; } - DocumentTOC toc = docModel.getToc(); + writeStartTag( BOOKMARK_TREE_TAG, "" ); - if ( toc == null ) - { - return; - } + renderBookmarkItems( docModel.getToc().getItems() ); - writeStartTag( BOOKMARK_TREE_TAG, "" ); + writeEndTag( BOOKMARK_TREE_TAG ); + } - for ( Iterator k = toc.getItems().iterator(); k.hasNext(); ) + private void renderBookmarkItems( List items ) + { + for ( Iterator k = items.iterator(); k.hasNext(); ) { DocumentTOCItem tocItem = (DocumentTOCItem) k.next(); String ref = getIdName( tocItem.getRef() ); writeStartTag( BOOKMARK_TAG, "internal-destination", ref ); - writeStartTag( BOOKMARK_TITLE_TAG, "" ); - write( tocItem.getName() ); - writeEndTag( BOOKMARK_TITLE_TAG ); + if ( tocItem.getItems() != null ) + { + renderBookmarkItems( tocItem.getItems() ); + } + writeEndTag( BOOKMARK_TAG ); } - - writeEndTag( BOOKMARK_TREE_TAG ); } /** Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt?rev=774060&r1=774059&r2=774060&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt (original) +++ maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/resources/fo-styles.xslt Tue May 12 20:18:35 2009 @@ -482,12 +482,12 @@ <xsl:attribute name="space-before">18pt</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="toc.h2.style" use-attribute-sets="toc.base.style"> - <xsl:attribute name="font-size">9.5pt</xsl:attribute> + <xsl:attribute name="font-size">11pt</xsl:attribute> <xsl:attribute name="space-before">15pt</xsl:attribute> <xsl:attribute name="space-before">3pt</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="toc.h3.style" use-attribute-sets="toc.base.style"> - <xsl:attribute name="font-size">9.5pt</xsl:attribute> + <xsl:attribute name="font-size">10pt</xsl:attribute> <xsl:attribute name="space-before">4pt</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="toc.h4.style" use-attribute-sets="toc.base.style">