/*
* Copyright 2014 Google Inc.
*
* 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 com.google.gwt.resources.converter;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.util.DefaultTextOutput;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
import com.google.gwt.resources.css.GenerateCssAst;
import com.google.gwt.resources.css.ast.CssStylesheet;
import java.io.File;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Map;
/**
* Converter from Css to Gss.
*/
public class Css2Gss {
private final URL cssFile;
private final TreeLogger treeLogger;
private final boolean lenient;
private PrintWriter printWriter;
private Map<String, String> defNameMapping;
public Css2Gss(String filePath) throws MalformedURLException {
this(new File(filePath).toURI().toURL(), false);
}
public Css2Gss(URL fileUrl, TreeLogger treeLogger) {
this(fileUrl, treeLogger, false);
}
public Css2Gss(URL fileUrl, TreeLogger treeLogger, boolean lenient) {
cssFile = fileUrl;
this.treeLogger = treeLogger;
this.lenient = lenient;
}
public Css2Gss(URL resource, boolean lenient) {
cssFile = resource;
printWriter = new PrintWriter(System.err);
this.treeLogger = new PrintWriterTreeLogger(printWriter);
this.lenient = lenient;
}
public String toGss() throws UnableToCompleteException {
try {
CssStylesheet sheet = GenerateCssAst.exec(treeLogger, cssFile);
DefCollectorVisitor defCollectorVisitor = new DefCollectorVisitor(lenient, treeLogger);
defCollectorVisitor.accept(sheet);
defNameMapping = defCollectorVisitor.getDefMapping();
new UndefinedConstantVisitor(new HashSet<String>(defNameMapping.values()),
lenient, treeLogger).accept(sheet);
new ElseNodeCreator().accept(sheet);
new AlternateAnnotationCreatorVisitor().accept(sheet);
new FontFamilyVisitor().accept(sheet);
GssGenerationVisitor gssGenerationVisitor = new GssGenerationVisitor(
new DefaultTextOutput(false), defNameMapping, lenient, treeLogger);
gssGenerationVisitor.accept(sheet);
return gssGenerationVisitor.getContent();
} finally {
if (printWriter != null) {
printWriter.flush();
}
}
}
/**
* GSS allows only uppercase letters and numbers for a name of the constant. The constants
* need to be renamed in order to be compatible with GSS. This method returns a mapping
* between the old name and the new name compatible with GSS.
*/
public Map<String, String> getDefNameMapping() {
return defNameMapping;
}
public static void main(String... args) {
if (args.length != 1) {
printUsage();
System.exit(-1);
}
try {
System.out.println(new Css2Gss(args[0]).toGss());
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
System.exit(0);
}
private static void printUsage() {
System.err.println("Usage :");
System.err.println("java " + Css2Gss.class.getName() + " fileNameToConvertPath");
}
}