- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Wed, 04 Apr 2012 13:58:59 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/properties/css3
In directory hutz:/tmp/cvs-serv18171/css/properties/css3
Modified Files:
Css3Style.java CssBoxShadow.java
Log Message:
box-shadow support
Index: Css3Style.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css3/Css3Style.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- Css3Style.java 9 Feb 2012 17:36:32 -0000 1.16
+++ Css3Style.java 4 Apr 2012 13:58:57 -0000 1.17
@@ -27,6 +27,7 @@
import org.w3c.css.properties.css.CssColumnWidth;
import org.w3c.css.properties.css.CssColumns;
import org.w3c.css.properties.css.CssOpacity;
+import org.w3c.css.properties.css.CssBoxShadow;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.Util;
import org.w3c.css.util.Warning;
@@ -34,7 +35,6 @@
public class Css3Style extends ATSCStyle {
- public CssOpacity cssOpacity;
CssColorProfile cssColorProfile;
CssRenderIntent cssRenderIntent;
CssFontEffect cssFontEffect;
@@ -110,9 +110,8 @@
CssClearCSS3 cssClearCSS3;
CssLineHeightPolicy cssLineHeightPolicy;
CssLineBoxContain cssLineBoxContain;
- public CssBackgroundClip cssBackgroundClip;
- public CssBackgroundSize cssBackgroundSize;
- public CssBackgroundOrigin cssBackgroundOrigin;
+
+
CssTextDecorationCSS3 cssTextDecoration;
CssAllSpaceTreatment cssAllSpaceTreatment;
CssHangingPunctuation cssHangingPunctuation;
@@ -127,6 +126,10 @@
CssWhiteSpaceTreatment cssWhiteSpaceTreatment;
CssWrapOption cssWrapOption;
+ public CssOpacity cssOpacity;
+ public CssBackgroundClip cssBackgroundClip;
+ public CssBackgroundSize cssBackgroundSize;
+ public CssBackgroundOrigin cssBackgroundOrigin;
public CssColumns cssColumns;
public CssColumnCount cssColumnCount;
public CssColumnFill cssColumnFill;
@@ -140,6 +143,7 @@
public CssBreakAfter cssBreakAfter;
public CssBreakBefore cssBreakBefore;
public CssBreakInside cssBreakInside;
+ public CssBoxShadow cssBoxShadow;
CssDropInitialAfterAdjust cssDropInitialAfterAdjust;
CssDropInitialAfterAlign cssDropInitialAfterAlign;
@@ -224,7 +228,6 @@
CssBorderCornerFit cssBorderCornerFit;
CssBorderImageTransform cssBorderImageTransform;
CssBorderBreak cssBorderBreak;
- CssBoxShadow cssBoxShadow;
CssTextIndentCSS3 cssTextIndentCSS3;
CssBlockProgression cssBlockProgression;
Index: CssBoxShadow.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css3/CssBoxShadow.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- CssBoxShadow.java 5 Jan 2010 13:49:50 -0000 1.3
+++ CssBoxShadow.java 4 Apr 2012 13:58:57 -0000 1.4
@@ -1,182 +1,251 @@
-//
// $Id$
// From Sijtsche de Jong (sy.de.jong@let.rug.nl)
+// Rewritten 2012 by Yves Lafon <ylafon@w3.org>
//
-// (c) COPYRIGHT 1995-2000 World Wide Web Consortium (MIT, INRIA, Keio University)
+// (c) COPYRIGHT 1995-2012 World Wide Web Consortium (MIT, ERCIM, Keio University)
// Please first read the full copyright statement at
// http://www.w3.org/Consortium/Legal/copyright-software-19980720
package org.w3c.css.properties.css3;
-import org.w3c.css.parser.CssStyle;
import org.w3c.css.properties.css.CssProperty;
import org.w3c.css.util.ApplContext;
import org.w3c.css.util.InvalidParamException;
-import org.w3c.css.values.CssColor;
import org.w3c.css.values.CssExpression;
import org.w3c.css.values.CssIdent;
import org.w3c.css.values.CssLength;
-import org.w3c.css.values.CssOperator;
+import org.w3c.css.values.CssNumber;
+import org.w3c.css.values.CssTypes;
import org.w3c.css.values.CssValue;
+import org.w3c.css.values.CssValueList;
+import java.util.ArrayList;
+import static org.w3c.css.values.CssOperator.COMMA;
+import static org.w3c.css.values.CssOperator.SPACE;
-public class CssBoxShadow extends CssProperty implements CssOperator {
- String value = "";
- ApplContext ac;
- CssIdent none = new CssIdent("none");
+public class CssBoxShadow extends org.w3c.css.properties.css.CssBoxShadow {
+
+ public static CssIdent inset;
+ Object value;
+
+ static {
+ inset = CssIdent.getIdent("inset");
+ }
/**
* Create new CssBoxShadow
*/
public CssBoxShadow() {
- value = "none";
+ value = none;
}
/**
* Create new CssBoxShadow
*
* @param expression The expression for this property
- * @exception InvalidParamException Values are incorrect
+ * @throws InvalidParamException Values are incorrect
*/
public CssBoxShadow(ApplContext ac, CssExpression expression,
- boolean check) throws InvalidParamException {
- setByUser();
- CssValue val = expression.getValue();
- char op = COMMA;
-
- if (val instanceof CssIdent) {
- if (val.equals(none)) {
- value = "none";
- expression.next();
- } else if (val.equals(inherit)) {
- value = "inherit";
- expression.next();
- }
- } else {
-
- // <length> <length> <length>? || <color> [, <length> <length> <length>? || <color>]+
-
- int lengthcounter = 0;
- int runs = 1;
+ boolean check) throws InvalidParamException {
+ CssExpression single_layer = null;
+ ArrayList<CssBoxShadowValue> values;
+ CssBoxShadowValue boxShadowValue;
- for (int i = 0; i < expression.getCount(); i++) {
+ setByUser();
+ CssValue val = expression.getValue();
+ char op = expression.getOperator();
- if (op != COMMA) {
- throw new InvalidParamException("operator",
- ((new Character(op)).toString()), ac);
- } else if (runs != 1) {
- value += ", ";
- }
+ if (expression.getCount() == 1) {
+ // it can be only 'none' or 'inherit'
+ if (val.getType() == CssTypes.CSS_IDENT) {
+ CssIdent ident = (CssIdent) val;
+ if (inherit.equals(ident)) {
+ value = inherit;
+ expression.next();
+ return;
+ } else if (none.equals(ident)) {
+ value = none;
+ expression.next();
+ return;
+ }
+ }
+ // if it is another ident, or not an ident, fail.
+ throw new InvalidParamException("value", expression.getValue(),
+ getPropertyName(), ac);
+ }
+ // ok, so we have one or multiple layers here...
+ values = new ArrayList<CssBoxShadowValue>();
- val = expression.getValue();
+ while (!expression.end()) {
+ val = expression.getValue();
+ op = expression.getOperator();
- if (val != null) {
+ if (single_layer == null) {
+ single_layer = new CssExpression();
+ }
+ single_layer.addValue(val);
+ single_layer.setOperator(op);
+ expression.next();
- while (val instanceof CssLength && lengthcounter < 3) {
- value += val.toString() + " ";
- expression.next();
- i++;
- val = expression.getValue();
- lengthcounter++;
- }
+ if (!expression.end()) {
+ // incomplete value followed by a comma... it's complete!
+ if (op == COMMA) {
+ single_layer.setOperator(SPACE);
+ boxShadowValue = check(ac, single_layer, check);
+ values.add(boxShadowValue);
+ single_layer = null;
+ } else if ((op != SPACE)) {
+ throw new InvalidParamException("operator",
+ ((new Character(op)).toString()), ac);
+ }
+ }
+ }
+ // if we reach the end in a value that can come in pair
+ if (single_layer != null) {
+ boxShadowValue = check(ac, single_layer, check);
+ values.add(boxShadowValue);
+ }
+ if (values.size() == 1) {
+ value = values.get(0);
+ } else {
+ value = values;
+ }
- if (lengthcounter == 2 || lengthcounter == 3) {
- if (val instanceof CssColor) {
- value += val.toString() + " ";
- } else {
- value += (new org.w3c.css.values.CssColor(ac, (String) val.get())).toString() + " ";
- }
- } else {
- throw new InvalidParamException("value", expression.getValue(),
- getPropertyName(), ac);
- }
- } else {
+ }
- if (runs < 2) {
- throw new InvalidParamException("value", expression.getValue(),
- getPropertyName(), ac);
- }
+ public CssBoxShadowValue check(ApplContext ac, CssExpression expression,
+ boolean check)
+ throws InvalidParamException {
+ if (check && expression.getCount() > 6) {
+ throw new InvalidParamException("unrecognize", ac);
+ }
+ CssValue val;
+ char op;
+ CssBoxShadowValue value = new CssBoxShadowValue();
+ boolean length_ok = true;
+ int got_length = 0;
- value = value.trim();
- return;
- }
+ while (!expression.end()) {
+ val = expression.getValue();
+ op = expression.getOperator();
+ switch (val.getType()) {
+ case CssTypes.CSS_NUMBER:
+ val = ((CssNumber) val).getLength();
+ case CssTypes.CSS_LENGTH:
+ if (!length_ok) {
+ throw new InvalidParamException("value", val,
+ getPropertyName(), ac);
+ }
+ got_length++;
+ switch (got_length) {
+ case 1:
+ value.horizontal_offset = val;
+ break;
+ case 2:
+ value.vertical_offset = val;
+ break;
+ case 3:
+ CssLength length = (CssLength) val;
+ if (!length.isPositive()) {
+ throw new InvalidParamException("negative-value",
+ expression.getValue(),
+ getPropertyName(), ac);
- op = expression.getOperator();
- lengthcounter = 0;
- expression.next();
- runs++;
- }
- }
+ }
+ value.blur_radius = length;
+ break;
+ case 4:
+ value.spread_distance = val;
+ break;
+ default:
+ throw new InvalidParamException("value", val,
+ getPropertyName(), ac);
+ }
+ break;
+ case CssTypes.CSS_IDENT:
+ // if we got 2 or 4 length tokens we must not have others
+ if (got_length != 0) {
+ length_ok = false;
+ }
+ CssIdent ident = (CssIdent) val;
+ // checked before, not allowed here
+ if (inherit.equals(ident)) {
+ throw new InvalidParamException("value", val,
+ getPropertyName(), ac);
+ }
+ if (inset.equals(ident)) {
+ value.shadow_mod = inset;
+ break;
+ }
+ // if not a known ident, it must be a color
+ // and let's use the CSS3 color.
+ CssExpression exp = new CssExpression();
+ exp.addValue(val);
+ CssColor color = new CssColor(ac, exp, check);
+ value.color = (CssValue) color.get();
+ break;
+ case CssTypes.CSS_COLOR:
+ case CssTypes.CSS_FUNCTION:
+ // this one is a pain... need to remove function for colors.
+ CssExpression fexp = new CssExpression();
+ fexp.addValue(val);
+ CssColor fcolor = new CssColor(ac, fexp, check);
+ value.color = (CssValue) fcolor.get();
+ break;
+ default:
+ throw new InvalidParamException("value", val,
+ getPropertyName(), ac);
+ }
+ if (op != SPACE) {
+ throw new InvalidParamException("operator", val,
+ getPropertyName(), ac);
+ }
+ expression.next();
+ }
+ // we need 2 or 4 lengthed
+ if (got_length != 2 && got_length != 4) {
+ throw new InvalidParamException("unrecognize", ac);
+ }
+ return value;
}
public CssBoxShadow(ApplContext ac, CssExpression expression)
- throws InvalidParamException {
- this(ac, expression, false);
- }
-
- /**
- * Add this property to the CssStyle.
- *
- * @param style The CssStyle
- */
- public void addToStyle(ApplContext ac, CssStyle style) {
- if (((Css3Style) style).cssBoxShadow != null)
- style.addRedefinitionWarning(ac, this);
- ((Css3Style) style).cssBoxShadow = this;
- }
-
- /**
- * Get this property in the style.
- *
- * @param style The style where the property is
- * @param resolve if true, resolve the style to find this property
- */
- public CssProperty getPropertyInStyle(CssStyle style, boolean resolve) {
- if (resolve) {
- return ((Css3Style) style).getBoxShadow();
- } else {
- return ((Css3Style) style).cssBoxShadow;
- }
+ throws InvalidParamException {
+ this(ac, expression, false);
}
/**
* Compares two properties for equality.
*
- * @param value The other property.
+ * @param property The other property.
*/
public boolean equals(CssProperty property) {
- return (property instanceof CssBoxShadow &&
- value.equals( ((CssBoxShadow) property).value));
- }
-
- /**
- * Returns the name of this property
- */
- public String getPropertyName() {
- return "box-shadow";
+ return (property instanceof CssBoxShadow &&
+ value.equals(((CssBoxShadow) property).value));
}
/**
* Returns the value of this property
*/
public Object get() {
- return value;
+ return value;
}
/**
* Returns true if this property is "softly" inherited
*/
public boolean isSoftlyInherited() {
- return value.equals(inherit);
+ return (inherit == value);
}
/**
* Returns a string representation of the object
*/
public String toString() {
- return value;
+ // FIXME TODO
+ return value.toString();
}
/**
@@ -184,7 +253,39 @@
* It is used by all macro for the function <code>print</code>
*/
public boolean isDefault() {
- return value.equals(none);
+ return none == value;
+ }
+
+// placeholder for the different values
+
+ public class CssBoxShadowValue extends CssValueList {
+
+ CssValue horizontal_offset;
+ CssValue vertical_offset;
+ CssValue blur_radius;
+ CssValue spread_distance;
+ CssValue color;
+ CssValue shadow_mod;
+
+ public boolean equals(CssBoxShadowValue v) {
+ // at last!
+ return true;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(horizontal_offset).append(' ').append(vertical_offset);
+ if (blur_radius != null) {
+ sb.append(' ').append(blur_radius).append(' ').append(spread_distance);
+ }
+ if (color != null) {
+ sb.append(' ').append(color);
+ }
+ if (shadow_mod != null) {
+ sb.append(' ').append(shadow_mod);
+ }
+ return sb.toString();
+ }
}
}
Received on Wednesday, 4 April 2012 13:59:22 UTC