/*******************************************************************************
* Copyright (c) 2009, 2013 David Green and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* David Green - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.wikitext.ant.internal;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FileSet;
import org.eclipse.mylyn.wikitext.ant.MarkupTask;
import org.eclipse.mylyn.wikitext.parser.MarkupParser;
import org.eclipse.mylyn.wikitext.parser.builder.XslfoDocumentBuilder;
import org.eclipse.mylyn.wikitext.parser.markup.MarkupLanguage;
import org.eclipse.mylyn.wikitext.parser.outline.OutlineItem;
import org.eclipse.mylyn.wikitext.parser.outline.OutlineParser;
/**
* @author David Green
*
*/
public class MarkupToXslfoTask extends MarkupTask {
private final List<FileSet> filesets = new ArrayList<FileSet>();
protected String xslfoFilenameFormat = "$1.fo"; //$NON-NLS-1$
protected boolean overwrite = true;
protected File file;
protected File targetdir;
private boolean generateBookmarks = true;
private final XslfoDocumentBuilder.Configuration configuration = new XslfoDocumentBuilder.Configuration();
@Override
public void execute() throws BuildException {
if (file == null && filesets.isEmpty()) {
throw new BuildException(Messages.getString("MarkupToXslfoTask.0")); //$NON-NLS-1$
}
if (file != null && !filesets.isEmpty()) {
throw new BuildException(Messages.getString("MarkupToXslfoTask.1")); //$NON-NLS-1$
}
if (file != null) {
if (!file.exists()) {
throw new BuildException(MessageFormat.format(Messages.getString("MarkupToXslfoTask.2"), file)); //$NON-NLS-1$
} else if (!file.isFile()) {
throw new BuildException(MessageFormat.format(Messages.getString("MarkupToXslfoTask.3"), file)); //$NON-NLS-1$
} else if (!file.canRead()) {
throw new BuildException(MessageFormat.format(Messages.getString("MarkupToXslfoTask.4"), file)); //$NON-NLS-1$
}
}
MarkupLanguage markupLanguage = createMarkupLanguage();
for (FileSet fileset : filesets) {
File filesetBaseDir = fileset.getDir(getProject());
DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
String[] files = ds.getIncludedFiles();
if (files != null) {
File baseDir = ds.getBasedir();
for (String file : files) {
File inputFile = new File(baseDir, file);
try {
processFile(markupLanguage, filesetBaseDir, inputFile);
} catch (BuildException e) {
throw e;
} catch (Exception e) {
throw new BuildException(MessageFormat.format(
Messages.getString("MarkupToXslfoTask.5"), inputFile, //$NON-NLS-1$
e.getMessage()), e);
}
}
}
}
if (file != null) {
try {
processFile(markupLanguage, file.getParentFile(), file);
} catch (BuildException e) {
throw e;
} catch (Exception e) {
throw new BuildException(MessageFormat.format(
Messages.getString("MarkupToXslfoTask.6"), file, e.getMessage()), e); //$NON-NLS-1$
}
}
}
/**
* process the file
*
* @param baseDir
* @param source
* @return
* @return the lightweight markup, or null if the file was not written
* @throws BuildException
*/
protected String processFile(MarkupLanguage markupLanguage, final File baseDir, final File source)
throws BuildException {
log(MessageFormat.format(Messages.getString("MarkupToXslfoTask.7"), source), Project.MSG_VERBOSE); //$NON-NLS-1$
String markupContent = null;
String name = source.getName();
if (name.lastIndexOf('.') != -1) {
name = name.substring(0, name.lastIndexOf('.'));
}
File outputFile = computeXslfoFile(source, name);
if (targetdir != null) {
outputFile = new File(targetdir, outputFile.getName());
}
if (!outputFile.exists() || overwrite || outputFile.lastModified() < source.lastModified()) {
if (markupContent == null) {
markupContent = readFully(source);
}
performValidation(source, markupContent);
Writer out;
try {
out = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(outputFile)), "utf-8"); //$NON-NLS-1$
} catch (Exception e) {
throw new BuildException(MessageFormat.format(
Messages.getString("MarkupToXslfoTask.8"), outputFile, e.getMessage()), e); //$NON-NLS-1$
}
try {
XslfoDocumentBuilder builder = new XslfoDocumentBuilder(out);
XslfoDocumentBuilder.Configuration configuration = this.configuration.clone();
if (configuration.getTitle() == null) {
configuration.setTitle(name);
}
builder.setConfiguration(configuration);
builder.setBase(source.getParentFile().toURI());
MarkupParser parser = new MarkupParser();
parser.setMarkupLanguage(markupLanguage);
parser.setBuilder(builder);
if (generateBookmarks) {
OutlineItem outline = new OutlineParser(markupLanguage).parse(markupContent);
builder.setOutline(outline);
}
parser.parse(markupContent);
} finally {
try {
out.close();
} catch (Exception e) {
throw new BuildException(MessageFormat.format(
Messages.getString("MarkupToXslfoTask.9"), outputFile, //$NON-NLS-1$
e.getMessage()), e);
}
}
}
return markupContent;
}
protected File computeXslfoFile(final File source, String name) {
return new File(source.getParentFile(), xslfoFilenameFormat.replace("$1", name)); //$NON-NLS-1$
}
/**
* @see #setXslfoFilenameFormat(String)
*/
public String getXslfoFilenameFormat() {
return xslfoFilenameFormat;
}
/**
* The format of the XSL-FO output file. Consists of a pattern where the '$1' is replaced with the filename of the
* input file. Default value is <code>$1.fo</code>
*/
public void setXslfoFilenameFormat(String filenameFormat) {
this.xslfoFilenameFormat = filenameFormat;
}
/**
* the file to process
*/
public File getFile() {
return file;
}
/**
* the file to process
*/
public void setFile(File file) {
this.file = file;
}
/**
* Adds a set of files to process.
*/
public void addFileset(FileSet set) {
filesets.add(set);
}
public File getTargetdir() {
return targetdir;
}
public void setTargetdir(File targetdir) {
this.targetdir = targetdir;
}
public String getAuthor() {
return configuration.getAuthor();
}
public String getCopyright() {
return configuration.getCopyright();
}
public String getDate() {
return configuration.getDate();
}
public float getFontSize() {
return configuration.getFontSize();
}
public float[] getFontSizeMultipliers() {
return configuration.getFontSizeMultipliers();
}
public float getPageHeight() {
return configuration.getPageHeight();
}
public float getPageMargin() {
return configuration.getPageMargin();
}
public float getPageWidth() {
return configuration.getPageWidth();
}
public String getSubTitle() {
return configuration.getSubTitle();
}
public String getTitle() {
return configuration.getTitle();
}
public String getVersion() {
return configuration.getVersion();
}
public boolean isPageBreakOnHeading1() {
return configuration.isPageBreakOnHeading1();
}
public boolean isPageNumbering() {
return configuration.isPageNumbering();
}
public boolean isPanelText() {
return configuration.isPanelText();
}
public boolean isShowExternalLinks() {
return configuration.isShowExternalLinks();
}
public boolean isUnderlineLinks() {
return configuration.isUnderlineLinks();
}
public void setAuthor(String author) {
configuration.setAuthor(author);
}
public void setCopyright(String copyright) {
configuration.setCopyright(copyright);
}
public void setDate(String date) {
configuration.setDate(date);
}
public void setFontSize(float fontSize) {
configuration.setFontSize(fontSize);
}
public void setFontSizeMultipliers(float[] fontSizeMultipliers) {
configuration.setFontSizeMultipliers(fontSizeMultipliers);
}
public void setPageBreakOnHeading1(boolean pageBreakOnHeading1) {
configuration.setPageBreakOnHeading1(pageBreakOnHeading1);
}
public void setPageHeight(float pageHeight) {
configuration.setPageHeight(pageHeight);
}
public void setPageMargin(float pageMargin) {
configuration.setPageMargin(pageMargin);
}
public void setPageNumbering(boolean pageNumbering) {
configuration.setPageNumbering(pageNumbering);
}
public void setPageWidth(float pageWidth) {
configuration.setPageWidth(pageWidth);
}
public void setPanelText(boolean panelText) {
configuration.setPanelText(panelText);
}
public void setShowExternalLinks(boolean showExternalLinks) {
configuration.setShowExternalLinks(showExternalLinks);
}
public void setSubTitle(String subTitle) {
configuration.setSubTitle(subTitle);
}
public void setTitle(String title) {
configuration.setTitle(title);
}
public void setUnderlineLinks(boolean underlineLinks) {
configuration.setUnderlineLinks(underlineLinks);
}
public void setVersion(String version) {
configuration.setVersion(version);
}
/**
*
*/
public boolean isGenerateBookmarks() {
return generateBookmarks;
}
/**
*
*/
public void setGenerateBookmarks(boolean generateBookmarks) {
this.generateBookmarks = generateBookmarks;
}
}