2002/css-validator/org/w3c/css/values CssImage.java,1.1,1.2

Update of /sources/public/2002/css-validator/org/w3c/css/values
In directory hutz:/tmp/cvs-serv28903

Modified Files:
	CssImage.java 
Log Message:
linear-gradient added

Index: CssImage.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/values/CssImage.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- CssImage.java	7 Nov 2012 15:46:38 -0000	1.1
+++ CssImage.java	8 Nov 2012 14:06:59 -0000	1.2
@@ -12,6 +12,7 @@
 import java.util.ArrayList;
 
 import static org.w3c.css.values.CssOperator.COMMA;
+import static org.w3c.css.values.CssOperator.SPACE;
 
 /**
  * @author CSS3 Image
@@ -24,6 +25,32 @@
 		return type;
 	}
 
+	static final CssIdent to = CssIdent.getIdent("to");
+	static final CssIdent left = CssIdent.getIdent("left");
+	static final CssIdent right = CssIdent.getIdent("right");
+	static final CssIdent top = CssIdent.getIdent("top");
+	static final CssIdent bottom = CssIdent.getIdent("bottom");
+
+	public static boolean isVerticalIdent(CssIdent ident) {
+		return ident.equals(top) || ident.equals(bottom);
+	}
+
+	public static CssIdent getLinearGradientIdent(CssIdent ident) {
+		if (left.equals(ident)) {
+			return left;
+		}
+		if (right.equals(ident)) {
+			return right;
+		}
+		if (top.equals(ident)) {
+			return top;
+		}
+		if (bottom.equals(ident)) {
+			return bottom;
+		}
+		return null;
+	}
+
 	String name;
 	CssValue value;
 
@@ -39,7 +66,12 @@
 		// @@TODO
 	}
 
-
+	/**
+	 * @param exp
+	 * @param ac
+	 * @throws InvalidParamException
+	 * @spec http://www.w3.org/TR/2012/CR-css3-images-20120417/#image-list-type
+	 */
 	public void setImageList(CssExpression exp, ApplContext ac)
 			throws InvalidParamException {
 		name = "image";
@@ -47,7 +79,7 @@
 		// ImageList defined in CSS3 and onward
 		if (ac.getCssVersion().compareTo(CssVersion.CSS3) < 0) {
 			StringBuilder sb = new StringBuilder();
-			sb.append("image(").append(exp.toStringFromStart()).append(')');
+			sb.append(name).append('(').append(exp.toStringFromStart()).append(')');
 			throw new InvalidParamException("notversion", sb.toString(),
 					ac.getCssVersionString(), ac);
 		}
@@ -100,6 +132,178 @@
 	}
 
 	/**
+	 * @param exp
+	 * @param ac
+	 * @throws InvalidParamException
+	 * @spec http://www.w3.org/TR/2012/CR-css3-images-20120417/#linear-gradient-type
+	 */
+	public void setLinearGradient(CssExpression exp, ApplContext ac)
+			throws InvalidParamException {
+		name = "linear-gradient";
+		_cache = null;
+		// ImageList defined in CSS3 and onward
+		if (ac.getCssVersion().compareTo(CssVersion.CSS3) < 0) {
+			StringBuilder sb = new StringBuilder();
+			sb.append(name).append('(').append(exp.toStringFromStart()).append(')');
+			throw new InvalidParamException("notversion", sb.toString(),
+					ac.getCssVersionString(), ac);
+		}
+		ArrayList<CssValue> v = new ArrayList<CssValue>();
+		CssValue val = exp.getValue();
+		char op = exp.getOperator();
+
+		if (val.getType() == CssTypes.CSS_ANGLE) {
+			v.add(val);
+			if (op != COMMA) {
+				exp.starts();
+				throw new InvalidParamException("operator",
+						((new Character(op)).toString()), ac);
+			}
+			exp.next();
+		} else if (val.getType() == CssTypes.CSS_IDENT) {
+			CssIdent ident = (CssIdent) val;
+			if (to.equals(ident)) {
+				CssValueList vl = new CssValueList();
+				vl.add(to);
+				// we must now eat one or two valid idents
+				// this is boringly boring...
+				CssIdent v1 = null;
+				CssIdent v2 = null;
+				if (op != SPACE) {
+					exp.starts();
+					throw new InvalidParamException("operator",
+							((new Character(op)).toString()), ac);
+				}
+				exp.next();
+				if (exp.end()) {
+					throw new InvalidParamException("few-value", name, ac);
+				}
+				val = exp.getValue();
+				op = exp.getOperator();
+				boolean isV1Vertical, isV2Vertical;
+				if (val.getType() != CssTypes.CSS_IDENT) {
+					throw new InvalidParamException("value",
+							val.toString(),
+							name, ac);
+				}
+				v1 = getLinearGradientIdent((CssIdent) val);
+				if (v1 == null) {
+					throw new InvalidParamException("value",
+							val.toString(),
+							name, ac);
+				}
+				vl.add(v1);
+				isV1Vertical = isVerticalIdent(v1);
+				exp.next();
+				if (exp.end()) {
+					throw new InvalidParamException("few-value", name, ac);
+				}
+				if (op == SPACE) {
+					// the operator is a space, we should have
+					// another
+					val = exp.getValue();
+					op = exp.getOperator();
+					if (val.getType() != CssTypes.CSS_IDENT) {
+						throw new InvalidParamException("value",
+								val.toString(),
+								name, ac);
+					}
+					v2 = getLinearGradientIdent((CssIdent) val);
+					if (v2 == null) {
+						throw new InvalidParamException("value",
+								val.toString(),
+								name, ac);
+					}
+					isV2Vertical = isVerticalIdent(v2);
+					if ((isV1Vertical && isV2Vertical) ||
+							(!isV1Vertical && !isV2Vertical)) {
+						throw new InvalidParamException("value",
+								val.toString(),
+								name, ac);
+					}
+					vl.add(v2);
+					exp.next();
+				}
+				v.add(vl);
+				if (op != COMMA) {
+					exp.starts();
+					throw new InvalidParamException("operator",
+							((new Character(op)).toString()), ac);
+				}
+			}
+		}
+		// now we a list of at least two color stops.
+		ArrayList<CssValue> stops = parseColorStops(exp, ac);
+		if (stops.size() < 2) {
+			throw new InvalidParamException("few-value", name, ac);
+		}
+
+		v.addAll(stops);
+		value = new CssLayerList(v);
+	}
+
+	private final ArrayList<CssValue> parseColorStops(CssExpression expression,
+													  ApplContext ac)
+			throws InvalidParamException {
+		ArrayList<CssValue> v = new ArrayList<CssValue>();
+		CssValue val;
+		char op;
+		CssColor stopcol;
+		CssValue stopval;
+
+		while (!expression.end()) {
+			val = expression.getValue();
+			op = expression.getOperator();
+
+			switch (val.getType()) {
+				case CssTypes.CSS_HASH_IDENT:
+					stopcol = new CssColor();
+					stopcol.setShortRGBColor(val.toString(), ac);
+					break;
+				case CssTypes.CSS_IDENT:
+					stopcol = new CssColor();
+					stopcol.setIdentColor(val.toString(), ac);
+					break;
+				case CssTypes.CSS_COLOR:
+					stopcol = (CssColor) val;
+					break;
+				default:
+					throw new InvalidParamException("value", val.toString(),
+							"color", ac);
+			}
+			if (op == SPACE && expression.getRemainingCount() > 1) {
+				expression.next();
+				stopval = expression.getValue();
+				op = expression.getOperator();
+
+				switch (stopval.getType()) {
+					case CssTypes.CSS_NUMBER:
+						val.getLength();
+					case CssTypes.CSS_LENGTH:
+					case CssTypes.CSS_PERCENTAGE:
+						ArrayList<CssValue> stop = new ArrayList<CssValue>(2);
+						stop.add(stopcol);
+						stop.add(stopval);
+						v.add(new CssValueList(stop));
+						break;
+					default:
+						throw new InvalidParamException("value", val.toString(),
+								"color-stop", ac);
+				}
+			} else {
+				v.add(stopcol);
+			}
+			expression.next();
+			if (!expression.end() && op != COMMA) {
+				expression.starts();
+				throw new InvalidParamException("operator",
+						((new Character(op)).toString()), ac);
+			}
+		}
+		return v;
+	}
+
+	/**
 	 * Returns the value
 	 */
 	public Object get() {

Received on Thursday, 8 November 2012 14:07:06 UTC