Author: ltheussl
Date: Tue Jun 26 15:18:01 2007
New Revision: 550972

URL: http://svn.apache.org/viewvc?view=rev&rev=550972
Log:
Add aggregate mode so several input files can be converted into one pdf output 
file.

Modified:
    
maven/sandbox/trunk/doxia/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java
    
maven/sandbox/trunk/doxia/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java

Modified: 
maven/sandbox/trunk/doxia/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java?view=diff&rev=550972&r1=550971&r2=550972
==============================================================================
--- 
maven/sandbox/trunk/doxia/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java
 (original)
+++ 
maven/sandbox/trunk/doxia/doxia-module-fo/src/main/java/org/apache/maven/doxia/module/fo/FoSink.java
 Tue Jun 26 15:18:01 2007
@@ -44,6 +44,9 @@
     /** Used to get attributes for a given FO element. */
     private final FoConfiguration config;
 
+    /** Counts the current chapter level. */
+    private int chapter = 0;
+
     /** Counts the current section level. */
     private int section = 0;
 
@@ -65,89 +68,130 @@
     /** Verbatim flag. */
     private boolean verbatim;
 
+    /** Flag that indicates if the document to be written is only a fragment. 
*/
+    private boolean fragmentDocument;
+
+    /** In fragment mode, some text has to be ignored (title...). */
+    private boolean ignoreText;
+
     /** Constructor.
      * @param writer The writer for writing the result.
      */
     public FoSink( Writer writer )
     {
+        this( writer, false );
+    }
+
+    /** Constructor.
+     * @param writer The writer for writing the result.
+     
+     */
+    public FoSink( Writer writer, boolean fragment )
+    {
         this.out = new LineBreaker( writer );
         this.config = new FoConfiguration();
+        this.fragmentDocument = fragment;
     }
 
     // TODO page headers, page numbering
-    // TODO add aggregate mode?
     // TODO add FOP compliance mode?
 
     /** [EMAIL PROTECTED] */
     public void head()
     {
-        writeln( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" );
-
-        writeln( "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\";>" );
-
-        writeStartTag( "layout-master-set", null );
-        writeStartTag( "simple-page-master", "layout.master.set.body" );
-
-        writeEmptyTag( "region-body", "layout.master.set.body.region-body" );
-        writeEmptyTag( "region-before", "layout.master.set.body.region-before" 
);
-        writeEmptyTag( "region-after", "layout.master.set.body.region-after" );
-
-        writeEndTag( "simple-page-master" );
-        writeEndTag( "layout-master-set" );
-
-        newline();
-
-        writeln( "<fo:page-sequence initial-page-number=\"1\" 
master-reference=\"body\">" );
+        if ( fragmentDocument )
+        {
+            return;
+        }
 
-        writeln( "  <fo:flow flow-name=\"xsl-region-body\">" );
+        beginDocument();
+        startPageSequence();
     }
 
     /** [EMAIL PROTECTED] */
     public void head_()
     {
-        // nothing?
+        newline();
     }
 
     /** [EMAIL PROTECTED] */
     public void title()
     {
-        writeStartTag( "block", "doc.header.title" );
+        if ( fragmentDocument )
+        {
+            ignoreText = true;
+        }
+        else
+        {
+            writeStartTag( "block", "doc.header.title" );
+        }
     }
 
     /** [EMAIL PROTECTED] */
     public void title_()
     {
-        writeEndTag( "block" );
+        ignoreText = false;
+        if ( !fragmentDocument )
+        {
+            writeEndTag( "block" );
+        }
     }
 
     /** [EMAIL PROTECTED] */
     public void author()
     {
-        writeStartTag( "block", "doc.header.author" );
+        if ( fragmentDocument )
+        {
+            ignoreText = true;
+        }
+        else
+        {
+            writeStartTag( "block", "doc.header.author" );
+        }
     }
 
     /** [EMAIL PROTECTED] */
     public void author_()
     {
-        writeEndTag( "block" );
+        ignoreText = false;
+        if ( !fragmentDocument )
+        {
+            writeEndTag( "block" );
+        }
     }
 
     /** [EMAIL PROTECTED] */
     public void date()
     {
-        writeStartTag( "block", "doc.header.date" );
+        if ( fragmentDocument )
+        {
+            ignoreText = true;
+        }
+        else
+        {
+            writeStartTag( "block", "doc.header.date" );
+        }
     }
 
     /** [EMAIL PROTECTED] */
     public void date_()
     {
-        writeEndTag( "block" );
+        ignoreText = false;
+        if ( !fragmentDocument )
+        {
+            writeEndTag( "block" );
+        }
     }
 
     /** [EMAIL PROTECTED] */
     public void body()
     {
-        // nothing?
+        if ( fragmentDocument )
+        {
+            startPageSequence();
+        }
+
+        chapter++;
     }
 
     /** [EMAIL PROTECTED] */
@@ -156,9 +200,10 @@
          newline();
          writeEndTag( "flow" );
          writeEndTag( "page-sequence" );
-         writeEndTag( "root" );
-         flush();
-         close();
+         if ( !fragmentDocument )
+         {
+            endDocument();
+         }
     }
 
     // -----------------------------------------------------------------------
@@ -729,7 +774,12 @@
     /** [EMAIL PROTECTED] */
     public void anchor( String name )
     {
-        writeStartTag( "inline", "id", name );
+        String anchor = name;
+        if ( fragmentDocument )
+        {
+            anchor = anchor + String.valueOf( chapter );
+        }
+        writeStartTag( "inline", "id", anchor );
     }
 
     /** [EMAIL PROTECTED] */
