[maven-scm] copy for tag doxia-sitetools-1.1.1
git-svn-id: https://svn.apache.org/repos/asf/maven/doxia/doxia-sitetools/tags/doxia-sitetools-1.1.1@785657 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java
index 5752e32..b9ba076 100644
--- a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java
+++ b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/PathUtils.java
@@ -42,7 +42,7 @@
}
/**
- * <p>convertPath</p>
+ * <p>convertPath.</p>
*
* @param oldPath not null
* @param newPath not null
@@ -63,7 +63,7 @@
}
/**
- * <p>getRelativePath</p>
+ * <p>getRelativePath.</p>
*
* @param oldPathDescriptor not null
* @param newPathDescriptor not null
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
index ebf19cf..311e902 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/AbstractDocumentRenderer.java
@@ -79,11 +79,11 @@
//--------------------------------------------
/**
- * Render a document from the files found in a Map.
+ * Render an aggregate document from the files found in a Map.
*
* @param filesToProcess the Map of Files to process. The Map should contain as keys the paths of the
* source files (relative to {@link #getBaseDir() baseDir}), and the corresponding SiteModule as values.
- * @param outputDirectory the output directory where the document should be generated.
+ * @param outputDirectory the output directory where the aggregate document should be generated.
* @param documentModel the document model, containing all the metadata, etc.
* @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
* @throws java.io.IOException if any
@@ -118,11 +118,12 @@
* @param outputDirectory the output directory where the document should be generated.
* @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
* @throws java.io.IOException if any
+ * @see #render(File, File, DocumentModel)
*/
public void render( File baseDirectory, File outputDirectory )
throws DocumentRendererException, IOException
{
- render( baseDirectory, outputDirectory, new DocumentModel() );
+ render( baseDirectory, outputDirectory, (DocumentModel) null );
}
/**
@@ -135,6 +136,8 @@
* If this file does not exist or is null, some default settings will be used.
* @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
* @throws java.io.IOException if any
+ * @see #render(File, File) if documentDescriptor does not exist or is null
+ * @see #render(Map, File, DocumentModel) otherwise
*/
public void render( File baseDirectory, File outputDirectory, File documentDescriptor )
throws DocumentRendererException, IOException
@@ -155,6 +158,22 @@
}
/**
+ * Render documents separately for each file found in a Map.
+ *
+ * @param filesToProcess the Map of Files to process. The Map should contain as keys the paths of the
+ * source files (relative to {@link #getBaseDir() baseDir}), and the corresponding SiteModule as values.
+ * @param outputDirectory the output directory where the documents should be generated.
+ * @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
+ * @throws java.io.IOException if any
+ * @since 1.1.1
+ */
+ public void renderIndividual( Map filesToProcess, File outputDirectory )
+ throws DocumentRendererException, IOException
+ {
+ // nop
+ }
+
+ /**
* Returns a Map of files to process. The Map contains as keys the paths of the source files
* (relative to {@link #getBaseDir() baseDir}), and the corresponding SiteModule as values.
*
@@ -340,6 +359,11 @@
protected void parse( String fullDocPath, String parserId, Sink sink )
throws DocumentRendererException, IOException
{
+ if ( getLogger().isDebugEnabled() )
+ {
+ getLogger().debug( "Parsing file " + fullDocPath );
+ }
+
Reader reader = null;
try
{
@@ -391,10 +415,17 @@
{
File resourcesDirectory = new File( getBaseDir(), "resources" );
- if ( resourcesDirectory.isDirectory() && outputDirectory.isDirectory() )
+ if ( !resourcesDirectory.isDirectory() )
{
- copyDirectory( resourcesDirectory, outputDirectory );
+ return;
}
+
+ if ( !outputDirectory.exists() )
+ {
+ outputDirectory.mkdirs();
+ }
+
+ copyDirectory( resourcesDirectory, outputDirectory );
}
/**
@@ -435,4 +466,34 @@
}
}
}
+
+ /**
+ * @param documentModel not null
+ * @return the output name defined in the documentModel without the output extension. If the output name is not
+ * defined, return target by default.
+ * @since 1.1.1
+ * @see org.apache.maven.doxia.document.DocumentModel#getOutputName()
+ * @see #getOutputExtension()
+ */
+ protected String getOutputName( DocumentModel documentModel )
+ {
+ String outputName = documentModel.getOutputName();
+ if ( outputName == null )
+ {
+ getLogger().info( "No outputName is defined in the document descriptor. Using 'target'" );
+
+ documentModel.setOutputName( "target" );
+ }
+
+ outputName = outputName.trim();
+ if ( outputName.toLowerCase( Locale.ENGLISH ).endsWith( "." + getOutputExtension() ) )
+ {
+ outputName =
+ outputName.substring( 0, outputName.toLowerCase( Locale.ENGLISH )
+ .lastIndexOf( "." + getOutputExtension() ) );
+ }
+ documentModel.setOutputName( outputName );
+
+ return documentModel.getOutputName();
+ }
}
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java
index f3d1464..bece559 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocRenderer.java
@@ -27,7 +27,7 @@
*
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
* @version $Id$
- * @deprecated Use {@link DocumentRenderer} instead.
+ * @deprecated Since 1.1, use {@link DocumentRenderer} instead.
*/
public interface DocRenderer
{
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
index f951ee4..818c535 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/DocumentRenderer.java
@@ -47,6 +47,7 @@
* @param documentModel the document model, containing all the metadata, etc.
* If the model contains a TOC, only the files found in this TOC are rendered,
* otherwise all files from the Collection of files will be processed.
+ * If the model is null, render all files individually.
* @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any.
* @throws java.io.IOException if any.
*/
@@ -62,6 +63,7 @@
* @param documentModel the document model, containing all the metadata, etc.
* If the model contains a TOC, only the files found in this TOC are rendered,
* otherwise all files found under baseDirectory will be processed.
+ * If the model is null, render all files from baseDirectory individually.
* @throws org.apache.maven.doxia.docrenderer.DocumentRendererException if any
* @throws java.io.IOException if any
*/
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java
index 8e9a22b..27eff21 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/AbstractITextRender.java
@@ -75,12 +75,13 @@
*
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
* @version $Id$
+ * @deprecated since 1.1, use an implementation of {@link org.apache.maven.doxia.docrenderer.DocumentRenderer}.
*/
public abstract class AbstractITextRender
extends AbstractLogEnabled
implements DocRenderer
{
- private static final String XSLT_RESOURCE = "org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt";
+ private static final String XSLT_RESOURCE = "org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt";
private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
@@ -316,6 +317,8 @@
reader = ReaderFactory.newPlatformReader( f );
}
+ System.setProperty( "itext.basedir", outputITextFile.getParentFile().getAbsolutePath() );
+
doxia.parse( reader, module.getParserId(), sink );
}
catch ( ParserNotFoundException e )
@@ -335,6 +338,10 @@
sink.flush();
sink.close();
+
+ IOUtil.close( writer );
+
+ System.getProperties().remove( "itext.basedir" );
}
}
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java
index 92f5188..b70c40b 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRenderer.java
@@ -33,6 +33,7 @@
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
* @version $Id$
* @plexus.component role="org.apache.maven.doxia.docrenderer.itext.PdfRenderer" role-hint="itext.pdf"
+ * @deprecated since 1.1, use {@link org.apache.maven.doxia.docrenderer.pdf.itext.ITextPdfRenderer}.
*/
public class DefaultPdfRenderer
extends AbstractITextRender
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java
index 80a525f..caed6b1 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/DefaultRtfRenderer.java
@@ -33,6 +33,7 @@
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
* @version $Id$
* @plexus.component role="org.apache.maven.doxia.docrenderer.itext.RtfRenderer" role-hint="itext.rtf"
+ * @deprecated since 1.1, use {@link org.apache.maven.doxia.docrenderer.pdf.itext.ITextPdfRenderer}.
*/
public class DefaultRtfRenderer
extends AbstractITextRender
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java
index d4a01f7..23d26de 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/PdfRenderer.java
@@ -26,8 +26,10 @@
*
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
* @version $Id$
+ * @deprecated since 1.1, use an implementation of {@link org.apache.maven.doxia.docrenderer.DocumentRenderer}.
*/
-public interface PdfRenderer extends DocRenderer
+public interface PdfRenderer
+ extends DocRenderer
{
String ROLE = PdfRenderer.class.getName();
}
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java
index 39e7a24..b1b7c54 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/itext/RtfRenderer.java
@@ -26,8 +26,10 @@
*
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
* @version $Id$
+ * @deprecated since 1.1, use an implementation of {@link org.apache.maven.doxia.docrenderer.DocumentRenderer}.
*/
-public interface RtfRenderer extends DocRenderer
+public interface RtfRenderer
+ extends DocRenderer
{
String ROLE = RtfRenderer.class.getName();
}
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
index 4eff891..165ea6e 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/fo/FoPdfRenderer.java
@@ -35,6 +35,8 @@
import org.apache.maven.doxia.document.DocumentTOC;
import org.apache.maven.doxia.document.DocumentTOCItem;
import org.apache.maven.doxia.module.fo.FoAggregateSink;
+import org.apache.maven.doxia.module.fo.FoSink;
+import org.apache.maven.doxia.module.fo.FoSinkFactory;
import org.apache.maven.doxia.module.fo.FoUtils;
import org.apache.maven.doxia.module.site.SiteModule;
@@ -62,72 +64,39 @@
public void generatePdf( File inputFile, File pdfFile )
throws DocumentRendererException
{
- if ( getLogger().isDebugEnabled() )
- {
- getLogger().debug( "Generating: " + pdfFile );
- }
-
- try
- {
- FoUtils.convertFO2PDF( inputFile, pdfFile, null );
- }
- catch ( TransformerException e )
- {
- if ( ( e.getCause() != null ) && ( e.getCause() instanceof SAXParseException ) )
- {
- SAXParseException sax = (SAXParseException) e.getCause();
-
- StringBuffer sb = new StringBuffer();
- sb.append( "Error creating PDF from " ).append( inputFile.getAbsolutePath() ).append( ":" )
- .append( sax.getLineNumber() ).append( ":" ).append( sax.getColumnNumber() ).append( "\n" );
- sb.append( e.getMessage() );
-
- throw new DocumentRendererException( sb.toString() );
- }
-
- throw new DocumentRendererException( "Error creating PDF from " + inputFile + ": " + e.getMessage() );
- }
+ // Should take care of the document model for the metadata...
+ generatePdf( inputFile, pdfFile, null );
}
/** {@inheritDoc} */
public void render( Map filesToProcess, File outputDirectory, DocumentModel documentModel )
throws DocumentRendererException, IOException
{
- String outputName = documentModel.getOutputName();
+ // copy resources, images, etc.
+ copyResources( outputDirectory );
- if ( outputName == null )
+ if ( documentModel == null )
{
- getLogger().info( "No outputName is defined in the document descriptor. Using 'target.pdf'" );
+ getLogger().debug( "No document model, generating all documents individually." );
- documentModel.setOutputName( "target" );
+ renderIndividual( filesToProcess, outputDirectory );
+ return;
}
- outputName = outputName.trim();
- if ( outputName.toLowerCase( Locale.ENGLISH ).endsWith( ".pdf" ) )
- {
- documentModel.setOutputName( outputName.substring( 0, outputName.toLowerCase( Locale.ENGLISH )
- .lastIndexOf( ".pdf" ) ) );
- }
-
- outputName = documentModel.getOutputName();
+ String outputName = getOutputName( documentModel );
File outputFOFile = new File( outputDirectory, outputName + ".fo" );
-
if ( !outputFOFile.getParentFile().exists() )
{
outputFOFile.getParentFile().mkdirs();
}
File pdfOutputFile = new File( outputDirectory, outputName + ".pdf" );
-
if ( !pdfOutputFile.getParentFile().exists() )
{
pdfOutputFile.getParentFile().mkdirs();
}
- // copy resources, images, etc.
- copyResources( outputDirectory );
-
Writer writer = null;
try
{
@@ -159,6 +128,8 @@
}
else
{
+ getLogger().debug( "Using TOC defined in the document descriptor." );
+
mergeSourcesFromTOC( documentModel.getToc(), sink );
}
@@ -169,7 +140,48 @@
IOUtil.close( writer );
}
- generatePdf( outputFOFile, pdfOutputFile );
+ generatePdf( outputFOFile, pdfOutputFile, documentModel );
+ }
+
+ /** {@inheritDoc} */
+ public void renderIndividual( Map filesToProcess, File outputDirectory )
+ throws DocumentRendererException, IOException
+ {
+ for ( Iterator j = filesToProcess.keySet().iterator(); j.hasNext(); )
+ {
+ String key = (String) j.next();
+ SiteModule module = (SiteModule) filesToProcess.get( key );
+
+ File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
+
+ String output = key;
+ String lowerCaseExtension = module.getExtension().toLowerCase( Locale.ENGLISH );
+ if ( output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) != -1 )
+ {
+ output =
+ output.substring( 0, output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) );
+ }
+
+ File outputFOFile = new File( outputDirectory, output + ".fo" );
+ if ( !outputFOFile.getParentFile().exists() )
+ {
+ outputFOFile.getParentFile().mkdirs();
+ }
+
+ File pdfOutputFile = new File( outputDirectory, output + ".pdf" );
+ if ( !pdfOutputFile.getParentFile().exists() )
+ {
+ pdfOutputFile.getParentFile().mkdirs();
+ }
+
+ FoSink sink =
+ (FoSink) new FoSinkFactory().createSink( outputFOFile.getParentFile(), outputFOFile.getName() );
+ sink.beginDocument();
+ parse( fullDoc.getAbsolutePath(), module.getParserId(), sink );
+ sink.endDocument();
+
+ generatePdf( outputFOFile, pdfOutputFile, null );
+ }
}
private void mergeAllSources( Map filesToProcess, FoAggregateSink sink )
@@ -180,14 +192,9 @@
String key = (String) j.next();
SiteModule module = (SiteModule) filesToProcess.get( key );
sink.setDocumentName( key );
- String fullDocPath = getBaseDir() + File.separator + module.getSourceDirectory() + File.separator + key;
+ File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
- if ( getLogger().isDebugEnabled() )
- {
- getLogger().debug( "Parsing file " + fullDocPath );
- }
-
- parse( fullDocPath, module.getParserId(), sink );
+ parse( fullDoc.getAbsolutePath(), module.getParserId(), sink );
}
}
@@ -215,7 +222,6 @@
}
String href = StringUtils.replace( tocItem.getRef(), "\\", "/" );
-
if ( href.lastIndexOf( "." ) != -1 )
{
href = href.substring( 0, href.lastIndexOf( "." ) );
@@ -245,11 +251,6 @@
if ( source.exists() )
{
- if ( getLogger().isDebugEnabled() )
- {
- getLogger().debug( "Parsing file " + source );
- }
-
sink.setDocumentName( doc );
sink.setDocumentTitle( tocItem.getName() );
@@ -258,4 +259,41 @@
}
}
}
+
+ /**
+ * @param inputFile
+ * @param pdfFile
+ * @param documentModel could be null
+ * @throws DocumentRendererException if any
+ * @since 1.1.1
+ */
+ private void generatePdf( File inputFile, File pdfFile, DocumentModel documentModel )
+ throws DocumentRendererException
+ {
+ if ( getLogger().isDebugEnabled() )
+ {
+ getLogger().debug( "Generating: " + pdfFile );
+ }
+
+ try
+ {
+ FoUtils.convertFO2PDF( inputFile, pdfFile, null, documentModel );
+ }
+ catch ( TransformerException e )
+ {
+ if ( ( e.getCause() != null ) && ( e.getCause() instanceof SAXParseException ) )
+ {
+ SAXParseException sax = (SAXParseException) e.getCause();
+
+ StringBuffer sb = new StringBuffer();
+ sb.append( "Error creating PDF from " ).append( inputFile.getAbsolutePath() ).append( ":" )
+ .append( sax.getLineNumber() ).append( ":" ).append( sax.getColumnNumber() ).append( "\n" );
+ sb.append( e.getMessage() );
+
+ throw new DocumentRendererException( sb.toString() );
+ }
+
+ throw new DocumentRendererException( "Error creating PDF from " + inputFile + ": " + e.getMessage() );
+ }
+ }
}
diff --git a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
index 8ba91f9..15d337b 100644
--- a/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
+++ b/doxia-doc-renderer/src/main/java/org/apache/maven/doxia/docrenderer/pdf/itext/ITextPdfRenderer.java
@@ -24,13 +24,18 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Writer;
+import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
+import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
+import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
@@ -44,12 +49,17 @@
import org.apache.maven.doxia.docrenderer.DocumentRendererException;
import org.apache.maven.doxia.docrenderer.pdf.AbstractPdfRenderer;
+import org.apache.maven.doxia.document.DocumentCover;
+import org.apache.maven.doxia.document.DocumentMeta;
import org.apache.maven.doxia.document.DocumentModel;
+import org.apache.maven.doxia.document.DocumentTOCItem;
import org.apache.maven.doxia.module.itext.ITextSink;
import org.apache.maven.doxia.module.itext.ITextSinkFactory;
import org.apache.maven.doxia.module.itext.ITextUtil;
import org.apache.maven.doxia.module.site.SiteModule;
import org.apache.xml.utils.DefaultErrorHandler;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.WriterFactory;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
@@ -71,7 +81,7 @@
extends AbstractPdfRenderer
{
/** The xslt style sheet used to transform a Document to an iText file. */
- private static final String XSLT_RESOURCE = "org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt";
+ private static final String XSLT_RESOURCE = "TOC.xslt";
/** The TransformerFactory. */
private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();
@@ -79,9 +89,21 @@
/** The DocumentBuilderFactory. */
private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY = DocumentBuilderFactory.newInstance();
+ /** The DocumentBuilder. */
+ private static final DocumentBuilder DOCUMENT_BUILDER;
+
static
{
TRANSFORMER_FACTORY.setErrorListener( new DefaultErrorHandler() );
+
+ try
+ {
+ DOCUMENT_BUILDER = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder();
+ }
+ catch ( ParserConfigurationException e )
+ {
+ throw new RuntimeException( "Error building document :" + e.getMessage() );
+ }
}
/** {@inheritDoc} */
@@ -108,70 +130,90 @@
}
/** {@inheritDoc} */
- public void render( Map filesToProcess, File outputDirectory, DocumentModel documentModel )
+ public void render( Map filesToProcess, File outputDirectory, DocumentModel documentModel )
throws DocumentRendererException, IOException
{
- String outputName = documentModel.getOutputName();
+ // copy resources, images, etc.
+ copyResources( outputDirectory );
- if ( outputName == null )
+ if ( documentModel == null )
{
- if ( getLogger().isInfoEnabled() )
- {
- getLogger().info( "No outputName is defined in the document descriptor. Using 'target.pdf'" );
- }
+ getLogger().debug( "No document model, generating all documents individually." );
- documentModel.setOutputName( "target" );
- }
- else if ( outputName.lastIndexOf( "." ) != -1 )
- {
- documentModel.setOutputName( outputName.substring( 0, outputName.lastIndexOf( "." ) ) );
+ renderIndividual( filesToProcess, outputDirectory );
+ return;
}
-// TODO: adjust from o.a.m.d.docrenderer.itext.AbstractITextRender
-// if ( ( documentModel.getToc() == null ) || ( documentModel.getToc().getItems() == null ) )
-// {
-// getLogger().info( "No TOC is defined in the document descriptor. Generating all documents." );
+ String outputName = getOutputName( documentModel );
- for ( Iterator j = filesToProcess.keySet().iterator(); j.hasNext(); )
- {
- String key = (String) j.next();
+ File outputITextFile = new File( outputDirectory, outputName + ".xml" );
+ if ( !outputITextFile.getParentFile().exists() )
+ {
+ outputITextFile.getParentFile().mkdirs();
+ }
- SiteModule module = (SiteModule) filesToProcess.get( key );
+ File pdfOutputFile = new File( outputDirectory, outputName + ".pdf" );
+ if ( !pdfOutputFile.getParentFile().exists() )
+ {
+ pdfOutputFile.getParentFile().mkdirs();
+ }
+ List iTextFiles;
+ if ( ( documentModel.getToc() == null ) || ( documentModel.getToc().getItems() == null ) )
+ {
+ getLogger().info( "No TOC is defined in the document descriptor. Merging all documents." );
- String fullDocPath = getBaseDir() + File.separator
- + module.getSourceDirectory() + File.separator + key;
-
- String iTextFileName = key.substring( 0, key.indexOf( "." ) + 1 ) + "xml";
-
- File iTextFile = new File( outputDirectory, iTextFileName );
- if ( !iTextFile.getParentFile().exists() )
- {
- iTextFile.getParentFile().mkdirs();
- }
-
- String pdfFileName = key.substring( 0, key.indexOf( "." ) + 1 ) + getOutputExtension();
-
- File pdfFile = new File( outputDirectory, pdfFileName );
- if ( !pdfFile.getParentFile().exists() )
- {
- pdfFile.getParentFile().mkdirs();
- }
-
- parse( fullDocPath, module, iTextFile );
-
- generatePdf( iTextFile, pdfFile );
- }
-/*
+ iTextFiles = parseAllFiles( filesToProcess, outputDirectory );
}
else
{
- // TODO: adjust from o.a.m.d.docrenderer.itext.AbstractITextRender
- }
-*/
+ getLogger().debug( "Using TOC defined in the document descriptor." );
+ iTextFiles = parseTOCFiles( filesToProcess, outputDirectory, documentModel );
+ }
+
+ File iTextFile = new File( outputDirectory, outputName + ".xml" );
+ File iTextOutput = new File( outputDirectory, outputName + "." + getOutputExtension() );
+ Document document = generateDocument( iTextFiles );
+ transform( documentModel, document, iTextFile );
+ generatePdf( iTextFile, iTextOutput );
}
+ /** {@inheritDoc} */
+ public void renderIndividual( Map filesToProcess, File outputDirectory )
+ throws DocumentRendererException, IOException
+ {
+ for ( Iterator it = filesToProcess.keySet().iterator(); it.hasNext(); )
+ {
+ String key = (String) it.next();
+ SiteModule module = (SiteModule) filesToProcess.get( key );
+ File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
+
+ String output = key;
+ String lowerCaseExtension = module.getExtension().toLowerCase( Locale.ENGLISH );
+ if ( output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) != -1 )
+ {
+ output =
+ output.substring( 0, output.toLowerCase( Locale.ENGLISH ).indexOf( "." + lowerCaseExtension ) );
+ }
+
+ File outputITextFile = new File( outputDirectory, output + ".xml" );
+ if ( !outputITextFile.getParentFile().exists() )
+ {
+ outputITextFile.getParentFile().mkdirs();
+ }
+
+ File pdfOutputFile = new File( outputDirectory, output + ".pdf" );
+ if ( !pdfOutputFile.getParentFile().exists() )
+ {
+ pdfOutputFile.getParentFile().mkdirs();
+ }
+
+ parse( fullDoc, module, outputITextFile );
+
+ generatePdf( outputITextFile, pdfOutputFile );
+ }
+ }
//--------------------------------------------
//
@@ -181,23 +223,43 @@
/**
* Parse a source document and emit results into a sink.
*
- * @param fullDocPath absolute path to the source document.
+ * @param fullDocPath file to the source document.
* @param module the site module associated with the source document (determines the parser to use).
* @param iTextFile the resulting iText xml file.
* @throws DocumentRendererException in case of a parsing problem.
* @throws IOException if the source and/or target document cannot be opened.
*/
- private void parse( String fullDocPath, SiteModule module, File iTextFile )
+ private void parse( File fullDoc, SiteModule module, File iTextFile )
throws DocumentRendererException, IOException
{
- Writer writer = WriterFactory.newXmlWriter( iTextFile );
- ITextSink sink = (ITextSink) new ITextSinkFactory().createSink( writer );
+ if ( getLogger().isDebugEnabled() )
+ {
+ getLogger().debug( "Parsing file " + fullDoc.getAbsolutePath() );
+ }
- sink.setClassLoader( new URLClassLoader( new URL[] { iTextFile.getParentFile().toURI().toURL() } ) );
+ System.setProperty( "itext.basedir", iTextFile.getParentFile().getAbsolutePath() );
- parse( fullDocPath, module.getParserId(), sink );
+ Writer writer = null;
+ ITextSink sink = null;
+ try
+ {
+ writer = WriterFactory.newXmlWriter( iTextFile );
+ sink = (ITextSink) new ITextSinkFactory().createSink( writer );
- sink.close();
+ sink.setClassLoader( new URLClassLoader( new URL[] { iTextFile.getParentFile().toURI().toURL() } ) );
+
+ parse( fullDoc.getAbsolutePath(), module.getParserId(), sink );
+ }
+ finally
+ {
+ if ( sink != null )
+ {
+ sink.flush();
+ sink.close();
+ }
+ IOUtil.close( writer );
+ System.getProperties().remove( "itext.basedir" );
+ }
}
/**
@@ -211,17 +273,7 @@
private Document generateDocument( List iTextFiles )
throws DocumentRendererException, IOException
{
- Document document;
-
- try
- {
- document = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().newDocument();
- }
- catch ( ParserConfigurationException e )
- {
- throw new DocumentRendererException( "Error building document :" + e.getMessage() );
- }
-
+ Document document = DOCUMENT_BUILDER.newDocument();
document.appendChild( document.createElement( ElementTags.ITEXT ) ); // Used only to set a root
for ( int i = 0; i < iTextFiles.size(); i++ )
@@ -232,16 +284,12 @@
try
{
- iTextDocument = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder().parse( iTextFile );
+ iTextDocument = DOCUMENT_BUILDER.parse( iTextFile );
}
catch ( SAXException e )
{
throw new DocumentRendererException( "SAX Error : " + e.getMessage() );
}
- catch ( ParserConfigurationException e )
- {
- throw new DocumentRendererException( "Error parsing configuration : " + e.getMessage() );
- }
// Only one chapter per doc
Node chapter = iTextDocument.getElementsByTagName( ElementTags.CHAPTER ).item( 0 );
@@ -271,8 +319,8 @@
{
try
{
- Transformer transformer = TRANSFORMER_FACTORY.newTransformer( new StreamSource( AbstractPdfRenderer.class
- .getResourceAsStream( "/" + XSLT_RESOURCE ) ) );
+ Transformer transformer = TRANSFORMER_FACTORY.newTransformer( new StreamSource( ITextPdfRenderer.class
+ .getResourceAsStream( XSLT_RESOURCE ) ) );
transformer.setErrorListener( TRANSFORMER_FACTORY.getErrorListener() );
@@ -284,6 +332,8 @@
transformer.setOutputProperty( OutputKeys.ENCODING, "UTF-8" );
+ // No doctype since itext doctype is not up to date!
+
return transformer;
}
catch ( TransformerConfigurationException e )
@@ -302,57 +352,119 @@
* Add transformer parameters from a DocumentModel.
*
* @param transformer the Transformer to set the parameters.
- * @param documentModel the DocumentModel to take the parameters from.
+ * @param documentModel the DocumentModel to take the parameters from, could be null.
+ * @param iTextFile the iTextFile not null for the relative paths.
*/
- private void addTransformerParameters( Transformer transformer, DocumentModel documentModel )
+ private void addTransformerParameters( Transformer transformer, DocumentModel documentModel, File iTextFile )
{
- if ( documentModel.getMeta().getTitle() != null )
+ if ( documentModel == null )
{
- transformer.setParameter( "title", documentModel.getMeta().getTitle() );
+ return;
}
- if ( documentModel.getMeta().getAuthor() != null )
+ // Meta parameters
+ boolean hasNullMeta = false;
+ if ( documentModel.getMeta() == null )
{
- transformer.setParameter( "author", documentModel.getMeta().getAuthor() );
+ hasNullMeta = true;
+ documentModel.setMeta( new DocumentMeta() );
+ }
+ addTransformerParameter( transformer, "meta.author", documentModel.getMeta().getAllAuthorNames(),
+ System.getProperty( "user.name", "null" ) );
+ addTransformerParameter( transformer, "meta.creator", documentModel.getMeta().getCreator(),
+ System.getProperty( "user.name", "null" ) );
+ // see com.lowagie.text.Document#addCreationDate()
+ SimpleDateFormat sdf = new SimpleDateFormat( "EEE MMM dd HH:mm:ss zzz yyyy" );
+ addTransformerParameter( transformer, "meta.creationdate", documentModel.getMeta().getCreationdate(),
+ sdf.format( new Date() ) );
+ addTransformerParameter( transformer, "meta.keywords", documentModel.getMeta().getAllKeyWords() );
+ addTransformerParameter( transformer, "meta.pagesize", documentModel.getMeta().getPageSize(),
+ ITextUtil.getPageSize( ITextUtil.getDefaultPageSize() ) );
+ addTransformerParameter( transformer, "meta.producer", documentModel.getMeta().getGenerator(),
+ "Apache Doxia iText" );
+ addTransformerParameter( transformer, "meta.subject", documentModel.getMeta().getSubject(),
+ ( documentModel.getMeta().getTitle() != null ? documentModel.getMeta().getTitle()
+ : "" ) );
+ addTransformerParameter( transformer, "meta.title", documentModel.getMeta().getTitle() );
+ if ( hasNullMeta )
+ {
+ documentModel.setMeta( null );
}
- transformer.setParameter( "creationdate", new Date().toString() );
-
- if ( documentModel.getMeta().getSubject() != null )
+ // cover parameter
+ boolean hasNullCover = false;
+ if ( documentModel.getCover() == null )
{
- transformer.setParameter( "subject", documentModel.getMeta().getSubject() );
+ hasNullCover = true;
+ documentModel.setCover( new DocumentCover() );
}
-
- if ( documentModel.getMeta().getKeywords() != null )
+ addTransformerParameter( transformer, "cover.author", documentModel.getCover().getAllAuthorNames(),
+ System.getProperty( "user.name", "null" ) );
+ String companyLogo = getLogoURL( documentModel.getCover().getCompanyLogo(), iTextFile.getParentFile() );
+ addTransformerParameter( transformer, "cover.companyLogo", companyLogo );
+ addTransformerParameter( transformer, "cover.companyName", documentModel.getCover().getCompanyName() );
+ if ( documentModel.getCover().getCoverdate() == null )
{
- transformer.setParameter( "keywords", documentModel.getMeta().getKeywords() );
- }
-
- transformer.setParameter( "producer", "Generated with Doxia by " + System.getProperty( "user.name" ) );
-
- if ( ITextUtil.isPageSizeSupported( documentModel.getMeta().getTitle() ) )
- {
- transformer.setParameter( "pagesize", documentModel.getMeta().getPageSize() );
+ documentModel.getCover().setCoverDate( new Date() );
+ addTransformerParameter( transformer, "cover.date", documentModel.getCover().getCoverdate() );
+ documentModel.getCover().setCoverDate( null );
}
else
{
- transformer.setParameter( "pagesize", "A4" );
+ addTransformerParameter( transformer, "cover.date", documentModel.getCover().getCoverdate() );
}
-
- transformer.setParameter( "frontPageHeader", "" );
-
- if ( documentModel.getMeta().getTitle() != null )
+ addTransformerParameter( transformer, "cover.subtitle", documentModel.getCover().getCoverSubTitle() );
+ addTransformerParameter( transformer, "cover.title", documentModel.getCover().getCoverTitle() );
+ addTransformerParameter( transformer, "cover.type", documentModel.getCover().getCoverType() );
+ addTransformerParameter( transformer, "cover.version", documentModel.getCover().getCoverVersion() );
+ String projectLogo = getLogoURL( documentModel.getCover().getProjectLogo(), iTextFile.getParentFile() );
+ addTransformerParameter( transformer, "cover.projectLogo", projectLogo );
+ addTransformerParameter( transformer, "cover.projectName", documentModel.getCover().getProjectName() );
+ if ( hasNullCover )
{
- transformer.setParameter( "frontPageTitle", documentModel.getMeta().getTitle() );
+ documentModel.setCover( null );
+ }
+ }
+
+ /**
+ * @param transformer not null
+ * @param name not null
+ * @param value could be empty
+ * @param defaultValue could be empty
+ * @since 1.1.1
+ */
+ private void addTransformerParameter( Transformer transformer, String name, String value, String defaultValue )
+ {
+ if ( StringUtils.isEmpty( value ) )
+ {
+ addTransformerParameter( transformer, name, defaultValue );
+ }
+ else
+ {
+ addTransformerParameter( transformer, name, value );
+ }
+ }
+
+ /**
+ * @param transformer not null
+ * @param name not null
+ * @param value could be empty
+ * @since 1.1.1
+ */
+ private void addTransformerParameter( Transformer transformer, String name, String value )
+ {
+ if ( StringUtils.isEmpty( value ) )
+ {
+ return;
}
- transformer.setParameter( "frontPageFooter", "Generated date " + new Date().toString() );
+ transformer.setParameter( name, value );
}
/**
* Transform a document to an iTextFile.
*
- * @param documentModel the DocumentModel to take the parameters from.
+ * @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.
* @throws DocumentRendererException in case of a transformation error.
@@ -362,7 +474,7 @@
{
Transformer transformer = initTransformer();
- addTransformerParameters( transformer, documentModel );
+ addTransformerParameters( transformer, documentModel, iTextFile );
try
{
@@ -373,4 +485,137 @@
throw new DocumentRendererException( "Error transforming Document " + document + ": " + e.getMessage() );
}
}
+
+ /**
+ * @param filesToProcess not null
+ * @param outputDirectory not null
+ * @return a list of all parsed files.
+ * @throws DocumentRendererException if any
+ * @throws IOException if any
+ * @since 1.1.1
+ */
+ private List parseAllFiles( Map filesToProcess, File outputDirectory )
+ throws DocumentRendererException, IOException
+ {
+ List iTextFiles = new LinkedList();
+ for ( Iterator it = filesToProcess.keySet().iterator(); it.hasNext(); )
+ {
+ String key = (String) it.next();
+ SiteModule module = (SiteModule) filesToProcess.get( key );
+ File fullDoc = new File( getBaseDir(), module.getSourceDirectory() + File.separator + key );
+
+ String outputITextName = key.substring( 0, key.lastIndexOf( "." ) + 1 ) + "xml";
+ File outputITextFileTmp = new File( outputDirectory, outputITextName );
+ outputITextFileTmp.deleteOnExit();
+ if ( !outputITextFileTmp.getParentFile().exists() )
+ {
+ outputITextFileTmp.getParentFile().mkdirs();
+ }
+
+ iTextFiles.add( outputITextFileTmp );
+ parse( fullDoc, module, outputITextFileTmp );
+ }
+
+ return iTextFiles;
+ }
+
+ /**
+ * @param filesToProcess not null
+ * @param outputDirectory not null
+ * @return a list of all parsed files.
+ * @throws DocumentRendererException if any
+ * @throws IOException if any
+ * @since 1.1.1
+ */
+ private List parseTOCFiles( Map filesToProcess, File outputDirectory, DocumentModel documentModel )
+ throws DocumentRendererException, IOException
+ {
+ List iTextFiles = new LinkedList();
+ for ( Iterator it = documentModel.getToc().getItems().iterator(); it.hasNext(); )
+ {
+ DocumentTOCItem tocItem = (DocumentTOCItem) it.next();
+
+ if ( tocItem.getRef() == null )
+ {
+ getLogger().debug(
+ "No ref defined for the tocItem '" + tocItem.getName()
+ + "' in the document descriptor. IGNORING" );
+ continue;
+ }
+
+ String href = StringUtils.replace( tocItem.getRef(), "\\", "/" );
+ if ( href.lastIndexOf( "." ) != -1 )
+ {
+ href = href.substring( 0, href.lastIndexOf( "." ) );
+ }
+
+ for ( Iterator i = siteModuleManager.getSiteModules().iterator(); i.hasNext(); )
+ {
+ SiteModule module = (SiteModule) i.next();
+ File moduleBasedir = new File( getBaseDir(), module.getSourceDirectory() );
+
+ if ( moduleBasedir.exists() )
+ {
+ String doc = href + "." + module.getExtension();
+ File source = new File( moduleBasedir, doc );
+
+ if ( source.exists() )
+ {
+ String outputITextName = doc.substring( 0, doc.lastIndexOf( "." ) + 1 ) + "xml";
+ File outputITextFileTmp = new File( outputDirectory, outputITextName );
+ outputITextFileTmp.deleteOnExit();
+ if ( !outputITextFileTmp.getParentFile().exists() )
+ {
+ outputITextFileTmp.getParentFile().mkdirs();
+ }
+
+ iTextFiles.add( outputITextFileTmp );
+ parse( source, module, outputITextFileTmp );
+ }
+ }
+ }
+ }
+
+ return iTextFiles;
+ }
+
+ /**
+ * @param logo
+ * @param parentFile
+ * @return the logo url or null if unable to create it.
+ * @since 1.1.1
+ */
+ private String getLogoURL( String logo, File parentFile )
+ {
+ if ( logo == null )
+ {
+ return null;
+ }
+
+ try
+ {
+ return new URL( logo ).toString();
+ }
+ catch ( MalformedURLException e )
+ {
+ try
+ {
+ File f = new File( parentFile, logo );
+ if ( !f.exists() )
+ {
+ getLogger().warn( "The logo " + f.getAbsolutePath() + " doesnt exist. IGNORING" );
+ }
+ else
+ {
+ return f.toURL().toString();
+ }
+ }
+ catch ( MalformedURLException e1 )
+ {
+ // nope
+ }
+ }
+
+ return null;
+ }
}
diff --git a/doxia-doc-renderer/src/test/resources/doc-without-TOC.xml b/doxia-doc-renderer/src/main/javadoc/org/apache/maven/doxia/docrenderer/itext/package.html
similarity index 64%
rename from doxia-doc-renderer/src/test/resources/doc-without-TOC.xml
rename to doxia-doc-renderer/src/main/javadoc/org/apache/maven/doxia/docrenderer/itext/package.html
index 329459f..7dc901f 100644
--- a/doxia-doc-renderer/src/test/resources/doc-without-TOC.xml
+++ b/doxia-doc-renderer/src/main/javadoc/org/apache/maven/doxia/docrenderer/itext/package.html
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
@@ -9,7 +9,7 @@
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
@@ -19,11 +19,9 @@
under the License.
-->
-<document outputName="doc-with-merged">
- <meta>
- <title>Merged site</title>
- <author>Vincent Siveton</author>
- <subject>Merged site</subject>
- <keywords>test</keywords>
- </meta>
-</document>
+<body>
+ <h1><b>DEPRECATED</b>.</h1>
+ <p>Since 1.1, the <i>org.apache.maven.doxia.docrenderer.itext</i> package is all deprecated and is unmaintained.
+ It will be removed in the future. You could use an implementation of
+ <a href="../DocumentRenderer.html">DocumentRenderer</a> interface.</p>
+</body>
diff --git a/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt b/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt
similarity index 67%
rename from doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt
rename to doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt
index 4162fd4..e50aed8 100644
--- a/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/itext/xslt/TOC.xslt
+++ b/doxia-doc-renderer/src/main/resources/org/apache/maven/doxia/docrenderer/pdf/itext/TOC.xslt
@@ -21,51 +21,86 @@
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <!-- MetaData Parameters -->
- <xsl:param name="title" />
- <xsl:param name="author" />
- <xsl:param name="creationdate" />
- <xsl:param name="subject" />
- <xsl:param name="keywords" />
- <xsl:param name="producer" />
- <xsl:param name="pagesize" />
+ <!-- MetaData Parameters -->
+ <xsl:param name="meta.author" />
+ <xsl:param name="meta.creator" />
+ <xsl:param name="meta.creationdate" />
+ <xsl:param name="meta.keywords" />
+ <xsl:param name="meta.pagesize" />
+ <xsl:param name="meta.producer" />
+ <xsl:param name="meta.subject" />
+ <xsl:param name="meta.title" />
<!-- FrontPage Parameters -->
- <xsl:param name="frontPageTitle" />
- <xsl:param name="frontPageFooter" />
+ <xsl:param name="cover.author" />
+ <xsl:param name="cover.companyLogo" />
+ <xsl:param name="cover.companyName" />
+ <xsl:param name="cover.date" />
+ <xsl:param name="cover.subtitle" />
+ <xsl:param name="cover.title" />
+ <xsl:param name="cover.type" />
+ <xsl:param name="cover.version" />
+ <xsl:param name="cover.projectLogo" />
+ <xsl:param name="cover.projectName" />
<xsl:template match="/itext">
- <itext title="{$title}" author="{$author}" creationdate="{$creationdate}"
- subject="{$subject}" keywords="{$keywords}" producer="{$producer}"
- pagesize="{$pagesize}">
+ <itext
+ author="{$meta.author}"
+ creator="{$meta.creator}"
+ creationdate="{$meta.creationdate}"
+ keywords="{$meta.keywords}"
+ pagesize="{$meta.pagesize}"
+ producer="{$meta.producer}"
+ subject="{$meta.subject}"
+ title="{$meta.title}">
<!-- Start Front page -->
<paragraph>
<chunk font="Helvetica" size="12.0" fontstyle="normal"
blue="0" green="0" red="0">
- <table columns="1" left="false" right="false"
+ <table columns="2" left="false" right="false"
top="false" bottom="false" align="Center" width="100%">
<row>
<cell left="false" right="false" top="false"
bottom="false" horizontalalign="Left" verticalalign="middle">
- <image
- url="http://maven.apache.org/images/apache-maven-project.png"
- plainwidth="306.0" plainheight="27.867857" />
+ <xsl:if test="$cover.companyLogo != ''">
+ <image url="{$cover.companyLogo}" />
+ </xsl:if>
+ </cell>
+ <cell left="false" right="false" top="false"
+ bottom="false" horizontalalign="Left" verticalalign="middle">
+ <xsl:if test="$cover.projectLogo != ''">
+ <image url="{$cover.projectLogo}" />
+ </xsl:if>
</cell>
</row>
<row>
<cell left="false" right="false" top="false"
bottom="false" horizontalalign="Center" verticalalign="middle"
- leading="330">
+ leading="300" colspan="2">
<chunk font="Helvetica" size="24.0"
- fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$frontPageTitle"/></chunk>
+ fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.title"/></chunk>
+ </cell>
+ </row>
+ <row>
+ <cell left="false" right="false" top="false"
+ bottom="false" horizontalalign="Center" verticalalign="middle"
+ colspan="2">
+ <chunk font="Helvetica" size="24.0"
+ fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.subtitle"/></chunk>
</cell>
</row>
<row>
<cell left="false" right="false" top="false"
bottom="false" horizontalalign="Left" verticalalign="middle"
- leading="330">
+ leading="300">
<chunk font="Helvetica" size="16.0"
- fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$frontPageFooter"/></chunk>
+ fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.companyName"/></chunk>
+ </cell>
+ <cell left="false" right="false" top="false"
+ bottom="false" horizontalalign="right" verticalalign="middle"
+ leading="300">
+ <chunk font="Helvetica" size="16.0"
+ fontstyle="bold" blue="0" green="0" red="0"><xsl:value-of select="$cover.date"/></chunk>
</cell>
</row>
</table>
@@ -76,6 +111,7 @@
<!-- Start TOC -->
<newpage />
<paragraph align="Center">
+ <!-- TODO i18N -->
<chunk font="Helvetica" size="24" fontstyle="bold" blue="0"
green="0" red="0">Table Of Contents</chunk>
</paragraph>
diff --git a/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/DocumentRendererTest.java b/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/DocumentRendererTest.java
new file mode 100644
index 0000000..ef27c94
--- /dev/null
+++ b/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/DocumentRendererTest.java
@@ -0,0 +1,146 @@
+package org.apache.maven.doxia.docrenderer;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.doxia.docrenderer.pdf.PdfRenderer;
+import org.apache.maven.doxia.document.DocumentModel;
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
+ * @version $Id$
+ * @since 1.1.1
+ */
+public class DocumentRendererTest
+ extends PlexusTestCase
+{
+ private PdfRenderer docRenderer;
+
+ private File siteDirectoryFile;
+
+ /** @throws java.lang.Exception */
+ protected void setUp()
+ throws Exception
+ {
+ super.setUp();
+
+ siteDirectoryFile = getTestFile( "src/test/resources/site" );
+ }
+
+ /** @throws java.lang.Exception */
+ protected void tearDown()
+ throws Exception
+ {
+ release( docRenderer );
+ super.tearDown();
+ }
+
+ /** @throws java.lang.Exception */
+ public void testFo()
+ throws Exception
+ {
+ renderImpl( "fo" );
+ }
+
+ /** @throws java.lang.Exception */
+ public void testFoAggregate()
+ throws Exception
+ {
+ renderAggregatedImpl( "fo" );
+ }
+
+ /** @throws java.lang.Exception */
+ public void testIText()
+ throws Exception
+ {
+ renderImpl( "itext" );
+ }
+
+ /** @throws java.lang.Exception */
+ public void testITextAggregate()
+ throws Exception
+ {
+ renderAggregatedImpl( "itext" );
+ }
+
+ private void renderImpl( String implementation )
+ throws Exception
+ {
+ File outputDirectory = getTestFile( "target/output/" + implementation );
+ if ( outputDirectory.exists() )
+ {
+ FileUtils.deleteDirectory( outputDirectory );
+ }
+ outputDirectory.mkdirs();
+
+ docRenderer = (PdfRenderer) lookup( PdfRenderer.ROLE, implementation );
+ assertNotNull( docRenderer );
+
+ docRenderer.render( siteDirectoryFile, outputDirectory, null );
+
+ List files =
+ FileUtils.getFileNames( new File( siteDirectoryFile, "apt" ), "**/*.apt",
+ FileUtils.getDefaultExcludesAsString(), false );
+ files.addAll( FileUtils.getFileNames( new File( siteDirectoryFile, "fml" ), "**/*.fml",
+ FileUtils.getDefaultExcludesAsString(), false ) );
+ files.addAll( FileUtils.getFileNames( new File( siteDirectoryFile, "xdoc" ), "**/*.xml",
+ FileUtils.getDefaultExcludesAsString(), false ) );
+
+ for ( Iterator it = files.iterator(); it.hasNext(); )
+ {
+ String relativeFile = it.next().toString();
+ String relativePdf = StringUtils.replace( relativeFile, FileUtils.getExtension( relativeFile ), "pdf" );
+ File pdf = new File( outputDirectory, relativePdf );
+
+ assertTrue( pdf.exists() );
+ assertTrue( pdf.length() > 0 );
+ }
+ }
+
+ private void renderAggregatedImpl( String implementation )
+ throws Exception
+ {
+ File outputDirectory = getTestFile( "target/output/" + implementation + "-aggregated" );
+ if ( outputDirectory.exists() )
+ {
+ FileUtils.deleteDirectory( outputDirectory );
+ }
+ outputDirectory.mkdirs();
+
+ docRenderer = (PdfRenderer) lookup( PdfRenderer.ROLE, implementation );
+ assertNotNull( docRenderer );
+
+ DocumentModel descriptor = docRenderer.readDocumentModel( new File( siteDirectoryFile, "pdf.xml" ) );
+ assertNotNull( descriptor );
+
+ docRenderer.render( siteDirectoryFile, outputDirectory, descriptor );
+
+ File pdf = new File( outputDirectory, descriptor.getOutputName() + ".pdf" );
+
+ assertTrue( pdf.exists() );
+ assertTrue( pdf.length() > 0 );
+ }
+}
diff --git a/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.java b/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.java
deleted file mode 100644
index 65dcf47..0000000
--- a/doxia-doc-renderer/src/test/java/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.apache.maven.doxia.docrenderer.itext;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-
-import org.apache.maven.doxia.docrenderer.DocRenderer;
-import org.codehaus.plexus.PlexusTestCase;
-import org.codehaus.plexus.util.FileUtils;
-
-/**
- * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
- * @version $Id$
- */
-public class DefaultPdfRendererTest
- extends PlexusTestCase
-{
- private static final String OUTPUT = "target/output";
-
- private static final String SITE = "src/test/resources/site";
-
- private static final String DESCRIPTOR_WITHOUT_TOC = "src/test/resources/doc-without-TOC.xml";
-
- private File outputDirectory;
-
- private File siteDirectoryFile;
-
- private DocRenderer docRenderer;
-
- /** {@inheritDoc} */
- protected void setUp()
- throws Exception
- {
- super.setUp();
-
- docRenderer = (DocRenderer) lookup( DocRenderer.ROLE );
-
- outputDirectory = getTestFile( OUTPUT );
- outputDirectory.mkdirs();
-
- siteDirectoryFile = getTestFile( SITE );
-
- FileUtils.copyDirectory( new File( siteDirectoryFile, "resources/css" ), new File( outputDirectory, "css" ),
- "*.css", ".svn" );
- FileUtils.copyDirectory( new File( siteDirectoryFile, "resources/images" ),
- new File( outputDirectory, "images" ), "*.png", ".svn" );
- }
-
- /** {@inheritDoc} */
- protected void tearDown()
- throws Exception
- {
- release( docRenderer );
- super.tearDown();
- }
-
- /**
- * @throws Exception
- */
- public void testRenderFileFile()
- throws Exception
- {
- docRenderer.render( siteDirectoryFile, outputDirectory );
-
- assertTrue( new File( outputDirectory, "faq.pdf" ).exists() );
- assertTrue( new File( outputDirectory, "faq.pdf" ).length() > 0 );
- assertTrue( new File( outputDirectory, "index.pdf" ).exists() );
- assertTrue( new File( outputDirectory, "index.pdf" ).length() > 0 );
- assertTrue( new File( outputDirectory, "overview.pdf" ).exists() );
- assertTrue( new File( outputDirectory, "overview.pdf" ).length() > 0 );
- assertTrue( new File( outputDirectory, "resources.pdf" ).exists() );
- assertTrue( new File( outputDirectory, "resources.pdf" ).length() > 0 );
-
- }
-
- /**
- * @throws Exception
- */
- public void testRenderFileFileFile()
- throws Exception
- {
- File descriptor = getTestFile( DESCRIPTOR_WITHOUT_TOC );
-
- docRenderer.render( siteDirectoryFile, outputDirectory, descriptor );
-
- assertTrue( new File( outputDirectory, "doc-with-merged.pdf" ).exists() );
- assertTrue( new File( outputDirectory, "doc-with-merged.pdf" ).length() > 0 );
- }
-}
diff --git a/doxia-doc-renderer/src/test/resources/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.xml b/doxia-doc-renderer/src/test/resources/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.xml
deleted file mode 100644
index 6ef4e2a..0000000
--- a/doxia-doc-renderer/src/test/resources/org/apache/maven/doxia/docrenderer/itext/DefaultPdfRendererTest.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- -->
-<plexus>
- <components>
- <component>
- <role>org.apache.maven.doxia.docrenderer.DocRenderer</role>
- <implementation>org.apache.maven.doxia.docrenderer.itext.DefaultPdfRenderer</implementation>
- <requirements>
- <requirement>
- <role>org.apache.maven.doxia.module.site.manager.SiteModuleManager</role>
- <field-name>siteModuleManager</field-name>
- </requirement>
- <requirement>
- <role>org.apache.maven.doxia.Doxia</role>
- <field-name>doxia</field-name>
- </requirement>
- </requirements>
- </component>
- </components>
-</plexus>
diff --git a/doxia-doc-renderer/src/test/resources/site/fml/faq.fml b/doxia-doc-renderer/src/test/resources/site/fml/faq.fml
index 0381d2a..94ec21d 100644
--- a/doxia-doc-renderer/src/test/resources/site/fml/faq.fml
+++ b/doxia-doc-renderer/src/test/resources/site/fml/faq.fml
@@ -19,9 +19,9 @@
under the License.
-->
-<faqs xmlns="http://maven.apache.org/FML/1.0"
+<faqs xmlns="http://maven.apache.org/FML/1.0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/FML/1.0 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.xsd"
+ xsi:schemaLocation="http://maven.apache.org/FML/1.0.1 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.1.xsd"
title="Frequently Asked Questions">
<part id="General">
<faq id="How_to_handle_style_in_the_APT_markup_language">
diff --git a/doxia-doc-renderer/src/test/resources/site/pdf.xml b/doxia-doc-renderer/src/test/resources/site/pdf.xml
new file mode 100644
index 0000000..79f1ae0
--- /dev/null
+++ b/doxia-doc-renderer/src/test/resources/site/pdf.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ -->
+<document xmlns="http://maven.apache.org/DOCUMENT/1.0.1"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/DOCUMENT/1.0.1 file:../../../../../../doxia/doxia-core/target/generated-site/xsd/document-1.0.1.xsd"
+ outputName="doxia-1.1.1">
+
+ <meta>
+ <title>Apache Maven Doxia</title>
+ <author>The Apache Maven Project</author>
+ <keyWords>
+ <keyWord>Content generation framework</keyWord>
+ <keyWord>Lightweight markup language</keyWord>
+ <keyWord>APT</keyWord>
+ <keyWord>FML</keyWord>
+ <keyWord>XDOC</keyWord>
+ </keyWords>
+ </meta>
+
+ <toc name="Table of Contents">
+ <item name="What is Doxia?" ref="index.html"/>
+ <item name="Overview" ref="overview.html"/>
+ <item name="FAQ" ref="faq.html"/>
+ <item name="Resources" ref="resources.html"/>
+ <item name="FML Format" ref="references/fml-format.html"/>
+ <item name="XDoc Format" ref="references/xdoc-format.html"/>
+ </toc>
+
+ <cover>
+ <coverTitle>Apache Maven Doxia Test</coverTitle>
+ <coverSubTitle>v. 1.1.1-SNAPSHOT</coverSubTitle>
+ <coverType>User Guide</coverType>
+ <companyName>The Apache Software Foundation</companyName>
+ <companyLogo>http://www.apache.org/images/asf_logo_wide.png</companyLogo>
+ <projectLogo>./images/doxia-logo.png</projectLogo>
+ </cover>
+</document>
diff --git a/doxia-doc-renderer/src/test/resources/site/resources/images/doxia-logo.png b/doxia-doc-renderer/src/test/resources/site/resources/images/doxia-logo.png
new file mode 100644
index 0000000..8c15655
--- /dev/null
+++ b/doxia-doc-renderer/src/test/resources/site/resources/images/doxia-logo.png
Binary files differ
diff --git a/doxia-site-renderer/pom.xml b/doxia-site-renderer/pom.xml
index 7acf057..0d6df2d 100644
--- a/doxia-site-renderer/pom.xml
+++ b/doxia-site-renderer/pom.xml
@@ -139,5 +139,43 @@
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>
+
+ <!-- test -->
+ <dependency>
+ <groupId>org.apache.maven.doxia</groupId>
+ <artifactId>doxia-core</artifactId>
+ <version>${doxiaVersion}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
</dependencies>
+
+ <profiles>
+ <profile>
+ <id>reporting</id>
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>l10n-maven-plugin</artifactId>
+ <version>1.0-alpha-2</version>
+ <configuration>
+ <locales>
+ <locale>de</locale>
+ <locale>en</locale>
+ <locale>es</locale>
+ <locale>fr</locale>
+ <locale>it</locale>
+ <locale>ja</locale>
+ <locale>nl</locale>
+ <locale>pl</locale>
+ <locale>pt_BR</locale>
+ <locale>zh_CN</locale>
+ </locales>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+ </profile>
+ </profiles>
</project>
diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
index 811c241..d4738a6 100644
--- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
+++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
@@ -217,7 +217,7 @@
}
/**
- * <p>isUsingDefaultTemplate</p>
+ * <p>isUsingDefaultTemplate.</p>
*
* @return a boolean.
*/
@@ -227,7 +227,7 @@
}
/**
- * <p>addSiteDirectory</p>
+ * <p>addSiteDirectory.</p>
*
* @param file a {@link java.io.File} object.
*/
@@ -237,7 +237,7 @@
}
/**
- * <p>addModuleDirectory</p>
+ * <p>addModuleDirectory.</p>
*
* @param file a {@link java.io.File} object.
* @param moduleParserId a {@link java.lang.String} object.
diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java
index 79d47bb..187560a 100644
--- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java
+++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java
@@ -25,7 +25,6 @@
import java.util.List;
import javax.swing.text.html.HTML.Attribute;
-import javax.swing.text.html.HTML.Tag;
import org.apache.maven.doxia.module.xhtml.XhtmlSink;
import org.apache.maven.doxia.sink.render.RenderingContext;
@@ -53,6 +52,8 @@
private final StringWriter headWriter;
+ private StringBuffer sectionTitleBuffer;
+
private boolean sectionHasID;
private final Writer writer;
@@ -183,7 +184,7 @@
}
/**
- * <p>getBody</p>
+ * <p>getBody.</p>
*
* @return a {@link java.lang.String} object.
*/
@@ -193,7 +194,7 @@
}
/**
- * <p>getHead</p>
+ * <p>getHead.</p>
*
* @return a {@link java.lang.String} object.
*
@@ -216,103 +217,32 @@
setHeadFlag( true );
}
-
/** {@inheritDoc} */
- public void sectionTitle( int level, SinkEventAttributes attributes )
+ protected void onSectionTitle( int depth, SinkEventAttributes attributes )
{
- if ( level == SECTION_LEVEL_1 || level == SECTION_LEVEL_2 )
- {
- setHeadFlag( true );
+ this.sectionTitleBuffer = new StringBuffer();
+ sectionHasID = ( attributes != null && attributes.isDefined ( Attribute.ID.toString() ) );
- sectionHasID = ( attributes != null && attributes.isDefined ( Attribute.ID.toString() ) );
- }
- else
- {
- super.sectionTitle( level, attributes );
- }
+ super.onSectionTitle( depth, attributes );
}
/** {@inheritDoc} */
- public void sectionTitle_( int level )
+ protected void onSectionTitle_( int depth )
{
- if ( level == SECTION_LEVEL_1 || level == SECTION_LEVEL_2 )
+ String sectionTitle = sectionTitleBuffer.toString();
+ this.sectionTitleBuffer = null;
+
+ if ( !sectionHasID && !StringUtils.isEmpty( sectionTitle ) )
{
- String sectionTitle = "";
-
- if ( getTextBuffer().length() > 0 )
- {
- sectionTitle = getTextBuffer().toString();
- }
-
- resetTextBuffer();
-
- setHeadFlag( false );
-
- writeStartTag( level == SECTION_LEVEL_1 ? Tag.H2 : Tag.H3 );
-
- if ( !sectionHasID && !StringUtils.isEmpty( sectionTitle ) )
- {
- anchor( HtmlTools.encodeId( sectionTitle ) );
- anchor_();
- }
- else
- {
- sectionHasID = false;
- }
-
- text( sectionTitle );
- writeEndTag( level == SECTION_LEVEL_1 ? Tag.H2 : Tag.H3 );
+ anchor( HtmlTools.encodeId( sectionTitle ) );
+ anchor_();
}
else
{
- super.sectionTitle_( level );
+ sectionHasID = false;
}
- }
- /**
- * {@inheritDoc}
- *
- * Sets the head flag to true so the title text is buffered until the closing tag.
- * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle1()
- */
- public void sectionTitle1()
- {
- sectionTitle( SECTION_LEVEL_1, null );
- }
-
- /**
- * {@inheritDoc}
- *
- * Writes out a sectionTitle1 block, including an anchor that is constructed from the
- * buffered title text via {@link org.apache.maven.doxia.util.HtmlTools#encodeId(String)}.
- * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle1_()
- */
- public void sectionTitle1_()
- {
- sectionTitle_( SECTION_LEVEL_1 );
- }
-
- /**
- * {@inheritDoc}
- *
- * Sets the head flag to true so the title text is buffered until the closing tag.
- * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle2()
- */
- public void sectionTitle2()
- {
- sectionTitle( SECTION_LEVEL_2, null );
- }
-
- /**
- * {@inheritDoc}
- *
- * Writes out a sectionTitle2 block, including an anchor that is constructed from the
- * buffered title text via {@link org.apache.maven.doxia.util.HtmlTools#encodeId(String)}.
- * @see org.apache.maven.doxia.sink.XhtmlBaseSink#sectionTitle2_()
- */
- public void sectionTitle2_()
- {
- sectionTitle_( SECTION_LEVEL_2 );
+ super.onSectionTitle_( depth );
}
/**
@@ -327,6 +257,18 @@
}
/** {@inheritDoc} */
+ public void text( String text )
+ {
+ if ( sectionTitleBuffer != null )
+ {
+ // this implies we're inside a section title, collect text events for anchor generation
+ sectionTitleBuffer.append( text );
+ }
+
+ super.text( text );
+ }
+
+ /** {@inheritDoc} */
protected void write( String text )
{
if ( isHeadFlag() )
diff --git a/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm b/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
index 6453a36..2c0b3dd 100644
--- a/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
+++ b/doxia-site-renderer/src/main/resources/org/apache/maven/doxia/siterenderer/resources/default-site.vm
@@ -149,9 +149,9 @@
#macro ( copyright )
#if ( $project )
- #if ( ${project.organization} && ${project.organization.name} )
+ #if ( ${project.organization} && ${project.organization.name} )
#set ( $period = "" )
- #else
+ #else
#set ( $period = "." )
#end
@@ -284,9 +284,9 @@
<a href="$href" title="$name" class="poweredBy">
#set ( $img = $PathTool.calculateLink( $img, $relativePath ) )
#set ( $img = $img.replaceAll( "\\", "/" ) )
- <img class="poweredBy"
- alt="$name"
- src="$img"
+ <img class="poweredBy"
+ alt="$name"
+ src="$img"
width="90"
height="30"
/>
@@ -294,9 +294,9 @@
#end
#if( $poweredBy.isEmpty() )
<a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
- <img class="poweredBy"
- alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
- src="$relativePath/images/logos/maven-feather.png"
+ <img class="poweredBy"
+ alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
+ src="$relativePath/images/logos/maven-feather.png"
width="90"
height="30"
border="1" />
@@ -304,9 +304,9 @@
#end
#else
<a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
- <img class="poweredBy"
- alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
- src="$relativePath/images/logos/maven-feather.png"
+ <img class="poweredBy"
+ alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
+ src="$relativePath/images/logos/maven-feather.png"
width="90"
height="30"
border="1"
@@ -328,6 +328,12 @@
#foreach( $author in $authors )
<meta name="author" content="$author" />
#end
+#if ( $dateCreation )
+ <meta name="Date-Creation-yyyymmdd" content="$dateCreation" />
+#end
+#if ( $dateRevision )
+ <meta name="Date-Revision-yyyymmdd" content="$dateRevision" />
+#end
#if ( $decoration.body.head )
#foreach( $item in $decoration.body.head.getChildren() )
## Workaround for DOXIA-150 due to a non-desired behaviour in p-u
diff --git a/doxia-site-renderer/src/main/resources/site-renderer_en.properties b/doxia-site-renderer/src/main/resources/site-renderer_en.properties
new file mode 100644
index 0000000..0c479bc
--- /dev/null
+++ b/doxia-site-renderer/src/main/resources/site-renderer_en.properties
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# NOTE:
+# This bundle is intentionally empty because English strings are provided by the base bundle via the parent chain. It
+# must be provided nevertheless such that a request for locale "en" will not errorneously pick up the bundle for the
+# JVM's default locale (which need not be "en"). See the method javadoc about
+# ResourceBundle.getBundle(String, Locale, ClassLoader)
+# for a full description of the lookup strategy.
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java
index 7748097..9307897 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/AptVerifier.java
@@ -23,14 +23,16 @@
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlHeader2;
+import com.gargoylesoftware.htmlunit.html.HtmlHeader3;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlParagraph;
+import com.gargoylesoftware.htmlunit.html.UnknownHtmlElement;
import java.util.Iterator;
/**
- *
+ * Verifies apt transformations.
*
* @author ltheussl
* @version $Id$
@@ -69,6 +71,7 @@
HtmlParagraph p = (HtmlParagraph) elementIterator.next();
assertNotNull( p );
+ // Expected log: [APT Parser] Ambiguous link: 'cdc.html'. If this is a local link, prepend "./"!
a = (HtmlAnchor) elementIterator.next();
assertEquals( "Anchor", a.getAttributeValue( "name" ) );
a = (HtmlAnchor) elementIterator.next();
@@ -91,6 +94,7 @@
assertEquals( "http://maven.apache.org/", a.getAttributeValue( "href" ) );
assertEquals( "externalLink", a.getAttributeValue( "class" ) );
+ // Expected log: [APT Parser] Ambiguous link: 'cdc.html'. If this is a local link, prepend "./"!
a = (HtmlAnchor) elementIterator.next();
assertEquals( "./cdc.html", a.getAttributeValue( "href" ) );
a = (HtmlAnchor) elementIterator.next();
@@ -98,5 +102,64 @@
a = (HtmlAnchor) elementIterator.next();
assertEquals( "/index.html", a.getAttributeValue( "href" ) );
+
+ div = (HtmlDivision) elementIterator.next();
+ assertEquals( "section", div.getAttributeValue( "class" ) );
+
+ h2 = (HtmlHeader2) elementIterator.next();
+ assertNotNull( h2 );
+ assertEquals( "Section formatting: italic bold mono", h2.asText().trim() );
+
+ UnknownHtmlElement unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "i", unknown.getTagName() );
+ assertEquals( "italic", unknown.asText().trim() );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "b", unknown.getTagName() );
+ assertEquals( "bold", unknown.asText().trim() );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "tt", unknown.getTagName() );
+ assertEquals( "mono", unknown.asText().trim() );
+
+ a = (HtmlAnchor) elementIterator.next();
+ assertEquals( "Section_formatting:_italic_bold_mono", a.getAttributeValue( "name" ) );
+
+ div = (HtmlDivision) elementIterator.next();
+ assertEquals( "section", div.getAttributeValue( "class" ) );
+
+ HtmlHeader3 h3 = (HtmlHeader3) elementIterator.next();
+ assertNotNull( h3 );
+ assertEquals( "SubSection formatting: italic bold mono", h3.asText().trim() );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "i", unknown.getTagName() );
+ assertEquals( "italic", unknown.asText().trim() );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "b", unknown.getTagName() );
+ assertEquals( "bold", unknown.asText().trim() );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "tt", unknown.getTagName() );
+ assertEquals( "mono", unknown.asText().trim() );
+
+ a = (HtmlAnchor) elementIterator.next();
+ assertEquals( "SubSection_formatting:_italic_bold_mono", a.getAttributeValue( "name" ) );
+
+ p = (HtmlParagraph) elementIterator.next();
+ assertNotNull( p );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "i", unknown.getTagName() );
+ assertEquals( "italic", unknown.asText().trim() );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "b", unknown.getTagName() );
+ assertEquals( "bold", unknown.asText().trim() );
+
+ unknown = (UnknownHtmlElement) elementIterator.next();
+ assertEquals( "tt", unknown.getTagName() );
+ assertEquals( "mono", unknown.asText().trim() );
}
}
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
index b84e488..62048fb 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
@@ -20,18 +20,26 @@
*/
import java.io.File;
+import java.io.FileOutputStream;
import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.io.Reader;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader;
+import org.apache.maven.doxia.xsd.AbstractXmlValidatorTest;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.StringUtils;
/**
@@ -63,6 +71,21 @@
renderer = (Renderer) lookup( Renderer.ROLE );
+ // copy the default-site.vm
+ InputStream is =
+ this.getResourceAsStream( "/org/apache/maven/doxia/siterenderer/resources/default-site.vm" );
+ assertNotNull( is );
+ OutputStream os = new FileOutputStream( new File( getBasedir(), "target/test-classes/default-site.vm" ) );
+ try
+ {
+ IOUtil.copy( is, os );
+ }
+ finally
+ {
+ IOUtil.close( is );
+ IOUtil.close( os );
+ }
+
// Safety
FileUtils.deleteDirectory( getTestFile( OUTPUT ) );
}
@@ -117,6 +140,11 @@
verifyMisc();
verifyDocbookPageExists();
verifyApt();
+
+ // ----------------------------------------------------------------------
+ // Validate the rendering pages
+ // ----------------------------------------------------------------------
+ validatePages();
}
/**
@@ -252,4 +280,82 @@
AptVerifier verifier = new AptVerifier();
verifier.verify( "target/output/apt.html" );
}
+
+ /**
+ * Validate the generated pages.
+ *
+ * @throws Exception if something goes wrong.
+ * @since 1.1.1
+ */
+ public void validatePages() throws Exception
+ {
+ // Need to refactor...
+ XhtmlValidatorTest validator = new XhtmlValidatorTest();
+ validator.setUp();
+ validator.testValidateFiles();
+ }
+
+ protected static class XhtmlValidatorTest
+ extends AbstractXmlValidatorTest
+ {
+ /** {@inheritDoc} */
+ protected void setUp()
+ throws Exception
+ {
+ super.setUp();
+ }
+
+ /** {@inheritDoc} */
+ protected void tearDown()
+ throws Exception
+ {
+ super.tearDown();
+ }
+
+ /** {@inheritDoc} */
+ protected String[] getIncludes()
+ {
+ return new String[] { "**/*.html" };
+ }
+
+ /** {@inheritDoc} */
+ protected String addNamespaces( String content )
+ {
+ return content;
+ }
+
+ /** {@inheritDoc} */
+ protected Map getTestDocuments()
+ throws IOException
+ {
+ Map testDocs = new HashMap();
+
+ File dir = new File( getBasedir(), "target/output" );
+
+ List l = FileUtils.getFileNames( dir, getIncludes()[0], FileUtils.getDefaultExcludesAsString(), true );
+ for ( Iterator it = l.iterator(); it.hasNext(); )
+ {
+ String file = it.next().toString();
+ file = StringUtils.replace( file, "\\", "/" );
+
+ Reader reader = ReaderFactory.newXmlReader( new File( file ) );
+ try
+ {
+ testDocs.put( file, IOUtil.toString( reader ) );
+ }
+ finally
+ {
+ IOUtil.close( reader );
+ }
+ }
+
+ return testDocs;
+ }
+
+ /** {@inheritDoc} */
+ protected boolean isFailErrorMessage( String message )
+ {
+ return true;
+ }
+ }
}
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java
index c1200cb..07a4595 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/EntitiesVerifier.java
@@ -51,7 +51,7 @@
HtmlMeta author = (HtmlMeta) page.getHtmlElementsByName( "author" ).get( 0 );
assertNotNull( author );
assertTrue( author.toString().indexOf( "Ligature Æ" ) > 0 );
- assertEquals( "Ligature Æ", author.getContentAttribute() );
+ assertEquals( "Ligature \u00C6", author.getContentAttribute() );
author = (HtmlMeta) page.getHtmlElementsByName( "author" ).get( 1 );
assertNotNull( author );
@@ -109,7 +109,7 @@
HtmlAnchor a = (HtmlAnchor) elementIterator.next();
assertNotNull( a );
- assertEquals( a.getAttributeValue( "name" ), "section_name_with_entities:____x1d7ed" );
+ assertEquals( a.getAttributeValue( "name" ), "section_name_with_entities:____" );
div = (HtmlDivision) elementIterator.next();
assertNotNull( div );
@@ -123,6 +123,10 @@
assertNotNull( h4 );
assertEquals( h4.asText().trim(), "Entities" );
+ a = (HtmlAnchor) elementIterator.next();
+ assertNotNull( a );
+ assertEquals( a.getAttributeValue( "name" ), "Entities" );
+
div = (HtmlDivision) elementIterator.next();
HtmlHeader3 h3 = (HtmlHeader3) elementIterator.next();
@@ -145,7 +149,7 @@
p = (HtmlParagraph) elementIterator.next();
assertNotNull( p );
- assertEquals( p.asText().trim(), "'\u0391' '\u0392' '\u0393' '\uD7ED'" );
+ assertEquals( p.asText().trim(), "'\u0391' '\u0392' '\u0393' '\uD7ED\uD7ED' '\u0159\u0159' '\u0159'" );
div = (HtmlDivision) elementIterator.next();
@@ -167,6 +171,10 @@
assertNotNull( h4 );
assertEquals( h4.asText().trim(), "CDATA" );
+ a = (HtmlAnchor) elementIterator.next();
+ assertNotNull( a );
+ assertEquals( a.getAttributeValue( "name" ), "CDATA" );
+
div = (HtmlDivision) elementIterator.next();
assertNotNull( div );
assertEquals( div.getAttributeValue( "class" ), "source" );
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java
index d5862bb..0d00641 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/FaqVerifier.java
@@ -31,9 +31,6 @@
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlParagraph;
import com.gargoylesoftware.htmlunit.html.HtmlPreformattedText;
-import com.gargoylesoftware.htmlunit.html.HtmlTable;
-import com.gargoylesoftware.htmlunit.html.HtmlTableDataCell;
-import com.gargoylesoftware.htmlunit.html.HtmlTableRow;
import java.util.Iterator;
@@ -72,6 +69,9 @@
assertEquals( h2.asText().trim(), "Oft Asked Questions" );
HtmlAnchor a = (HtmlAnchor) elementIterator.next();
+ assertEquals( a.getAttributeValue( "name" ), "top" );
+
+ a = (HtmlAnchor) elementIterator.next();
assertEquals( a.getAttributeValue( "name" ), "Oft_Asked_Questions" );
HtmlParagraph p = (HtmlParagraph) elementIterator.next();
@@ -148,16 +148,8 @@
assertEquals( element.getTagName(), "i" );
assertEquals( element.asText().trim(), "italic" );
- HtmlTable table = (HtmlTable) elementIterator.next();
- assertEquals( table.getAttributeValue( "border" ), "0" );
-
- element = (HtmlElement) elementIterator.next();
- // this is a htmlunit bug
- assertEquals( element.getTagName(), "tbody" );
-
- HtmlTableRow tr = (HtmlTableRow) elementIterator.next();
- HtmlTableDataCell td = (HtmlTableDataCell) elementIterator.next();
- assertEquals( td.getAttributeValue( "align" ), "right" );
+ p = (HtmlParagraph) elementIterator.next();
+ assertEquals( p.getAttributeValue( "align" ), "right" );
a = (HtmlAnchor) elementIterator.next();
assertEquals( a.getAttributeValue( "href" ), "#top" );
@@ -195,16 +187,8 @@
HtmlPreformattedText pre = (HtmlPreformattedText) elementIterator.next();
assertEquals( pre.asText().trim(), "<source>1.5</source>" );
- table = (HtmlTable) elementIterator.next();
- assertEquals( table.getAttributeValue( "border" ), "0" );
-
- element = (HtmlElement) elementIterator.next();
- // this is a htmlunit bug
- assertEquals( element.getTagName(), "tbody" );
-
- tr = (HtmlTableRow) elementIterator.next();
- td = (HtmlTableDataCell) elementIterator.next();
- assertEquals( td.getAttributeValue( "align" ), "right" );
+ p = (HtmlParagraph) elementIterator.next();
+ assertEquals( p.getAttributeValue( "align" ), "right" );
a = (HtmlAnchor) elementIterator.next();
assertEquals( a.getAttributeValue( "href" ), "#top" );
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java
index 1c7f53d..83fd239 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/JavascriptVerifier.java
@@ -37,7 +37,7 @@
/**
- *
+ * Verify javascript code.
*
* @author ltheussl
* @version $Id$
diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java
index 1267dc4..7b6d9da 100644
--- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java
+++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/NestedItemsVerifier.java
@@ -90,6 +90,10 @@
assertNotNull( h4 );
assertEquals( h4.asText().trim(), "Unordered lists" );
+ a = (HtmlAnchor) elementIterator.next();
+ assertNotNull( a );
+ assertEquals( a.getAttributeValue( "name" ), "Unordered_lists" );
+
HtmlParagraph p = (HtmlParagraph) elementIterator.next();
assertNotNull( p );
assertEquals( p.asText().trim(), "Below is an unordered list, followed by six paragraphs." );
@@ -176,6 +180,10 @@
assertNotNull( h4 );
assertEquals( h4.asText().trim(), "Ordered lists" );
+ a = (HtmlAnchor) elementIterator.next();
+ assertNotNull( a );
+ assertEquals( a.getAttributeValue( "name" ), "Ordered_lists" );
+
p = (HtmlParagraph) elementIterator.next();
assertNotNull( p );
assertEquals( p.asText().trim(), "Below is an ordered list, followed by six paragraphs." );
@@ -258,6 +266,10 @@
assertNotNull( h4 );
assertEquals( h4.asText().trim(), "Definition lists" );
+ a = (HtmlAnchor) elementIterator.next();
+ assertNotNull( a );
+ assertEquals( a.getAttributeValue( "name" ), "Definition_lists" );
+
p = (HtmlParagraph) elementIterator.next();
assertNotNull( p );
assertEquals( p.asText().trim(), "Below is a definition list, followed by six paragraphs." );
diff --git a/doxia-site-renderer/src/test/resources/default-site.vm b/doxia-site-renderer/src/test/resources/default-site.vm
deleted file mode 100644
index ef1a4b0..0000000
--- a/doxia-site-renderer/src/test/resources/default-site.vm
+++ /dev/null
@@ -1,391 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-#macro ( link $href $name )
- #if ( ( $href.toLowerCase().startsWith("http") || $href.toLowerCase().startsWith("https") ) )
- <a href="$href" class="externalLink">$name</a>
- #else
- <a href="$href">$name</a>
- #end
-#end
-
-#macro ( banner $banner $id )
- #if ( $banner )
- #if( $banner.href )
- <a href="$banner.href" id="$id" #if( $banner.alt ) title="$banner.alt" #end >
- #else
- <div id="$id">
- #end
-
- #if( $banner.src )
- #set ( $src = $banner.src )
- #if ( ! ( $src.toLowerCase().startsWith("http") || $src.toLowerCase().startsWith("https") ) )
- #set ( $src = $PathTool.calculateLink( $src, $relativePath ) )
- #set ( $src = $src.replaceAll( "\\", "/" ) )
- #end
- #if ( $banner.alt )
- #set ( $alt = $banner.alt )
- #else
- #set ( $alt = $banner.name )
- #end
- <img src="$src" alt="$alt" />
- #else
- $banner.name
- #end
-
- #if( $banner.href )
- </a>
- #else
- </div>
- #end
- #end
-#end
-
-#macro ( links $links )
- #set ( $counter = 0 )
- #foreach( $item in $links )
- #set ( $counter = $counter + 1 )
- #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
- #set ( $currentItemHref = $currentItemHref.replaceAll( "\\", "/" ) )
- #link( $currentItemHref $item.name )
- #if ( $links.size() > $counter )
- |
- #end
- #end
-#end
-
-#macro ( breadcrumbs $breadcrumbs )
- #set ( $counter = 0 )
- #foreach( $item in $breadcrumbs )
- #set ( $counter = $counter + 1 )
- #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
- #set ( $currentItemHref = $currentItemHref.replaceAll( "\\", "/" ) )
-
- #if ( $currentItemHref == $alignedFileName || $currentItemHref == "" )
- $item.name
- #else
- #link( $currentItemHref $item.name )
- #end
- #if ( $breadcrumbs.size() > $counter )
- >
- #end
- #end
-#end
-
-#macro ( displayTree $display $item )
- #if ( $item && $item.items && $item.items.size() > 0 )
- #foreach( $subitem in $item.items )
- #set ( $subitemHref = $PathTool.calculateLink( $subitem.href, $relativePath ) )
- #set ( $subitemHref = $subitemHref.replaceAll( "\\", "/" ) )
- #if ( $alignedFileName == $subitemHref )
- #set ( $display = true )
- #end
-
- #displayTree( $display $subitem )
- #end
- #end
-#end
-
-#macro ( menuItem $item )
- #set ( $collapse = "none" )
- #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
- #set ( $currentItemHref = $currentItemHref.replaceAll( "\\", "/" ) )
-
- #if ( $item && $item.items && $item.items.size() > 0 )
- #if ( $item.collapse == false )
- #set ( $collapse = "expanded" )
- #else
- ## By default collapsed
- #set ( $collapse = "collapsed" )
- #end
-
- #set ( $display = false )
- #displayTree( $display $item )
-
- #if ( $alignedFileName == $currentItemHref || $display )
- #set ( $collapse = "expanded" )
- #end
- #end
- <li class="$collapse">
- #if ( $item.img )
- #if ( ! ( $item.img.toLowerCase().startsWith("http") || $item.img.toLowerCase().startsWith("https") ) )
- #set ( $src = $PathTool.calculateLink( $item.img, $relativePath ) )
- #set ( $src = $src.replaceAll( "\\", "/" ) )
- <img src="$src"/>
- #else
- <img src="$item.img" align="absbottom" style="border-width: 0"/>
- #end
- #end
- #if ( $alignedFileName == $currentItemHref )
- <strong>$item.name</strong>
- #else
- #link( $currentItemHref $item.name )
- #end
- #if ( $item && $item.items && $item.items.size() > 0 )
- #if ( $collapse == "expanded" )
- <ul>
- #foreach( $subitem in $item.items )
- #menuItem( $subitem )
- #end
- </ul>
- #end
- #end
- </li>
-#end
-
-#macro ( mainMenu $menus )
- #foreach( $menu in $menus )
- #if ( $menu.name )
- <h5>$menu.name</h5>
- #end
- #if ( $menu.items && $menu.items.size() > 0 )
- <ul>
- #foreach( $item in $menu.items )
- #menuItem( $item )
- #end
- </ul>
- #end
- #end
-#end
-
-#macro ( copyright )
- #if ( $project )
- #if ( ${project.organization} && ${project.organization.name} )
- #set ( $period = "" )
- #else
- #set ( $period = "." )
- #end
-
- #set ( $currentYear = ${currentDate.year} + 1900 )
-
- #if ( ${project.inceptionYear} && ( ${project.inceptionYear} != ${currentYear.toString()} ) )
- ${project.inceptionYear}-${currentYear}${period}
- #else
- ${currentYear}${period}
- #end
-
- #if ( ${project.organization} )
- #if ( ${project.organization.name} && ${project.organization.url} )
- <a href="$project.organization.url">${project.organization.name}</a>.
- #elseif ( ${project.organization.name} )
- ${project.organization.name}.
- #end
- #end
- #end
-#end
-
-#macro ( publishDate $position $publishDate $version )
- #if ( $publishDate && $publishDate.format )
- #set ( $format = $publishDate.format )
- #else
- #set ( $format = "yyyy-MM-dd" )
- #end
-
- $dateFormat.applyPattern( $format )
-
- #set ( $dateToday = $dateFormat.format( $currentDate ) )
-
- #if ( $publishDate && $publishDate.position )
- #set ( $datePosition = $publishDate.position )
- #else
- #set ( $datePosition = "left" )
- #end
-
- #if ( $version )
- #if ( $version.position )
- #set ( $versionPosition = $version.position )
- #else
- #set ( $versionPosition = "left" )
- #end
- #else
- #set ( $version = "" )
- #set ( $versionPosition = "left" )
- #end
-
- #set ( $breadcrumbs = $decoration.body.breadcrumbs )
- #set ( $links = $decoration.body.links )
-
- #if ( $datePosition.equalsIgnoreCase( "right" ) && $links && $links.size() > 0 )
- #set ( $prefix = " |" )
- #else
- #set ( $prefix = "" )
- #end
-
- #if ( $datePosition.equalsIgnoreCase( $position ) )
- #if ( ( $datePosition.equalsIgnoreCase( "right" ) ) || ( $datePosition.equalsIgnoreCase( "bottom" ) ) )
- $prefix <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
- #if ( $versionPosition.equalsIgnoreCase( $position ) )
- | <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
- #end
- #elseif ( ( $datePosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $datePosition.equalsIgnoreCase( "navigation-top" ) ) )
- <div id="lastPublished">
- <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
- #if ( $versionPosition.equalsIgnoreCase( $position ) )
- | <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
- #end
- </div>
- #elseif ( $datePosition.equalsIgnoreCase("left") )
- <div class="xleft">
- <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
- #if ( $versionPosition.equalsIgnoreCase( $position ) )
- | <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
- #end
- #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
- | #breadcrumbs( $breadcrumbs )
- #end
- </div>
- #end
- #elseif ( $versionPosition.equalsIgnoreCase( $position ) )
- #if ( ( $versionPosition.equalsIgnoreCase( "right" ) ) || ( $versionPosition.equalsIgnoreCase( "bottom" ) ) )
- $prefix <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
- #elseif ( ( $versionPosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $versionPosition.equalsIgnoreCase( "navigation-top" ) ) )
- <div id="lastPublished">
- <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
- </div>
- #elseif ( $versionPosition.equalsIgnoreCase("left") )
- <div class="xleft">
- <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
- #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
- | #breadcrumbs( $breadcrumbs )
- #end
- </div>
- #end
- #elseif ( $position.equalsIgnoreCase( "left" ) )
- #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
- <div class="xleft">
- #breadcrumbs( $breadcrumbs )
- </div>
- #end
- #end
-#end
-
-#macro ( poweredByLogo $poweredBy )
- #if( $poweredBy )
- #foreach ($item in $poweredBy)
- #if( $item.href )
- #set ( $href = $PathTool.calculateLink( $item.href, $relativePath ) )
- #set ( $href = $href.replaceAll( "\\", "/" ) )
- #else
- #set ( $href="http://maven.apache.org/" )
- #end
-
- #if( $item.name )
- #set ( $name = $item.name )
- #else
- #set ( $name = $i18n.getString( "site-renderer", $locale, "template.builtby" ) )
- #set ( $name = "${name} Maven" )
- #end
-
- #if( $item.img )
- #set ( $img = $item.img )
- #else
- #set ( $img = "images/logos/maven-feather.png" )
- #end
-
- <a href="$href" title="$name" class="poweredBy">
- #set ( $img = $PathTool.calculateLink( $img, $relativePath ) )
- #set ( $img = $img.replaceAll( "\\", "/" ) )
- <img class="poweredBy"
- alt="$name"
- src="$img"
- width="90"
- height="30"
- />
- </a>
- #end
- #if( $poweredBy.isEmpty() )
- <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
- <img class="poweredBy"
- alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
- src="$relativePath/images/logos/maven-feather.png"
- width="90"
- height="30"
- border="1" />
- </a>
- #end
- #else
- <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
- <img class="poweredBy"
- alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven"
- src="$relativePath/images/logos/maven-feather.png"
- width="90"
- height="30"
- border="1"
- />
- </a>
- #end
-#end
-
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=${outputEncoding}" />
- <title>$title</title>
- <style type="text/css" media="all">
- @import url("$relativePath/css/maven-base.css");
- @import url("$relativePath/css/maven-theme.css");
- @import url("$relativePath/css/site.css");
- </style>
- <link rel="stylesheet" href="$relativePath/css/print.css" type="text/css" media="print" />
-#foreach( $author in $authors )
- <meta name="author" content="$author" />
-#end
-#if ( $dateCreation )
- <meta name="Date-Creation-yyyymmdd" content="$dateCreation">
-#end
-#if ( $dateRevision )
- <meta name="Date-Revision-yyyymmdd" content="$dateRevision">
-#end
- #if ( $decoration.body.head )
- #foreach( $item in $decoration.body.head.getChildren() )
- ## Workaround for DOXIA-150 due to a non-desired behaviour in p-u
- ## @see org.codehaus.plexus.util.xml.Xpp3Dom#toString()
- ## @see org.codehaus.plexus.util.xml.Xpp3Dom#toUnescapedString()
- #set ( $documentHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" )
- #set ( $documentHeader = $documentHeader.replaceAll( "\\", "" ) )
- #if ( $item.name == "script" )
- $StringUtils.replace( $item.toUnescapedString(), $documentHeader, "" )
- #else
- $StringUtils.replace( $item.toString(), $documentHeader, "" )
- #end
- #end
- #end
- $headContent
- </head>
- <body class="composite">
- <div id="banner">
- #banner( $decoration.bannerLeft "bannerLeft" )
- #banner( $decoration.bannerRight "bannerRight" )
- <div class="clear">
- <hr/>
- </div>
- </div>
- <div id="breadcrumbs">
- #publishDate( "left" $decoration.publishDate $decoration.version )
- <div class="xright">#links( $decoration.body.links )#publishDate( "right" $decoration.publishDate $decoration.version )</div>
- <div class="clear">
- <hr/>
- </div>
- </div>
- <div id="leftColumn">
- <div id="navcolumn">
- #publishDate( "navigation-top" $decoration.publishDate $decoration.version )
- #mainMenu( $decoration.body.menus )
- #poweredByLogo( $decoration.poweredBy )
- #publishDate( "navigation-bottom" $decoration.publishDate $decoration.version )
- </div>
- </div>
- <div id="bodyColumn">
- <div id="contentBox">
- $bodyContent
- </div>
- </div>
- <div class="clear">
- <hr/>
- </div>
- <div id="footer">
- <div class="xright">Copyright ©#copyright()All Rights Reserved.#publishDate( "bottom" $decoration.publishDate $decoration.version )</div>
- <div class="clear">
- <hr/>
- </div>
- </div>
- </body>
-</html>
diff --git a/doxia-site-renderer/src/test/resources/site/apt/apt.apt b/doxia-site-renderer/src/test/resources/site/apt/apt.apt
index a58316a..c387e55 100644
--- a/doxia-site-renderer/src/test/resources/site/apt/apt.apt
+++ b/doxia-site-renderer/src/test/resources/site/apt/apt.apt
@@ -38,6 +38,12 @@
Link to {{{./cdc.html}other document}} and within {{{cdc.html}same document}}.
Link to {{{/index.html}root document}}.
+Section formatting: <italic> <<bold>> <<<mono>>>
+
+* SubSection formatting: <italic> <<bold>> <<<mono>>>
+
+ <italic> <<bold>> <<<mono>>>
+
TOC Macro
%{toc}
diff --git a/doxia-site-renderer/src/test/resources/site/apt/cdc.apt b/doxia-site-renderer/src/test/resources/site/apt/cdc.apt
index 8f10cf1..b61ce89 100644
--- a/doxia-site-renderer/src/test/resources/site/apt/cdc.apt
+++ b/doxia-site-renderer/src/test/resources/site/apt/cdc.apt
@@ -1,7 +1,7 @@
-----
Plexus Component Descriptor Creator
-----
- Trygve Laugst�l
+ Trygve Laugstøl
-----
25th May 2005
-----
diff --git a/doxia-site-renderer/src/test/resources/site/docbook/sdocbook_full.xml b/doxia-site-renderer/src/test/resources/site/docbook/sdocbook_full.xml
new file mode 100644
index 0000000..085eeda
--- /dev/null
+++ b/doxia-site-renderer/src/test/resources/site/docbook/sdocbook_full.xml
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<!DOCTYPE article PUBLIC "-//OASIS//DTD Simplified DocBook XML V1.1//EN" "http://www.oasis-open.org/docbook/xml/simple/1.1/sdocbook.dtd">
+
+<article>
+
+ <articleinfo>
+
+ <title>Title</title>
+ <subtitle>Or How I Learned to Live</subtitle>
+ <citetitle>citetitle</citetitle>
+ <!-- Abbreviated titles are usually used only in specific contexts, such as headers and footers, and suppressed everywhere else. -->
+ <titleabbrev>Configuring Menus</titleabbrev>
+
+ <corpauthor>CorpAuthor</corpauthor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+
+ <date>Date</date><!-- DocBook does not specify the format of the date. -->
+
+ <abbrev>Assn.</abbrev>
+
+ <abstract><!-- Formatted as a displayed block. Sometimes suppressed. Often presented in alternate outputs. -->
+ <title>articleinfo Abstract Title</title>
+ <para>articleinfo Abstract Content</para>
+ </abstract>
+
+ <author><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+ <honorific>PhD</honorific>
+ <firstname>Main</firstname>
+ <surname>Author</surname>
+ <lineage>Sr.</lineage>
+ <othername>D</othername>
+ <affiliation>
+ <jobtitle>Director of Cooperative Efforts</jobtitle>
+ <orgname>Cooperative Engineering</orgname>
+ </affiliation>
+ <authorblurb>
+ <title>Title</title>
+ <para>super hero.</para>
+ </authorblurb>
+ </author>
+
+ <honorific>Dr</honorific>
+ <firstname>Peter</firstname>
+ <surname>Doe</surname>
+ <lineage>Sr.</lineage>
+ <othername>Spiderman</othername>
+ <affiliation>
+ <jobtitle>Director of Cooperative Efforts</jobtitle>
+ <orgname>Cooperative Engineering</orgname>
+ </affiliation>
+ <authorblurb>
+ <title>Title</title>
+ <para>super hero.</para>
+ </authorblurb>
+
+ <authorgroup>
+ <corpauthor>Authorgroup CorpAuthor</corpauthor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+
+ <author><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+ <honorific>Dr</honorific>
+ <firstname>Authorgroup</firstname>
+ <surname>Author</surname>
+ <lineage>Sr.</lineage>
+ <othername>D</othername>
+ <affiliation>
+ <jobtitle>Director of Cooperative Efforts</jobtitle>
+ <orgname>Cooperative Engineering</orgname>
+ </affiliation>
+ <authorblurb>
+ <title>authorblurb title</title>
+ <para>He's a super hero in his spare time.</para>
+ </authorblurb>
+ </author>
+
+ <editor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+ <honorific>Dr</honorific>
+ <firstname>Authorgroup</firstname>
+ <surname>Editor</surname>
+ <lineage>Sr.</lineage>
+ <othername>Spiderman</othername>
+ <affiliation>
+ <jobtitle>Director of Cooperative Efforts</jobtitle>
+ <orgname>Cooperative Engineering</orgname>
+ </affiliation>
+ <authorblurb>
+ <title>authorblurb title</title>
+ <para>He's a super hero in his spare time.</para>
+ </authorblurb>
+ </editor>
+
+ <othercredit><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+ <honorific>Dr</honorific>
+ <firstname>Authorgroup</firstname>
+ <surname>OtherCredit</surname>
+ <lineage>Sr.</lineage>
+ <othername>AlterEgo</othername>
+ <affiliation>
+ <jobtitle>Director of Cooperative Efforts</jobtitle>
+ <orgname>Cooperative Engineering</orgname>
+ </affiliation>
+ <authorblurb>
+ <title>authorblurb title</title>
+ <para>He's a super hero in his spare time.</para>
+ </authorblurb>
+ </othercredit>
+ </authorgroup>
+
+ <bibliomisc role="url"><ulink url="http://www.net/"/></bibliomisc>
+
+ <copyright>
+ <year>1996</year>
+ <year>1997</year>
+ <holder>me</holder>
+ </copyright>
+
+ <edition>Edition</edition>
+
+ <editor><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+ <honorific>Dr</honorific>
+ <firstname>Peter</firstname>
+ <surname>Parker</surname>
+ <lineage>Sr.</lineage>
+ <othername>Spiderman</othername>
+ <affiliation>
+ <jobtitle>Director of Cooperative Efforts</jobtitle>
+ <orgname>Cooperative Engineering</orgname>
+ </affiliation>
+ <authorblurb>
+ <title>Title</title>
+ <para>Peter's a super hero in his spare time.</para>
+ </authorblurb>
+ </editor>
+
+ <keywordset>
+ <keyword>key1</keyword>
+ <keyword>key2</keyword>
+ </keywordset>
+
+ <mediaobject>
+ <textobject><phrase>The Eiffel Tower</phrase></textobject>
+ </mediaobject>
+
+ <othercredit><!-- May be formatted inline or as a displayed block, depending on context. Sometimes suppressed. -->
+ <honorific>Dr</honorific>
+ <firstname>John</firstname>
+ <surname>Doe</surname>
+ <lineage>Sr.</lineage>
+ <othername>Spiderman</othername>
+ <affiliation>
+ <jobtitle>Director of Cooperative Efforts</jobtitle>
+ <orgname>Cooperative Engineering</orgname>
+ </affiliation>
+ <authorblurb>
+ <title>Title</title>
+ <para>Peter's a super hero in his spare time.</para>
+ </authorblurb>
+ </othercredit>
+
+ <pubdate>1994</pubdate>
+ <publishername>The TeX User's Group</publishername>
+ <releaseinfo>beta</releaseinfo>
+ <volumenum>15</volumenum>
+ <issuenum>3</issuenum>
+ <legalnotice><para>No notice is required.</para></legalnotice>
+
+ <revhistory>
+ <revision>
+ <revnumber>0.91</revnumber>
+ <date>11 Dec 1996</date>
+ <authorinitials>ndw</authorinitials>
+ <revremark>Bug fixes</revremark>
+ </revision>
+ <revision>
+ <revnumber>0.90</revnumber>
+ <date>30 Nov 1996</date>
+ <authorinitials>ndw</authorinitials>
+ <revdescription><para>long write up</para></revdescription>
+ </revision>
+ </revhistory>
+
+ <subjectset scheme="libraryofcongress">
+ <subject><subjectterm>Electronic Publishing</subjectterm></subject>
+ <subject><subjectterm>SGML (Computer program language)</subjectterm></subject>
+ </subjectset>
+
+ </articleinfo>
+
+
+ <abstract>
+ <title>Abstract Title</title>
+ <para>In brief.</para>
+ </abstract>
+
+ <section>
+ <sectioninfo>
+ <abstract><para>A trivial example of recursive sections.</para></abstract>
+ </sectioninfo>
+ <title>Section title</title>
+ <section><title>Sub-section title</title>
+ <section><title>Sub-sub-section title</title>
+ <section><title>Sub-sub-sub-section title</title>
+ <section id="ch02"><title>Sub-sub-sub-sub-section title</title>
+
+ <epigraph>
+ <attribution>William Shakespeare</attribution>
+ <literallayout>Epigraph: What say you?</literallayout>
+ </epigraph>
+
+ <para>
+ The <abbrev>Assn.</abbrev> of Computing Machinery
+ has published <citetitle pubwork="book">Developing SGML DTDs</citetitle>.
+ </para>
+
+ <para>
+ In <acronym>UNIX</acronym> command <command>ls</command>
+ with the <option>-a</option> option is used to get a directory listing.
+ </para>
+
+ <para>
+ The output from the date command is eg
+ <computeroutput>Sun Nov 16, 1997 21:03:29</computeroutput>.
+ </para>
+
+ <para>
+ An email address is eg <email>yo@tu.com</email>.
+ </para>
+
+ <para>
+ The symbolic constants for error numbers are defined in
+ <filename class="headerfile">errno.h</filename> in
+ <filename class="directory">/usr/include/sys</filename>.
+ </para>
+
+ <para>
+ This software is provided <quote>as is</quote>.
+ </para>
+
+ <para>
+ Execute the command with
+ <command>command</command>
+ <option>options</option>
+ <replaceable>filename</replaceable>.
+ </para>
+
+ <para>
+ This is hosted at <systemitem class="systemname">helio.com</systemitem>.
+ The name <trademark>pipipo</trademark> is traded.
+ The name <trademark class="registered">pipipo</trademark> is registered.
+ The name <trademark class="copyright">pipipo</trademark> is copyrighted.
+ The name <trademark class="service">pipipo</trademark> is serviced.
+ The name <trademark class="trade">pipipo</trademark> is traded.
+ </para>
+
+ <para>
+ At the system prompt, enter <userinput>xyzzy</userinput>.
+ </para>
+
+ <sidebar>
+ <title>A Sidebar</title>
+ <para>Sidebar content.</para>
+ </sidebar>
+
+ <para>
+ A link to an element with an XRefLabel: <xref linkend="ch03"/>.
+ A straight link generates the cross-reference text: <xref linkend="ch02"/>.
+ </para>
+
+ <mediaobject>
+ <audioobject>
+ <objectinfo><title>Phaser sound effect</title></objectinfo>
+ <audiodata fileref="phaser.wav"/>
+ </audioobject>
+ <textobject><phrase>A sound effect.</phrase></textobject>
+ </mediaobject>
+
+ <mediaobject>
+ <videoobject><videodata fileref="movie.avi"/></videoobject>
+ </mediaobject>
+
+ <para>
+ <emphasis>Italic</emphasis> font.
+ <emphasis role="bold">Bold</emphasis> font.
+ <literal>Monospaced</literal> font.
+ </para>
+
+ <example>
+ <title>A Real Function</title>
+ <programlisting>
+ real function()<lineannotation>Error!</lineannotation>
+ </programlisting>
+ </example>
+
+ <blockquote>
+ <attribution>William Shakespeare</attribution>
+ <literallayout>Blockquote: What say you?</literallayout>
+ </blockquote>
+
+ <para>
+ An annual percentage rate of
+ <literal>3.27</literal>%<footnote id="footnote"><para>The prime rate.</para></footnote>
+ will be charged on all balances<footnoteref linkend="footnote"/>.
+ </para>
+
+ <itemizedlist>
+ <listitem><para>List item 1.</para></listitem>
+ <listitem><para>List item 2.</para><para>Paragraph contained in list item 2.</para>
+ <itemizedlist>
+ <listitem><para>Sub-list item 1.</para></listitem>
+ <listitem><para>Sub-list item 2.</para></listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem><para>List item 3. Force end of list:</para></listitem>
+ </itemizedlist>
+
+ <programlisting>Verbatim text not contained in list item 3</programlisting>
+
+ <orderedlist numeration="arabic">
+ <listitem><para>Numbered item 1.</para>
+ <orderedlist numeration="upperalpha">
+ <listitem><para>Numbered item A.</para></listitem>
+ <listitem><para>Numbered item B.</para></listitem>
+ </orderedlist>
+ </listitem>
+ <listitem><para>Numbered item 2.</para></listitem>
+ </orderedlist>
+
+ <para>List numbering schemes: [[1]], [[a]], [[A]], [[i]], [[I]].</para>
+
+ <variablelist>
+ <varlistentry><term>Defined term 1</term><listitem><para>of definition list.</para></listitem></varlistentry>
+ <varlistentry><term>Defined term 2</term><listitem><para>of definition list.</para><programlisting>Verbatim text
+ in a box </programlisting></listitem></varlistentry>
+ </variablelist>
+
+ <figure>
+ <title>Figure title</title>
+ <mediaobject>
+ <imageobject><imagedata fileref="figure.png" format="JPEG" /></imageobject>
+ <caption id="ch03" xreflabel="Chapter the Third"><para>Figure caption</para></caption>
+ </mediaobject>
+ </figure>
+
+<para>
+ Here is an inline image: <inlinemediaobject><imageobject><imagedata fileref="figure.png"/></imageobject></inlinemediaobject>.
+</para>
+
+<!-- FIXME: DOXIA-339 table caption is not emitted correctly
+ <table frame="all" rowsep="1" colsep="1">
+ <title>Table caption</title>
+ <tgroup cols="3">
+ <colspec align="center" /><colspec align="left" /><colspec align="right" />
+ <tbody>
+ <row>
+ <entry>Centered --><!-- LB --><!-- cell 1,1</entry>
+ <entry>Left-aligned --><!-- LB --><!-- cell 1,2</entry>
+ <entry>Right-aligned --><!-- LB --><!-- cell 1,3</entry>
+ </row>
+ <row>
+ <entry>cell 2,1</entry>
+ <entry>cell 2,2</entry>
+ <entry>cell 2,3</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+-->
+
+ <para>No grid, no caption:</para>
+
+ <informaltable frame="none" rowsep="0" colsep="0">
+ <tgroup cols="2">
+ <colspec align="center" /><colspec align="center" />
+ <tbody>
+ <row>
+ <entry>cell</entry>
+ <entry>cell</entry>
+ </row>
+ <row>
+ <entry>cell</entry>
+ <entry>cell</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <informaltable frame="all" rowsep="1" colsep="1">
+ <tgroup cols="2">
+ <colspec align="center" /><colspec align="center" />
+ <thead>
+ <row>
+ <entry>header</entry>
+ <entry>header</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>cell</entry>
+ <entry>cell</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <informaltable frame="all">
+ <tgroup cols="5" align="left" colsep="1" rowsep="1">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <colspec colname="c3"/>
+ <colspec colnum="5" colname="c5"/>
+ <thead>
+ <row>
+ <entry namest="c1" nameend="c2" align="center">Horizontal Span</entry>
+ <entry>a3</entry><entry>a4</entry><entry>a5</entry>
+ </row>
+ </thead>
+ <tfoot>
+ <row>
+ <entry>f1</entry><entry>f2</entry><entry>f3</entry><entry>f4</entry><entry>f5</entry>
+ </row>
+ </tfoot>
+ <tbody>
+ <row>
+ <entry>b1</entry><entry>b2</entry><entry>b3</entry><entry>b4</entry>
+ <entry morerows="1" valign="middle"><para> <!-- Pernicous Mixed Content -->
+ Vertical Span</para></entry>
+ </row>
+ <row>
+ <entry>c1</entry>
+ <entry namest="c2" nameend="c3" align="center" morerows="1" valign="bottom">Span Both</entry>
+ <entry>c4</entry>
+ </row>
+ <row>
+ <entry>d1</entry><entry>d4</entry><entry>d5</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <informaltable frame="all">
+ <tgroup cols="5" align="left" colsep="1" rowsep="1">
+ <colspec colname="c1"/>
+ <colspec colname="c2"/>
+ <colspec colname="c3"/>
+ <colspec colname="c4"/>
+ <colspec colname="c5"/>
+ <spanspec spanname="span" namest="c2" nameend="c4"/>
+ <tbody>
+ <row>
+ <entry>a1</entry><entry align="center" spanname="span">a2</entry><entry>a5</entry>
+ </row>
+ <row>
+ <entry>b1</entry><entry>b2</entry><entry>b3</entry><entry>b4</entry><entry>b5</entry>
+ </row>
+ <row>
+ <entry>c1</entry><entry spanname="span">c2</entry><entry>c5</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <informaltable frame="all">
+ <tgroup cols="3">
+ <tbody>
+ <row>
+ <entry>a1</entry><entry>b1</entry><entry>c1</entry>
+ </row>
+ <row>
+ <entry>a2</entry>
+ <entrytbl cols="3">
+ <tbody>
+ <row>
+ <entry>b2a1</entry><entry>b2b1</entry><entry>b2c1</entry>
+ </row>
+ <row>
+ <entry>b2a2</entry><entry>b2b2</entry><entry>b2c2</entry>
+ </row>
+ <row>
+ <entry>b2a3</entry><entry>b2b3</entry><entry>b2c3</entry>
+ </row>
+ </tbody>
+ </entrytbl>
+ <entry>c2</entry>
+ </row>
+ <row>
+ <entry>a3</entry><entry>b3</entry><entry>c3</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ <para>
+ <anchor id="Anchor" />Anchor<!-- anchor_end -->.
+ Link to <link linkend="Anchor">Anchor</link>.
+ Link to <ulink url="http://www.pixware.fr">http://www.pixware.fr</ulink>.
+ Link to <link linkend="Anchor">showing alternate text</link>.
+ Link to <ulink url="http://www.pixware.fr">Pixware home page</ulink>.
+ </para>
+
+ <note>
+ <title>Upcoming Changes</title>
+ <para>Future versions of this feature may not be backward-compatible.</para>
+ </note>
+ </section>
+ </section>
+ </section>
+ </section>
+ </section>
+
+ <bibliography>
+ <title>A Test Bibliography</title>
+ <bibliodiv><title>Books</title>
+ <bibliomixed>
+ <bibliomset relation="journal">
+ <title>The World Wide Web Journal</title>
+ <volumenum>2</volumenum><issuenum>1</issuenum>.
+ <publishername>O'Reilly & Associates, Inc.</publishername> and
+ <pubdate>Winter, 1996</pubdate></bibliomset>.
+ </bibliomixed>
+ </bibliodiv>
+ </bibliography>
+
+ <appendix>
+ <title>Demonstration Appendix</title>
+ <para>This appendix demonstrates an appendix.</para>
+ </appendix>
+
+</article>
\ No newline at end of file
diff --git a/doxia-site-renderer/src/test/resources/site/fml/faq.fml b/doxia-site-renderer/src/test/resources/site/fml/faq.fml
index 0fa4ede..10c68e9 100644
--- a/doxia-site-renderer/src/test/resources/site/fml/faq.fml
+++ b/doxia-site-renderer/src/test/resources/site/fml/faq.fml
@@ -18,9 +18,9 @@
under the License.
-->
-<faqs xmlns="http://maven.apache.org/FML/1.0"
+<faqs xmlns="http://maven.apache.org/FML/1.0.1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/FML/1.0 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.xsd"
+ xsi:schemaLocation="http://maven.apache.org/FML/1.0.1 file:../../../../../../../doxia/doxia-modules/doxia-module-fml/src/main/resources/fml-1.0.1.xsd"
title="Oft Asked Questions">
<part id="contributing">
diff --git a/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml b/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
index 51ce2d9..c514905 100644
--- a/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
+++ b/doxia-site-renderer/src/test/resources/site/xdoc/entityTest.xml
@@ -27,6 +27,8 @@
<!ENTITY Beta "Β"> <!-- greek capital letter beta, U+0392 -->
<!ENTITY Gamma "Γ"> <!-- greek capital letter gamma, U+0393 ISOgrk3 -->
<!ENTITY tritPos "𝟭"> <!-- MATHEMATICAL SANS-SERIF BOLD DIGIT ONE -->
+<!ENTITY flo "ř">
+<!ENTITY myCustomEntity "&flo;">
]>
<document xmlns="http://maven.apache.org/XDOC/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -53,7 +55,7 @@
<p>'&' '<' '>' '"' '''</p>
<h3>Local Entities: 'Α' 'Β' 'Γ' '&tritPos;'</h3>
- <p>'Α' 'Β' 'Γ' '&tritPos;'</p>
+ <p>'Α' 'Β' 'Γ' '&tritPos;𝟭' '&flo;ř' '&myCustomEntity;'</p>
<h3>DTD Entities: ' ' '¡' '¢'</h3>
<p>' ' '¡' '¢'</p>
diff --git a/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml b/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml
index 3fa84d1..16114a4 100644
--- a/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml
+++ b/doxia-site-renderer/src/test/resources/site/xdoc/javascript.xml
@@ -33,7 +33,9 @@
<p>You should see a JavaScript alert...</p>
<script type="text/javascript">
- <![CDATA[alert("Hello!");]]>
+ //<![CDATA[
+ alert("Hello!");
+ //]]>
</script>
</section>
diff --git a/pom.xml b/pom.xml
index a7d37b8..8bc4fe5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,7 +25,7 @@
<parent>
<groupId>org.apache.maven</groupId>
<artifactId>maven-parent</artifactId>
- <version>11</version>
+ <version>12</version>
<relativePath>../../pom/maven/pom.xml</relativePath>
</parent>
@@ -186,7 +186,7 @@
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
- <version>1.5.7</version>
+ <version>1.5.15</version>
</dependency>
</dependencies>
</dependencyManagement>
@@ -215,6 +215,11 @@
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.2-beta-4</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<tagBase>https://svn.apache.org/repos/asf/maven/doxia/doxia-sitetools/tags</tagBase>
@@ -229,10 +234,51 @@
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
- <version>1.0.1</version>
+ <version>1.0.2</version>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>clirr-maven-plugin</artifactId>
+ <version>2.2.2</version>
+ <configuration>
+ <comparisonVersion>1.1</comparisonVersion>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <source>1.4</source>
+ <links>
+ <link>http://java.sun.com/j2se/1.4.2/docs/api/</link>
+ <link>http://plexus.codehaus.org/plexus-utils/apidocs/</link>
+ <link>http://junit.sourceforge.net/javadoc/</link>
+ </links>
+ <tagletArtifacts>
+ <tagletArtifact>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-javadoc</artifactId>
+ <version>1.0</version>
+ </tagletArtifact>
+ </tagletArtifacts>
+ </configuration>
</plugin>
</plugins>
</pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>clirr-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>verify</phase>
+ <goals>
+ <goal>check</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
</build>
<reporting>
@@ -246,6 +292,31 @@
<profiles>
<profile>
+ <id>apache-release</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <descriptors>
+ <descriptor>src/assembly/source-release.xml</descriptor>
+ </descriptors>
+ <tarLongFileMode>gnu</tarLongFileMode>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
<id>reporting</id>
<reporting>
<plugins>
@@ -274,6 +345,10 @@
<configLocation>http://svn.apache.org/repos/asf/maven/doxia/doxia/trunk/src/main/resources/config/doxia_checkstyle.xml</configLocation>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>clirr-maven-plugin</artifactId>
+ </plugin>
</plugins>
</reporting>
</profile>
diff --git a/src/assembly/source-release.xml b/src/assembly/source-release.xml
new file mode 100644
index 0000000..5c70b93
--- /dev/null
+++ b/src/assembly/source-release.xml
@@ -0,0 +1,62 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<assembly xmlns="http://maven.apache.org/xsd/assembly-1.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/xsd/assembly-1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+ <id>source-release</id>
+ <formats>
+ <format>tar.gz</format>
+ <format>tar.bz2</format>
+ <format>zip</format>
+ </formats>
+ <fileSets>
+ <fileSet>
+ <directory>.</directory>
+ <outputDirectory>/</outputDirectory>
+ <useDefaultExcludes>true</useDefaultExcludes>
+ <excludes>
+ <!-- IDE -->
+ <exclude>**/*.iws</exclude>
+ <exclude>**/*.ipr</exclude>
+ <exclude>**/*.iml</exclude>
+ <exclude>**/.project</exclude>
+ <exclude>**/.classpath</exclude>
+ <exclude>**/.settings/**</exclude>
+ <exclude>**/.externalToolBuilders/**</exclude>
+ <exclude>**/maven-eclipse.xml</exclude>
+ <exclude>**/.deployables/**</exclude>
+ <exclude>**/.wtpmodules/**</exclude>
+ <!-- maven -->
+ <exclude>**/target/**</exclude>
+ <exclude>**/pom.xml.releaseBackup</exclude>
+ <exclude>**/release.properties</exclude>
+ <!-- misc -->
+ <exclude>**/*.patch</exclude>
+ <exclude>**/*.diff</exclude>
+ <exclude>**/*.bak</exclude>
+ <exclude>**/*.log</exclude>
+ </excludes>
+ </fileSet>
+ <fileSet>
+ <directory>target/maven-shared-archive-resources/META-INF</directory>
+ <outputDirectory>/</outputDirectory>
+ </fileSet>
+ </fileSets>
+</assembly>
diff --git a/src/site/site.xml b/src/site/site.xml
index 4a114c0..91dbeb9 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -50,6 +50,10 @@
</script>
</head>
+ <menu name="Downloads" inherit="bottom">
+ <item name="Download ${project.name}" href="http://maven.apache.org/doxia/downloads.html"/>
+ </menu>
+
<menu ref="modules"/>
<menu ref="reports"/>