/* * Copyright (C) 2013 Red Hat, Inc. and/or its affiliates. * * Licensed 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. */ 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; /** * A frontend for the ostermiller syntax hightlighter that processes all .java files in the given * input directory. * * @author Jonathan Fuerth <jfuerth@gmail.com> */ 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); } /** * Returns the path of the given file relative to {@link #sourceBaseDir}. * * @param f * The file to get the relative path for. Must be under {@link #sourceBaseDir}. * @return The path of f relative to {@link #sourceBaseDir}. * @throws IllegalArgumentException * If the given file is not to be found under sourceBaseDir. */ 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; } /** * Returns the relative pathname from f to a stylesheet with the given name located in * {@link #targetBaseDir}. * * @param f * @param stylesheetName * @return */ 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(); } }