package org.jboss.errai.demo.mobile.about;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import com.Ostermiller.Syntax.ToHTML;
import com.Ostermiller.bte.CompileException;
public class SyntaxHighlight {
private final ToHTML toHTML = new ToHTML();
private final File sourceBaseDir;
private final File targetBaseDir;
public static void main(String[] args) throws IOException, InvocationTargetException, CompileException {
if (args.length != 2) {
throw new IllegalArgumentException("SyntaxHighlight requires exactly two arguments: source directory and target directory");
}
if (args[0] == null) {
throw new IllegalArgumentException("Null source directory argument not allowed");
}
if (args[1] == null) {
throw new IllegalArgumentException("Null target directory argument not allowed");
}
new SyntaxHighlight(new File(args[0]), new File(args[1])).run();
}
public SyntaxHighlight(File sourceBaseDir, File targetBaseDir) {
toHTML.addIgnoreStyle("whitespace");
this.sourceBaseDir = sourceBaseDir;
this.targetBaseDir = targetBaseDir;
}
public void run() throws IOException, InvocationTargetException, CompileException {
if (!sourceBaseDir.isDirectory()) {
throw new IllegalArgumentException("Source base dir \"" + sourceBaseDir + "\" is not an existing directory");
}
targetBaseDir.mkdirs();
recursivelyProcess(sourceBaseDir);
}
private void recursivelyProcess(File currentDirectory) throws IOException, InvocationTargetException, CompileException {
File[] files = currentDirectory.listFiles();
for (File f : files) {
if (f.isFile() && f.getName().endsWith(".java")) {
File targetFile = targetFileFor(f, ".html");
writeIndividualFile(f, targetFile);
}
if (f.isDirectory()) {
recursivelyProcess(f);
}
}
}
private File targetFileFor(File f, String newExtension) {
String relativeSource = relativizeSourcePath(f);
return new File(targetBaseDir, relativeSource + newExtension);
}
protected String relativizeSourcePath(File f) {
String absoluteSourceBase = sourceBaseDir.getAbsolutePath();
if (!absoluteSourceBase.endsWith(System.getProperty("file.separator"))) {
absoluteSourceBase = absoluteSourceBase + System.getProperty("file.separator");
}
String absoluteSource = f.getAbsolutePath();
if (!absoluteSource.startsWith(absoluteSource)) {
throw new IllegalArgumentException("I don't know how to relativize \"" + absoluteSource + "\" against \"" + absoluteSourceBase + "\".");
}
String relativeSource = absoluteSource.substring(absoluteSourceBase.length());
return relativeSource;
}
private String getStylesheetRelativeLocation(File f, String stylesheetName) {
char pathSepChar = System.getProperty("file.separator").charAt(0);
String relativeSource = relativizeSourcePath(f);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < relativeSource.length(); i++) {
if (relativeSource.charAt(i) == pathSepChar) {
sb.append("../");
}
}
sb.append(stylesheetName);
return sb.toString();
}
private void writeIndividualFile(File source, File target) throws IOException, InvocationTargetException, CompileException {
target.getParentFile().mkdirs();
toHTML.setStyleSheet(getStylesheetRelativeLocation(source, "syntax.css"));
toHTML.setOutput(target);
toHTML.setExtFromFileName(source.getName());
toHTML.setDocNameFromFileName(source.getName());
toHTML.setInput(source);
toHTML.setTitle(source.getName());
toHTML.writeFullHTML();
}
}