/*
* YUI Compressor
* Author: Julien Lecomte <jlecomte@yahoo-inc.com>
* Copyright (c) 2007, Yahoo! Inc. All rights reserved.
* Code licensed under the BSD License:
* http://developer.yahoo.net/yui/license.txt
*/
package org.qrone.r7.app;
import jargs.gnu.CmdLineParser;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import org.qrone.r7.parser.HTML5Deck;
import org.qrone.r7.parser.HTML5OM;
import org.qrone.r7.parser.HTML5StreamWriter;
import org.qrone.r7.parser.HTML5StringWriter;
import org.qrone.r7.parser.HTML5Template;
import org.qrone.r7.resolver.FileResolver;
import org.qrone.r7.resolver.URIResolver;
public class QrONECompressor {
public static HTML5Deck deck;
public static boolean verbose;
public static void main(String args[]) {
if(args.length == 0
&& System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0){
QrONEApp.main(args);
System.exit(0);
}
long timer = System.currentTimeMillis();
CmdLineParser parser = new CmdLineParser();
CmdLineParser.Option helpOpt = parser.addBooleanOption('h', "help");
CmdLineParser.Option languageOpt = parser.addStringOption('l', "lang");
CmdLineParser.Option recurseOpt = parser.addBooleanOption('r', "recurse");
CmdLineParser.Option imagedirOpt = parser.addStringOption('i', "img-basedir");
CmdLineParser.Option noImagesOpt = parser.addBooleanOption('n', "noimages");
CmdLineParser.Option charsetOpt = parser.addStringOption("charset");
CmdLineParser.Option verboseOpt = parser.addBooleanOption('v', "verbose");
try {
parser.parse(args);
} catch (CmdLineParser.OptionException e) {
usage();
System.exit(1);
}
Boolean help = (Boolean) parser.getOptionValue(helpOpt);
if (help != null && help.booleanValue()) {
usage();
System.exit(0);
}
boolean noimages = parser.getOptionValue(noImagesOpt) != null;
verbose = parser.getOptionValue(verboseOpt) != null;
String charset = (String) parser.getOptionValue(charsetOpt);
if (charset == null || !Charset.isSupported(charset)) {
//charset = System.getProperty("file.encoding");
if (charset == null) {
charset = "UTF-8";
}
if (verbose) {
System.err.println("[INFO] Using charset " + charset);
}
}
String lang = (String) parser.getOptionValue(languageOpt);
if(lang == null) lang = "html";
else lang = lang.toLowerCase();
/*
Writer out = null;
try {
out = new OutputStreamWriter(System.out, charset);
} catch (UnsupportedEncodingException e) {
System.err.println("[ERROR] Using charset " + charset);
System.exit(0);
}
*/
String imgdir = (String) parser.getOptionValue(imagedirOpt);
boolean recurse = parser.getOptionValue(recurseOpt) != null;
String[] fileArgs = parser.getRemainingArgs();
if(fileArgs.length < 1){
usage();
System.exit(0);
}
File target = new File(fileArgs[0]).getAbsoluteFile();
File basedir;
String path;
if(target.isDirectory()){
basedir = target;
path = "";
}else{
basedir = target.getParentFile();
path = target.getName();
}
URIResolver resolver = new FileResolver(basedir);
if(deck == null)
deck = new HTML5Deck(resolver);
long extime = System.currentTimeMillis();
extime = System.currentTimeMillis() - extime;
if (verbose) {
System.err.println("[INFO] Class finding time " + extime + "ms");
}
if (verbose) {
System.err.println("[INFO] Pack extension classes.");
}
/*
try {
//if(imgdir != null){
// deck.setBaseURI(QrONEUtils.relativize(new URI(fileArgs[0]),new URI(imgdir)));
//}
} catch (URISyntaxException e) {
e.printStackTrace();
System.exit(0);
}
*/
compile(deck, target, path, lang, recurse);
if(!noimages){
if (verbose) {
System.err.println("[INFO] Writing sprite images.");
}
/*
try {
//deck.getSpriter().create();
} catch (IOException e) {
System.err.println("[ERROR] Creating sprite images.");
System.exit(0);
}
*/
if (verbose) {
System.err.println("[INFO] Writing sprite images done.");
}
}
if (verbose) {
timer = System.currentTimeMillis() - timer;
System.err.println("\n[INFO] Compilation time " + timer + "ms");
}
}
public static void compile(HTML5Deck deck, File file, String path, String lang, boolean recurse){
if(file.isDirectory()){
if (verbose) {
System.err.println("[INFO] Directory " + path);
}
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if( files[i].isDirectory() && recurse && !files[i].getName().startsWith("."))
compile(deck, files[i], path + "/" + files[i].getName(), lang, recurse);
else if( files[i].getName().indexOf("-min.") < 0 &&
(files[i].getName().endsWith(".html") || files[i].getName().endsWith(".htm")) )
compile(deck, files[i], path + "/" + files[i].getName(), lang, recurse);
}
}else{
if (verbose) {
System.err.println("[INFO] Parsing " + path);
}
try {
HTML5OM xom = deck.compile(new URI(path));
HTML5StringWriter w = new HTML5StringWriter();
HTML5Template t = new HTML5Template(xom);
t.out(w, xom.getDocument(), null);
} catch (URISyntaxException e) {
e.printStackTrace();
}
/*
if(lang == null) lang = "html";
else lang = lang.toLowerCase();
String basename = file.getName().substring(0,
file.getName().indexOf('.'));
File outfile = new File(file.getParentFile(),basename + "-min." + lang);
FileWriter out = null;
try {
out = new FileWriter(outfile);
} catch (IOException e1) {
System.err.println("[ERROR] Opening file " + outfile.getName());
System.exit(0);
}
try {
HTML5OM xom = deck.compile(new URI(path));
out.write(xom.serialize());
//xom.serialize(lang);
if (verbose) {
System.err.println("[INFO] Writing " + outfile.getName() + " done.");
}
} catch (IOException e) {
e.printStackTrace();
System.err.println("[ERROR] Parsing file " + file.getName());
System.exit(0);
} catch (URISyntaxException e) {
e.printStackTrace();
System.err.println("[ERROR] Parsing file " + file.getName());
System.exit(0);
} finally {
try {
out.flush();
out.close();
} catch (IOException e) {
}
}
*/
}
}
private static void usage() {
System.out.println(
"\nUsage: java -jar qrone-x.y.z.jar [options] <file>\n\n"
+ "Options\n"
+ " -h, --help Displays this information\n"
+ " -v, --verbose Display informational messages and warnings\n"
+ " --charset <charset> Read the input file using <charset>\n"
+ "\n"
+ " -l <language> Output language, default is 'html'\n"
+ " -i, --img-basedir <dir> CSS Sprite image directory\n"
+ " -u, --img-baseurl <url> CSS Sprite image base url\n"
);
}
}