
w3c.css.css.CssValidator Maven / Gradle / Ivy
/*
* CssValidator.java
*
* Created on April 19, 2006, 2:50 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package org.w3c.css.css;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.HTTPURL;
import org.w3c.css.util.Util;
import org.w3c.tools.resources.ProtocolException;
import org.w3c.www.mime.MimeType;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
/**
* @author jean
*/
public class CssValidator {
ApplContext ac;
PrintWriter out;
ArrayList uris = new ArrayList();
HashMap params;
// @@ HACK
static boolean showCSS = false;
/**
* Creates a new instance of CssValidator with the following default values:
*
* - profile = >default<
* - medium = all
* - output = text
* - lang = en
* - warning = 2
* - showCSS = false
*
*/
public CssValidator() {
params = new HashMap();
params.put("profile", "css3svg");
params.put("medium", "all");
params.put("output", "text");
params.put("lang", "en");
params.put("warning", "2");
params.put("vextwarning", "true");
}
public CssValidator(String profile, String medium, String lang, int warninglevel, boolean vextwarning, boolean followlinks) {
ac = new ApplContext(lang);
ac.setCssVersionAndProfile(profile);
ac.setMedium(medium);
ac.setTreatVendorExtensionsAsWarnings(vextwarning);
// TODO for now we use the same parameter for both vendor extensions and CSS Hacks.
ac.setTreatCssHacksAsWarnings(vextwarning);
ac.setWarningLevel(warninglevel);
ac.setFollowlinks(followlinks);
}
public void setOptionsFromParams() {
// CSS version to use
String profile = params.get("profile");
ac.setCssVersionAndProfile(profile);
// medium to use
ac.setMedium(params.get("medium"));
String vextwarn = params.get("vextwarning");
ac.setTreatVendorExtensionsAsWarnings("true".equalsIgnoreCase(vextwarn));
// TODO for now we use the same parameter for both vendor extensions and CSS Hacks.
ac.setTreatCssHacksAsWarnings("true".equalsIgnoreCase(vextwarn));
}
public static void main(String args[])
throws IOException, MalformedURLException {
CssValidator style = new CssValidator();
// first, we get the parameters and create an application context
try {
style.getParams(args);
style.ac = new ApplContext((String) style.params.get("lang"));
System.err.println(style.params);
} catch (Exception e) {
System.out.println("Usage: java org.w3c.css.css.CssValidator " +
" [OPTIONS] | [URL]*");
System.out.println("OPTIONS");
System.out.println("\t-p, --printCSS");
System.out.println("\t\tPrints the validated CSS (only with text " +
"output, the CSS is printed with other outputs)");
System.out.println("\t-profile PROFILE, --profile=PROFILE");
System.out.println("\t\tChecks the Stylesheet against PROFILE");
System.out.println("\t\tPossible values for PROFILE are css1, " +
"css2, css21, css3, css3svg (default), svg, svgbasic, svgtiny, " +
"atsc-tv, mobile, tv");
System.out.println("\t-medium MEDIUM, --medium=MEDIUM");
System.out.println("\t\tChecks the Stylesheet using the medium MEDIUM");
System.out.println("\t\tPossible values for MEDIUM are all " +
"(default), aural, braille, embossed, handheld, print, " +
"projection, screen, tty, tv, presentation");
System.out.println("\t-output OUTPUT, --output=OUTPUT");
System.out.println("\t\tPrints the result in the selected format");
System.out.println("\t\tPossible values for OUTPUT are text (default), xhtml, " +
"html (same result as xhtml), soap12");
System.out.println("\t-lang LANG, --lang=LANG");
System.out.println("\t\tPrints the result in the specified language");
System.out.println("\t\tPossible values for LANG are " +
"de, en (default), es, fr, ja, ko, nl, zh-cn, pl, it");
System.out.println("\t-warning WARN, --warning=WARN");
System.out.println("\t\tWarnings verbosity level");
System.out.println("\t\tPossible values for WARN are -1 (no " +
"warning), 0, 1, 2 (default, all the warnings");
System.out.println("\t-vextwarning true, --vextwarning=true");
System.out.println("\t\tTreat Vendor Extensions as warnings");
System.out.println("\t\tPossible values for vextwarning are true or false " +
"(default, is false");
System.out.println();
System.out.println("URL");
System.out.println("\tURL can either represent a distant " +
"web resource (http://) or a local file (file:/)");
System.out.println();
System.out.println("EXIT STATUS");
System.out.println("return 0 on success, 1 for fatal errors, 10 to 110 for " +
"the number of errors in the checked Style Sheet");
System.exit(1);
}
style.setOptionsFromParams();
String encoding = style.ac.getMsg().getString("output-encoding-name");
if (encoding != null) {
style.out = new PrintWriter(new OutputStreamWriter(System.out, encoding));
} else {
style.out = new PrintWriter(new OutputStreamWriter(System.out));
}
int total_errors = 0;
for (int i = 0; i < style.uris.size(); i++) {
String uri = (String) style.uris.get(i);
if (uri != null) {
// HTML document
try {
uri = HTTPURL.getURL(uri).toString(); // needed to be sure
// that it is a valid
// url
DocumentParser URLparser = new DocumentParser(style.ac,
uri);
total_errors += style.handleRequest(style.ac, uri, URLparser.getStyleSheet(),
(String) style.params.get("output"),
Integer.parseInt((String) style.params.get("warning")),
true);
} catch (ProtocolException pex) {
total_errors++;
if (Util.onDebug) {
pex.printStackTrace();
}
System.exit(1);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
if (total_errors > 0) {
// restrict exit codes to 10->110 to avoid reserved ones.
System.exit(10 + (total_errors % 100));
}
}
private int handleRequest(ApplContext ac,
String title, StyleSheet styleSheet,
String output, int warningLevel,
boolean errorReport) throws Exception {
if (styleSheet == null) {
throw new IOException(ac.getMsg().getServletString("process") + " "
+ title);
}
styleSheet.findConflicts(ac);
StyleReport style = StyleReportFactory.getStyleReport(ac, title,
styleSheet,
output,
warningLevel);
if (!errorReport) {
style.desactivateError();
}
style.print(out);
return styleSheet.getErrors().getErrorCount();
}
public void handleCSSStyleSheet(ApplContext ac, Reader reader, URL docref) {
StyleSheet sheet;
DocumentParser parser = null;
try {
parser = new DocumentParser(ac, reader, docref.toString(), MimeType.TEXT_CSS);
} catch (Exception ex) {
ex.printStackTrace();
}
sheet = parser.getStyleSheet();
sheet.findConflicts(ac);
}
public void handleHTMLStyleSheet(ApplContext ac, Reader reader, URL docref) {
StyleSheet sheet;
DocumentParser parser = null;
try {
parser = new DocumentParser(ac, reader, docref.toString(), MimeType.TEXT_HTML);
} catch (Exception ex) {
ex.printStackTrace();
}
sheet = parser.getStyleSheet();
sheet.findConflicts(ac);
}
public void handleXMLStyleSheet(ApplContext ac, Reader reader, URL docref) {
StyleSheet sheet;
DocumentParser parser = null;
try {
parser = new DocumentParser(ac, reader, docref.toString(), MimeType.APPLICATION_XML);
} catch (Exception ex) {
ex.printStackTrace();
}
sheet = parser.getStyleSheet();
sheet.findConflicts(ac);
}
/**
* Analyses the command-line parameters
*
* @param args the parameters list
*/
private void getParams(String[] args) throws Exception {
// first, we get an enumeration from the array, because it's easier to
// manage
Iterator iterator = Arrays.asList(args).iterator();
while (iterator.hasNext()) {
String paramName = "";
String paramValue = "";
// the current command-line argument
String param = iterator.next();
if (param.equals("--printCSS") || param.equals("-p")) {
// special case
showCSS = true;
}
// all the parameters have the form --param=PARAM...
else if (param.startsWith("--")) {
int separator = param.indexOf("=");
paramName = param.substring(2, separator);
paramValue = param.substring(separator + 1);
}
// ... or -param PARAM
else if (param.startsWith("-")) {
paramName = param.substring(1);
if (iterator.hasNext()) {
paramValue = iterator.next();
} else {
paramValue = "";
}
}
// this is not a parameter, so it's probably a URL
else {
uris.add(param);
}
if (paramName.length() != 0 && params.containsKey(paramName)) {
if (paramValue.length() == 0) {
// empty value
throw new Exception("You must specify a value for the "
+ "parameter " + paramName);
} else {
// update the params table
params.put(paramName, paramValue);
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy