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() ) );
+ }
+
}