- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Fri, 09 Nov 2012 13:31:33 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/values
In directory hutz:/tmp/cvs-serv16951/values
Modified Files:
CssImage.java
Log Message:
radial-gradient + static method to check the value of a position (grmbl)
Index: CssImage.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/values/CssImage.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- CssImage.java 8 Nov 2012 16:16:13 -0000 1.4
+++ CssImage.java 9 Nov 2012 13:31:31 -0000 1.5
@@ -5,6 +5,7 @@
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.values;
+import org.w3c.css.properties.css3.CssBackgroundPosition;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.CssVersion;
import org.w3c.css.util.InvalidParamException;
@@ -30,6 +31,20 @@
static final CssIdent right = CssIdent.getIdent("right");
static final CssIdent top = CssIdent.getIdent("top");
static final CssIdent bottom = CssIdent.getIdent("bottom");
+ static final CssIdent at = CssIdent.getIdent("at");
+ static final CssIdent circle = CssIdent.getIdent("circle");
+ static final CssIdent ellipse = CssIdent.getIdent("ellipse");
+ static final CssIdent[] extent_keywords;
+
+ static {
+ String _val[] = {"closest-corner", "closest-side",
+ "farthest-corner", "farthest-side"};
+ extent_keywords = new CssIdent[_val.length];
+ int i = 0;
+ for (String s : _val) {
+ extent_keywords[i++] = CssIdent.getIdent(s);
+ }
+ }
public static boolean isVerticalIdent(CssIdent ident) {
return ident.equals(top) || ident.equals(bottom);
@@ -51,6 +66,25 @@
return null;
}
+ public static CssIdent getExtentIdent(CssIdent ident) {
+ for (CssIdent id : extent_keywords) {
+ if (id.equals(ident)) {
+ return id;
+ }
+ }
+ return null;
+ }
+
+ public static CssIdent getShape(CssIdent ident) {
+ if (circle.equals(ident)) {
+ return circle;
+ }
+ if (ellipse.equals(ident)) {
+ return ellipse;
+ }
+ return null;
+ }
+
String name;
CssValue value;
@@ -311,85 +345,34 @@
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);
- }
+ // check if there is something before the color stops list
+ boolean parse_prolog = false;
+ switch (val.getType()) {
+ case CssTypes.CSS_NUMBER:
+ val.getLength();
+ case CssTypes.CSS_LENGTH:
+ case CssTypes.CSS_PERCENTAGE:
+ parse_prolog = true;
+ break;
+ case CssTypes.CSS_IDENT:
+ CssIdent id = (CssIdent) val;
+ parse_prolog = at.equals(id) ||
+ (getShape(id) != null) ||
+ (getExtentIdent(id) != null);
+ break;
+ }
+
+ if (parse_prolog) {
+ CssExpression newexp = new CssExpression();
+ boolean done = false;
+ while (!done && !exp.end()) {
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);
+ newexp.addValue(val);
+ done = (op == COMMA);
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);
- }
}
+ v.add(parseRadialProlog(newexp, ac));
}
// now we a list of at least two color stops.
ArrayList<CssValue> stops = parseColorStops(exp, ac);
@@ -401,6 +384,141 @@
value = new CssLayerList(v);
}
+ private CssValue parseRadialProlog(CssExpression expression,
+ ApplContext ac)
+ throws InvalidParamException {
+ // the fun begins :)
+ CssIdent shape = null;
+ CssValue extend = null;
+ CssValue extend2 = null;
+ CssValue atPosition = null;
+
+ ArrayList<CssValue> v = new ArrayList<CssValue>();
+
+ CssValue val;
+ boolean shapeInMiddle = false;
+
+ while (!expression.end()) {
+ val = expression.getValue();
+ switch (val.getType()) {
+ case CssTypes.CSS_PERCENTAGE:
+ if (shapeInMiddle) {
+ throw new InvalidParamException("value",
+ val, name, ac);
+ }
+ CssPercentage p = val.getPercentage();
+ if (!p.isPositive()) {
+ throw new InvalidParamException("negative-value",
+ val, name, ac);
+ }
+ if (extend == null) {
+ extend = val;
+ break;
+ }
+ if (extend2 == null) {
+ extend2 = val;
+ break;
+ }
+ throw new InvalidParamException("value",
+ val, name, ac);
+ case CssTypes.CSS_NUMBER:
+ case CssTypes.CSS_LENGTH:
+ if (shapeInMiddle) {
+ throw new InvalidParamException("value",
+ val, name, ac);
+ }
+ CssLength l = val.getLength();
+ if (!l.isPositive()) {
+ throw new InvalidParamException("negative-value",
+ val, name, ac);
+ }
+ if (extend == null) {
+ extend = val;
+ break;
+ } else {
+ if (extend.getType() == CssTypes.CSS_IDENT) {
+ // don't mix ident and length/percentage
+ throw new InvalidParamException("value",
+ val, name, ac);
+ }
+ }
+ if (extend2 == null) {
+ extend2 = val;
+ break;
+ }
+ throw new InvalidParamException("value",
+ val, name, ac);
+ case CssTypes.CSS_IDENT:
+ CssIdent id = (CssIdent) val;
+ // final 'at'
+ if (at.equals(id)) {
+ CssExpression exp = new CssExpression();
+ expression.next();
+ while (!expression.end()) {
+ exp.addValue(expression.getValue());
+ expression.next();
+ }
+ atPosition = checkPosition(exp, ac);
+ break;
+ }
+ if (shape == null) {
+ shape = getShape(id);
+ if (shape != null) {
+ shapeInMiddle = (expression.getCount() != expression.getRemainingCount());
+ break;
+ }
+ }
+ if (extend == null) {
+ extend = getExtentIdent(id);
+ if (extend != null) {
+ if (shapeInMiddle) {
+ throw new InvalidParamException("value",
+ val, name, ac);
+ }
+ break;
+ }
+ }
+ // unrecognized ident
+ default:
+ throw new InvalidParamException("value",
+ val.toString(),
+ name, ac);
+
+ }
+ expression.next();
+ }
+ // extra checks...
+ // circle can have at most one extend and it must not be a percentage
+ if (shape == circle && (extend2 != null || (extend != null && extend.getType() == CssTypes.CSS_PERCENTAGE))) {
+ throw new InvalidParamException("value",
+ expression.toStringFromStart(), name, ac);
+ }
+ // ellipsis must have one extent ident or two (percentage/length)
+ if (shape == ellipse && (extend2 == null || (extend != null && extend.getType() != CssTypes.CSS_IDENT))) {
+ throw new InvalidParamException("value",
+ expression.toStringFromStart(), name, ac);
+ }
+ // if shape is null, it's a circle
+ if (shape == null && extend2 == null && extend != null && extend.getType() == CssTypes.CSS_PERCENTAGE) {
+ throw new InvalidParamException("value",
+ expression.toStringFromStart(), name, ac);
+ }
+ if (shape != null) {
+ v.add(shape);
+ }
+ if (extend != null) {
+ v.add(extend);
+ if (extend2 != null) {
+ v.add(extend2);
+ }
+ }
+ if (atPosition != null) {
+ v.add(at);
+ v.add(atPosition);
+ }
+ return (v.size() == 1) ? v.get(0) : new CssValueList(v);
+ }
+
private final ArrayList<CssValue> parseColorStops(CssExpression expression,
ApplContext ac)
throws InvalidParamException {
@@ -462,6 +580,19 @@
return v;
}
+ private CssValue checkPosition(CssExpression expression, ApplContext ac)
+ throws InvalidParamException {
+ switch (ac.getCssVersion()) {
+ case CSS3:
+ return CssBackgroundPosition.checkSyntax(expression, ac, name);
+ default:
+ StringBuilder sb = new StringBuilder();
+ sb.append(name).append('(').append(expression.toStringFromStart()).append(')');
+ throw new InvalidParamException("notversion", sb.toString(),
+ ac.getCssVersionString(), ac);
+ }
+ }
+
/**
* Returns the value
*/
Received on Friday, 9 November 2012 13:31:35 UTC