Author: vsiveton Date: Sat Sep 5 14:19:51 2009 New Revision: 811653 URL: http://svn.apache.org/viewvc?rev=811653&view=rev Log: DOXIASITETOOLS-33: Add an option to include or not the TOC
o option to add the TOC at the beginning or the end of the doc Modified: maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt maven/doxia/doxia/trunk/doxia-modules/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoAggregateSink.java Modified: maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java?rev=811653&r1=811652&r2=811653&view=diff ============================================================================== --- maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java (original) +++ maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java Sat Sep 5 14:19:51 2009 @@ -120,17 +120,32 @@ getLogger().debug( "Loaded pdf config file: " + fOConfigFile.getAbsolutePath() ); } - boolean addToc = - ( context != null && context.get( "includeTOC" ) != null ? ( (Boolean) context.get( "includeTOC" ) ) - .booleanValue() - : true ); - sink.setDocumentModel( documentModel, addToc ); + String generateTOC = + ( context != null && context.get( "generateTOC" ) != null ? context.get( "generateTOC" ).toString().trim() + : "start" ); + int tocPosition = 0; + if ( "start".equalsIgnoreCase( generateTOC )) + { + tocPosition = FoAggregateSink.TOC_START; + } + else if ( "end".equalsIgnoreCase( generateTOC )) + { + tocPosition = FoAggregateSink.TOC_END; + } + else + { + tocPosition = FoAggregateSink.TOC_NONE; + } + sink.setDocumentModel( documentModel, tocPosition ); sink.beginDocument(); sink.coverPage(); - sink.toc(); + if ( tocPosition == FoAggregateSink.TOC_START ) + { + sink.toc(); + } if ( ( documentModel.getToc() == null ) || ( documentModel.getToc().getItems() == null ) ) { @@ -145,6 +160,11 @@ mergeSourcesFromTOC( documentModel.getToc(), sink, context ); } + if ( tocPosition == FoAggregateSink.TOC_END ) + { + sink.toc(); + } + sink.endDocument(); } finally Modified: maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java?rev=811653&r1=811652&r2=811653&view=diff ============================================================================== --- maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java (original) +++ maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java Sat Sep 5 14:19:51 2009 @@ -180,15 +180,14 @@ iTextFiles = parseTOCFiles( outputDirectory, documentModel, context ); } - boolean addToc = - ( context != null && context.get( "includeTOC" ) != null ? ( (Boolean) context.get( "includeTOC" ) ) - .booleanValue() - : true ); + String generateTOC = + ( context != null && context.get( "generateTOC" ) != null ? context.get( "generateTOC" ).toString() + : "start" ); File iTextFile = new File( outputDirectory, outputName + ".xml" ); File iTextOutput = new File( outputDirectory, outputName + "." + getOutputExtension() ); Document document = generateDocument( iTextFiles ); - transform( documentModel, document, iTextFile, addToc ); + transform( documentModel, document, iTextFile, generateTOC ); generatePdf( iTextFile, iTextOutput ); } @@ -374,9 +373,10 @@ * @param transformer the Transformer to set the parameters. * @param documentModel the DocumentModel to take the parameters from, could be null. * @param iTextFile the iTextFile not null for the relative paths. - * @param addToc to include or not the TOC. + * @param generateTOC not null, possible values are: 'none', 'start' and 'end'. */ - private void addTransformerParameters( Transformer transformer, DocumentModel documentModel, File iTextFile, boolean addToc ) + private void addTransformerParameters( Transformer transformer, DocumentModel documentModel, File iTextFile, + String generateTOC ) { if ( documentModel == null ) { @@ -384,7 +384,7 @@ } // TOC - addTransformerParameter( transformer, "toc.add", Boolean.toString( addToc ) ); + addTransformerParameter( transformer, "toc.position", generateTOC ); // Meta parameters boolean hasNullMeta = false; @@ -491,15 +491,15 @@ * @param documentModel the DocumentModel to take the parameters from, could be null. * @param document the Document to transform. * @param iTextFile the resulting iText xml file. - * @param addToc to include or not the TOC. + * @param generateTOC not null, possible values are: 'none', 'start' and 'end'. * @throws DocumentRendererException in case of a transformation error. */ - private void transform( DocumentModel documentModel, Document document, File iTextFile, boolean addToc ) + private void transform( DocumentModel documentModel, Document document, File iTextFile, String generateTOC ) throws DocumentRendererException { Transformer transformer = initTransformer(); - addTransformerParameters( transformer, documentModel, iTextFile, addToc ); + addTransformerParameters( transformer, documentModel, iTextFile, generateTOC ); // need a writer for StreamResult to prevent FileNotFoundException when iTextFile contains spaces Writer writer = null; Modified: maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt URL: http://svn.apache.org/viewvc/maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt?rev=811653&r1=811652&r2=811653&view=diff ============================================================================== --- maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt (original) +++ maven/doxia/doxia-sitetools/trunk/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt Sat Sep 5 14:19:51 2009 @@ -22,7 +22,7 @@ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- TOC Parameters --> - <xsl:param name="toc.add" /> + <xsl:param name="toc.position" /> <!-- MetaData Parameters --> <xsl:param name="meta.author" /> @@ -113,7 +113,7 @@ <!-- Start TOC --> <xsl:choose> - <xsl:when test="$toc.add = 'true'"> + <xsl:when test="$toc.position = 'start'"> <newpage /> <paragraph align="Center"> <!-- TODO i18N --> @@ -133,6 +133,25 @@ <xsl:apply-templates select="*" mode="body" /> + <!-- Start TOC --> + <xsl:choose> + <xsl:when test="$toc.position = 'end'"> + <newpage /> + <paragraph align="Center"> + <!-- TODO i18N --> + <chunk font="Helvetica" size="24" fontstyle="bold" blue="0" + green="0" red="0">Table Of Contents</chunk> + </paragraph> + <paragraph align="Left" leading="24.0"> + <newline /> + <xsl:apply-templates select="*" mode="toc" /> + </paragraph> + </xsl:when> + <xsl:otherwise> + <newpage /> + </xsl:otherwise> + </xsl:choose> + <!-- End TOC --> </itext> </xsl:template> 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=811653&r1=811652&r2=811653&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 Sat Sep 5 14:19:51 2009 @@ -67,8 +67,30 @@ * @version $Id$ * @since 1.1 */ -public class FoAggregateSink extends FoSink +public class FoAggregateSink + extends FoSink { + /** + * No Table Of Content. + * @see #setDocumentModel(DocumentModel, int) + */ + public static int TOC_NONE = 0; + + /** + * Table Of Content at the start of the document. + * @see #setDocumentModel(DocumentModel, int) + */ + public static int TOC_START = 1; + + /** + * Table Of Content at the end of the document. + * @see #setDocumentModel(DocumentModel, int) + */ + public static int TOC_END = 2; + + // TODO: make configurable + private static final String COVER_HEADER_HEIGHT = "1.5in"; + /** The document model to be used by this sink. */ private DocumentModel docModel; @@ -84,15 +106,12 @@ /** Content in head is ignored in aggregated documents. */ private boolean ignoreText; - /** Flag to include of not the toc */ - private boolean addToc; + /** Current position of the TOC, see {...@link #TOC_POSITION} */ + private int tocPosition; /** Used to get the current position in the TOC. */ private final Stack tocStack = new Stack(); - // TODO: make configurable - private static final String COVER_HEADER_HEIGHT = "1.5in"; - /** * Constructor. * @@ -231,7 +250,6 @@ } } - /** * Sets the name of the current source document, relative to the source root. * Used to resolve links to other source documents. @@ -246,36 +264,54 @@ /** * Sets the DocumentModel to be used by this sink. The DocumentModel provides all the meta-information * required to render a document, eg settings for the cover page, table of contents, etc. + * <br/> + * By default, a TOC will be added at the beginning of the document. * * @param model the DocumentModel. - * @see #setDocumentModel(DocumentModel, boolean) + * @see #setDocumentModel(DocumentModel, String) + * @see #TOC_START */ public void setDocumentModel( DocumentModel model ) { - setDocumentModel( model, true ); + setDocumentModel( model, TOC_START ); } /** * Sets the DocumentModel to be used by this sink. The DocumentModel provides all the meta-information * required to render a document, eg settings for the cover page, table of contents, etc. * - * @param model the DocumentModel. - * @param addToc true to include the TOC in the sink. + * @param model the DocumentModel, could be null. + * @param tocPos should be one of these values: {...@link #TOC_NONE}, {...@link #TOC_START} and {...@link #TOC_END}. * @since 1.1.2 */ - public void setDocumentModel( DocumentModel model, boolean addToc ) + public void setDocumentModel( DocumentModel model, int tocPos ) { this.docModel = model; - this.addToc = addToc; + if ( !( tocPos == TOC_NONE || tocPos == TOC_START || tocPos == TOC_END ) ) + { + if ( getLog().isDebugEnabled() ) + { + getLog().debug( "Unrecognized value for tocPosition: " + tocPos + ", using no toc." ); + } + tocPos = TOC_NONE; + } + this.tocPosition = tocPos; - if ( this.addToc ) + if ( this.docModel != null && this.docModel.getToc() != null && this.tocPosition != TOC_NONE ) { DocumentTOCItem tocItem = new DocumentTOCItem(); tocItem.setName( this.docModel.getToc().getName() ); tocItem.setRef( "./toc" ); List items = new LinkedList(); - items.add( tocItem ); + if ( this.tocPosition == TOC_START ) + { + items.add( tocItem ); + } items.addAll( this.docModel.getToc().getItems() ); + if ( this.tocPosition == TOC_END ) + { + items.add( tocItem ); + } this.docModel.getToc().setItems( items ); } @@ -352,7 +388,7 @@ } /** {...@inheritdoc} */ - public void anchor( String name, SinkEventAttributes attributes ) + public void anchor( String name, SinkEventAttributes attributes ) { if ( name == null ) { @@ -380,13 +416,13 @@ } /** {...@inheritdoc} */ - public void link( String name ) + public void link( String name ) { link( name, null ); } /** {...@inheritdoc} */ - public void link( String name, SinkEventAttributes attributes ) + public void link( String name, SinkEventAttributes attributes ) { if ( name == null ) { @@ -458,7 +494,7 @@ return; } - anchor = chopExtension ( anchor ); + anchor = chopExtension( anchor ); String base = docName.substring( 0, docName.lastIndexOf( "/" ) ); anchor = base + "/" + anchor; @@ -488,7 +524,7 @@ return base + "/" + anchor; } - private String chopExtension( String name ) + private String chopExtension( String name ) { String anchor = name; @@ -504,13 +540,14 @@ if ( dot2 != -1 ) { - anchor = anchor.substring( 0, dot ) + "#" - + HtmlTools.encodeId( anchor.substring( hash + 1, dot2 ) ); + anchor = + anchor.substring( 0, dot ) + "#" + HtmlTools.encodeId( anchor.substring( hash + 1, dot2 ) ); } else { - anchor = anchor.substring( 0, dot ) + "#" - + HtmlTools.encodeId( anchor.substring( hash + 1, anchor.length() ) ); + anchor = + anchor.substring( 0, dot ) + "#" + + HtmlTools.encodeId( anchor.substring( hash + 1, anchor.length() ) ); } } else @@ -803,12 +840,8 @@ */ public void toc() { - if ( !this.addToc ) - { - return; - } - - if ( docModel == null || docModel.getToc() == null || docModel.getToc().getItems() == null ) + if ( docModel == null || docModel.getToc() == null || docModel.getToc().getItems() == null + || this.tocPosition == TOC_NONE ) { return; } @@ -1107,7 +1140,6 @@ writeSimpleTag( BLOCK_TAG ); writeEndTag( TABLE_CELL_TAG ); - writeStartTag( TABLE_CELL_TAG, "number-columns-spanned", "2", "cover.border.left.bottom" ); writeStartTag( BLOCK_TAG, "cover.subtitle" ); write( subtitle == null ? ( version == null ? "" : " v. " + version ) : subtitle ); @@ -1140,7 +1172,7 @@ writeEndTag( TABLE_ROW_TAG ); } - private void writeCoverFooter( DocumentCover cover, DocumentMeta meta ) + private void writeCoverFooter( DocumentCover cover, DocumentMeta meta ) { if ( cover == null && meta == null ) { @@ -1214,7 +1246,7 @@ if ( atts == null ) { - return new SinkEventAttributeSet( new String[] {SinkEventAttributes.HEIGHT, COVER_HEADER_HEIGHT} ); + return new SinkEventAttributeSet( new String[] { SinkEventAttributes.HEIGHT, COVER_HEADER_HEIGHT } ); } // FOP dpi: 72