@@ -741,6 +791,11 @@
     /** [EMAIL PROTECTED] */
     public void link( String name )
     {
+        String anchor = name;
+        if ( fragmentDocument )
+        {
+            anchor = anchor + String.valueOf( chapter );
+        }
         if ( name.startsWith( "http", 0 ) || name.startsWith( "mailto", 0 )
             || name.startsWith( "ftp", 0 ) )
         {
@@ -755,7 +810,7 @@
         else
         {
             // TODO: aggregate mode: link to another document, construct 
relative path
-            writeStartTag( "basic-link", "internal-destination", name );
+            writeStartTag( "basic-link", "internal-destination", anchor );
             writeStartTag( "inline", "href.internal" );
         }
     }
@@ -819,7 +874,10 @@
     /** [EMAIL PROTECTED] */
     public void text( String text )
     {
-        content( text );
+        if ( !ignoreText )
+        {
+            content( text );
+        }
     }
 
     /** [EMAIL PROTECTED] */
@@ -840,6 +898,33 @@
         out.close();
     }
 
+    /** Writes the beginning of a FO document in aggregate mode. */
+    public void beginDocument()
+    {
+        writeln( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" );
+
+        writeln( "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\";>" );
+
+        writeStartTag( "layout-master-set", null );
+        writeStartTag( "simple-page-master", "layout.master.set.body" );
+
+        writeEmptyTag( "region-body", "layout.master.set.body.region-body" );
+        writeEmptyTag( "region-before", "layout.master.set.body.region-before" 
);
+        writeEmptyTag( "region-after", "layout.master.set.body.region-after" );
+
+        writeEndTag( "simple-page-master" );
+        writeEndTag( "layout-master-set" );
+    }
+
+    /** Writes the end of a FO document in aggregate mode,
+     * flushes and closes the stream.
+     */
+    public void endDocument()
+    {
+        writeEndTag( "root" );
+        flush();
+        close();
+    }
 
     // ----------------------------------------------------------------------
     //
@@ -935,6 +1020,20 @@
         }
 
         return buffer.toString();
+    }
+
+    private void startPageSequence()
+    {
+        if ( chapter == 0 )
+        {
+            writeln( "<fo:page-sequence initial-page-number=\"1\" 
master-reference=\"body\">" );
+        }
+        else
+        {
+            writeln( "<fo:page-sequence initial-page-number=\"auto\" 
master-reference=\"body\">" );
+        }
+
+        writeln( "  <fo:flow flow-name=\"xsl-region-body\">" );
     }
 
 

Modified: 
maven/sandbox/trunk/doxia/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java?view=diff&rev=550972&r1=550971&r2=550972
==============================================================================
--- 
maven/sandbox/trunk/doxia/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java
 (original)
+++ 
maven/sandbox/trunk/doxia/doxia-module-fo/src/test/java/org/apache/maven/doxia/module/fo/FoSinkTest.java
 Tue Jun 26 15:18:01 2007
@@ -20,7 +20,10 @@
  */
 
 import java.io.File;
-import java.io.StringWriter;
+import java.io.Reader;
+import java.io.FileWriter;
+import java.io.Writer;
+
 
 import org.apache.maven.doxia.module.apt.AptParser;
 import org.apache.maven.doxia.parser.Parser;
@@ -39,11 +42,23 @@
         new AptParser().parse( getTestReader(), createSink() );
 
         // then generate PDF
-        File outputDirectory = new File( getBasedirFile(), "target/output" );
-        File resourceDirectory = new File( getBasedirFile(), 
"target/test-classes" );
-        File foFile = new File( outputDirectory, "test." + outputExtension() );
-        File pdfFile = new File( outputDirectory, "test.pdf" );
-        FoTestUtils.convertFO2PDF( foFile, pdfFile, 
resourceDirectory.getCanonicalPath() );
+        fo2pdf( "test" );
+    }
+
+    public void testAggregateMode() throws Exception
+    {
+        AptParser parser = new AptParser();
+        Reader source = getTestReader();
+        FoSink fosink = new FoSink( getFOTestWriter( "aggregate" ), true );
+        fosink.beginDocument();
+        parser.parse( source, fosink );
+        // re-use the same source
+        source = getTestReader();
+        parser.parse( source, fosink );
+        fosink.endDocument();
+
+        // then generate PDF
+        fo2pdf( "aggregate" );
     }
 
     /** [EMAIL PROTECTED] */
@@ -64,5 +79,28 @@
     {
         return new FoSink( getTestWriter() );
     }
+
+    private void fo2pdf( String baseName ) throws Exception
+    {
+        File outputDirectory = new File( getBasedirFile(), "target/output" );
+        File resourceDirectory = new File( getBasedirFile(), 
"target/test-classes" );
+        File foFile = new File( outputDirectory, baseName + "." + 
outputExtension() );
+        File pdfFile = new File( outputDirectory, baseName + ".pdf" );
+        FoTestUtils.convertFO2PDF( foFile, pdfFile, 
resourceDirectory.getCanonicalPath() );
+    }
+
+    private Writer getFOTestWriter( String baseName )
+        throws Exception
+    {
+        File outputDirectory = new File( getBasedirFile(), "target/output" );
+
+        if ( !outputDirectory.exists() )
+        {
+            outputDirectory.mkdirs();
+        }
+
+        return new FileWriter( new File( outputDirectory, baseName + "." + 
outputExtension() ) );
+    }
+
 
 }


Reply via email to