- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Thu, 23 Aug 2012 20:25:51 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/properties/css2 In directory hutz:/tmp/cvs-serv12421/css2 Modified Files: CssBackgroundPosition.java Log Message: ident case sensitivity Index: CssBackgroundPosition.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css2/CssBackgroundPosition.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- CssBackgroundPosition.java 13 Feb 2012 15:48:13 -0000 1.2 +++ CssBackgroundPosition.java 23 Aug 2012 20:25:49 -0000 1.3 @@ -6,9 +6,6 @@ // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.css.properties.css2; -import org.w3c.css.parser.CssStyle; -import org.w3c.css.properties.css.CssProperty; -import org.w3c.css.properties.css1.Css1Style; import org.w3c.css.util.ApplContext; import org.w3c.css.util.InvalidParamException; import org.w3c.css.values.CssExpression; @@ -18,378 +15,284 @@ import org.w3c.css.values.CssTypes; import org.w3c.css.values.CssValue; -import java.util.HashMap; - import static org.w3c.css.values.CssOperator.SPACE; /** - * <H4> - * 'background-position' - * </H4> - * <p/> - * <EM>Value:</EM> [<percentage> | <length>]{1,2} | [top | center - * | bottom] || [left | center | right]<BR> - * <EM>Initial:</EM> 0% 0%<BR> - * <EM>Applies to:</EM> block-level and replaced elements<BR> - * <EM>Inherited:</EM> no<BR> - * <EM>Percentage values:</EM> refer to the size of the element itself<BR> - * <P> If a background image has been specified, the value of - * 'background-position' specifies its initial position. - * <P> With a value pair of '0% 0%', the upper left corner of the image is - * placed in the upper left corner of the box that surrounds the content of - * the element (i.e., not the box that surrounds the padding, border or - * margin). A value pair of '100% 100%' places the lower right corner of the - * image in the lower right corner of the element. With a value pair of '14% - * 84%', the point 14% across and 84% down the image is to be placed at the - * point 14% across and 84% down the element. - * <P> With a value pair of '2cm 2cm', the upper left corner of the image is - * placed 2cm to the right and 2cm below the upper left corner of the element. - * <P> If only one percentage or length value is given, it sets the horizontal - * position only, the vertical position will be 50%. If two values are given, - * the horizontal position comes first. Combinations of length and percentage - * values are allowed, e.g. '50% 2cm'. Negative positions are allowed. - * <P> One can also use keyword values to indicate the position of the - * background image. Keywords cannot be combined with percentage values, or - * length values. The possible combinations of keywords and their - * interpretations are as follows: - * <p/> - * <UL> - * <LI> - * 'top left' and 'left top' both mean the same as '0% 0%'. - * <LI> - * 'top', 'top center' and 'center top' mean the same as '50% 0%'. - * <LI> - * 'right top' and 'top right' mean the same as '100% 0%'. - * <LI> - * 'left', 'left center' and 'center left' mean the same as '0% 50%'. - * <LI> - * 'center' and 'center center' mean the same as '50% 50%'. - * <LI> - * 'right', 'right center' and 'center right' mean the same as '100% 50%'. - * <LI> - * 'bottom left' and 'left bottom' mean the same as '0% 100%'. - * <LI> - * 'bottom', 'bottom center' and 'center bottom' mean the same as - * '50% 100%'. - * <LI> - * 'bottom right' and 'right bottom' mean the same as '100% 100%'. - * </UL> - * <p/> - * examples: - * <PRE> - * BODY { background: url(banner.jpeg) right top } / * 100% 0% * / - * BODY { background: url(banner.jpeg) top center } / * 50% 0% * / - * BODY { background: url(banner.jpeg) center } / * 50% 50% * / - * BODY { background: url(banner.jpeg) bottom } / * 50% 100% * / - * </PRE> - * <p/> - * If the background image is fixed with regard to the canvas (see the - * 'background-attachment' property above), the image is placed relative to - * the canvas instead of the element. E.g.: - * <PRE> - * BODY { - * background-image: url(logo.png); - * background-attachment: fixed; - * background-position: 100% 100%; - * } - * </PRE> - * <p/> - * In the example above, the image is placed in the lower right corner of the - * canvas. - * - * @version $Revision$ - * @see org.w3c.css.properties.css.CssBackgroundAttachment + * @spec http://www.w3.org/TR/2008/REC-CSS2-20080411/colors.html#propdef-background-position */ public class CssBackgroundPosition extends org.w3c.css.properties.css.CssBackgroundPosition { - public static boolean checkMatchingIdent(CssIdent ident) { - return allowed_values.containsValue(ident); - } - - private static final String propertyName = "background-position"; - - public static HashMap<String, CssIdent> allowed_values; - public static CssIdent center, top, bottom, left, right; - private static CssPercentage defaultPercent0, defaultPercent50; - private static CssPercentage defaultPercent100; - - static { - top = CssIdent.getIdent("top"); - bottom = CssIdent.getIdent("bottom"); - left = CssIdent.getIdent("left"); - right = CssIdent.getIdent("right"); - center = CssIdent.getIdent("center"); - allowed_values = new HashMap<String, CssIdent>(); - allowed_values.put("top", top); - allowed_values.put("bottom", bottom); - allowed_values.put("left", left); - allowed_values.put("right", right); - allowed_values.put("center", center); - - defaultPercent0 = new CssPercentage(0); - defaultPercent50 = new CssPercentage(50); - defaultPercent100 = new CssPercentage(100); - } - - public CssValue value; + public static CssIdent[] allowed_values; + public static CssIdent center, top, bottom, left, right; + private static CssPercentage defaultPercent0, defaultPercent50; + private static CssPercentage defaultPercent100; - /** - * Create a new CssBackgroundPosition - */ - public CssBackgroundPosition() { - super(); - } + static { + top = CssIdent.getIdent("top"); + bottom = CssIdent.getIdent("bottom"); + left = CssIdent.getIdent("left"); + right = CssIdent.getIdent("right"); + center = CssIdent.getIdent("center"); + allowed_values = new CssIdent[5]; + allowed_values[0] = top; + allowed_values[1] = bottom; + allowed_values[2] = left; + allowed_values[3] = right; + allowed_values[4] = center; - /** - * Creates a new CssBackgroundPosition - * - * @param expression The expression for this property - * @throws InvalidParamException Values are incorrect - */ - public CssBackgroundPosition(ApplContext ac, CssExpression expression, - boolean check) throws InvalidParamException { + defaultPercent0 = new CssPercentage(0); + defaultPercent50 = new CssPercentage(50); + defaultPercent100 = new CssPercentage(100); + } - int nb_val = expression.getCount(); + public static boolean checkMatchingIdent(CssIdent ident) { + for (CssIdent id : allowed_values) { + if (id.equals(ident)) { + return true; + } + } + return false; + } - if (check && nb_val > 2) { - throw new InvalidParamException("unrecognize", ac); - } + public static CssIdent getMatchingIdent(CssIdent ident) { + for (CssIdent id : allowed_values) { + if (id.equals(ident)) { + return id; + } + } + return null; + } - setByUser(); - CssValue val; - CssBackgroundPositionValue b_val = null; - char op; + /** + * Create a new CssBackgroundPosition + */ + public CssBackgroundPosition() { + super(); + } - // we just accumulate values and check at validation - while (!expression.end()) { - val = expression.getValue(); - op = expression.getOperator(); + /** + * Creates a new CssBackgroundPosition + * + * @param expression The expression for this property + * @throws InvalidParamException Values are incorrect + */ + public CssBackgroundPosition(ApplContext ac, CssExpression expression, + boolean check) throws InvalidParamException { - if (inherit.equals(val)) { - if (expression.getCount() > 1) { - throw new InvalidParamException("value", val, - getPropertyName(), ac); - } - value = inherit; - expression.next(); - return; - } - if (b_val == null) { - b_val = new CssBackgroundPositionValue(); - } - // we will check later - b_val.add(val); - expression.next(); + int nb_val = expression.getCount(); - if (op != SPACE) { - throw new InvalidParamException("operator", - ((new Character(op)).toString()), ac); - } + if (check && nb_val > 2) { + throw new InvalidParamException("unrecognize", ac); + } - } - // if we reach the end in a value that can come in pair - if (b_val != null) { - check(b_val, ac); - value = b_val; - } - } + setByUser(); + CssValue val; + CssBackgroundPositionValue b_val = null; + char op; - // check the value + // we just accumulate values and check at validation + while (!expression.end()) { + val = expression.getValue(); + op = expression.getOperator(); - public void check(CssBackgroundPositionValue v, ApplContext ac) - throws InvalidParamException { - int nb_keyword = 0; - int nb_percentage = 0; - int nb_length = 0; - int nb_values = v.value.size(); + if (inherit.equals(val)) { + if (expression.getCount() > 1) { + throw new InvalidParamException("value", val, + getPropertyName(), ac); + } + value = inherit; + expression.next(); + return; + } + if (b_val == null) { + b_val = new CssBackgroundPositionValue(); + } + // we will check later + b_val.add(val); + expression.next(); - if (nb_values > 2) { - throw new InvalidParamException("unrecognize", ac); - } - // basic check - for (CssValue aValue : v.value) { - switch (aValue.getType()) { - case CssTypes.CSS_NUMBER: - aValue = ((CssNumber) aValue).getLength(); - case CssTypes.CSS_LENGTH: - nb_length++; - break; - case CssTypes.CSS_PERCENTAGE: - nb_percentage++; - break; - case CssTypes.CSS_IDENT: - nb_keyword++; - break; - default: - throw new InvalidParamException("unrecognize", aValue, - ac); - } - } + if (op != SPACE) { + throw new InvalidParamException("operator", + ((new Character(op)).toString()), ac); + } - // this is unnecessary complex, blame it on the CSS3 spec. - switch (nb_keyword) { - case 0: - // no keyword, so it's easy, it depends on the number - // of values :) - switch (nb_values) { - case 1: - // If only one value is specified, the second value - // is assumed to be 'center'. - v.horizontal = v.value.get(0); - if (v.horizontal.getType() == CssTypes.CSS_NUMBER) { - v.horizontal = defaultPercent0; - } - v.val_horizontal = v.horizontal; - v.val_vertical = defaultPercent50; - break; - case 2: - v.horizontal = v.value.get(0); - if (v.horizontal.getType() == CssTypes.CSS_NUMBER) { - v.horizontal = defaultPercent0; - } - v.val_horizontal = v.horizontal; - v.vertical = v.value.get(1); - if (v.vertical.getType() == CssTypes.CSS_NUMBER) { - v.vertical = defaultPercent0; - } - v.val_vertical = v.vertical; - break; - default: - // should never happen - throw new InvalidParamException("unrecognize", - ac); + } + // if we reach the end in a value that can come in pair + if (b_val != null) { + check(b_val, ac); + value = b_val; + } + } - } - break; - // we got one keyword... let's have fun... - case 1: - switch (nb_values) { - case 1: - CssIdent ident = (CssIdent) v.value.get(0); - // ugly as we need to set values for equality tests - v.val_vertical = defaultPercent50; - v.val_horizontal = defaultPercent50; - ident = allowed_values.get(ident.toString()); - if (ident != null) { - if (isVertical(ident)) { - v.vertical = ident; - v.val_vertical = identToPercent(ident); - } else { - // horizontal || center - v.horizontal = ident; - v.val_horizontal = identToPercent(ident); - } - break; - } - throw new InvalidParamException("unrecognize", - ident, propertyName, ac); - case 2: - // one ident, two values... first MUST be horizontal - // and second vertical - CssValue val0 = v.value.get(0); - if (val0.getType() == CssTypes.CSS_IDENT) { + // check the value - ident = allowed_values.get(val0.toString()); - if (ident == null) { - throw new InvalidParamException("unrecognize", - ident, propertyName, ac); - } - if (isVertical(ident)) { - throw new InvalidParamException("incompatible", - ident, v.value.get(1), ac); - } - v.horizontal = ident; - v.val_horizontal = identToPercent(ident); - // and the vertical value... - v.vertical = v.value.get(1); - if (v.vertical.getType() == CssTypes.CSS_NUMBER) { - v.vertical = defaultPercent0; - } - v.val_vertical = v.vertical; - } else { - ident = allowed_values.get(v.value.get(1).toString()); - if (ident == null) { - throw new InvalidParamException("unrecognize", - ident, propertyName, ac); - } - if (isHorizontal(ident)) { - throw new InvalidParamException("incompatible", - val0, v.value.get(1), ac); - } - v.vertical = ident; - v.val_vertical = identToPercent(ident); - // and the first value - v.horizontal = val0; - if (v.horizontal.getType() == CssTypes.CSS_NUMBER) { - v.horizontal = defaultPercent0; - } - v.val_horizontal = v.horizontal; - } - break; - default: - // one ident, 3 or 4 values is not allowed - throw new InvalidParamException("unrecognize", - ac); - } - break; - default: - // we got two keywords for two values, yeah! - CssIdent id1 = (CssIdent) v.value.get(0); - CssIdent id2 = (CssIdent) v.value.get(1); + public void check(CssBackgroundPositionValue v, ApplContext ac) + throws InvalidParamException { + int nb_keyword = 0; + int nb_percentage = 0; + int nb_length = 0; + int nb_values = v.value.size(); + if (nb_values > 2) { + throw new InvalidParamException("unrecognize", ac); + } + // basic check + for (CssValue aValue : v.value) { + switch (aValue.getType()) { + case CssTypes.CSS_NUMBER: + aValue = ((CssNumber) aValue).getLength(); + case CssTypes.CSS_LENGTH: + nb_length++; + break; + case CssTypes.CSS_PERCENTAGE: + nb_percentage++; + break; + case CssTypes.CSS_IDENT: + nb_keyword++; + break; + default: + throw new InvalidParamException("unrecognize", aValue, + ac); + } + } - if (((isVertical(id1) && isVertical(id2))) || - (isHorizontal(id1) && isHorizontal(id2))) { - throw new InvalidParamException("incompatible", - id1, id2, ac); - } - if (isVertical(id1) || isHorizontal(id2)) { - v.horizontal = id2; - v.val_horizontal = identToPercent(id2); - v.vertical = id1; - v.val_vertical = identToPercent(id1); - } else { - v.horizontal = id1; - v.val_horizontal = identToPercent(id1); - v.vertical = id2; - v.val_vertical = identToPercent(id2); - } - } - } + // this is unnecessary complex, blame it on the CSS3 spec. + switch (nb_keyword) { + case 0: + // no keyword, so it's easy, it depends on the number + // of values :) + switch (nb_values) { + case 1: + // If only one value is specified, the second value + // is assumed to be 'center'. + v.horizontal = v.value.get(0); + if (v.horizontal.getType() == CssTypes.CSS_NUMBER) { + v.horizontal = defaultPercent0; + } + v.val_horizontal = v.horizontal; + v.val_vertical = defaultPercent50; + break; + case 2: + v.horizontal = v.value.get(0); + if (v.horizontal.getType() == CssTypes.CSS_NUMBER) { + v.horizontal = defaultPercent0; + } + v.val_horizontal = v.horizontal; + v.vertical = v.value.get(1); + if (v.vertical.getType() == CssTypes.CSS_NUMBER) { + v.vertical = defaultPercent0; + } + v.val_vertical = v.vertical; + break; + default: + // should never happen + throw new InvalidParamException("unrecognize", + ac); - public CssBackgroundPosition(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } + } + break; + // we got one keyword... let's have fun... + case 1: + switch (nb_values) { + case 1: + CssIdent ident = (CssIdent) v.value.get(0); + // ugly as we need to set values for equality tests + v.val_vertical = defaultPercent50; + v.val_horizontal = defaultPercent50; + ident = getMatchingIdent(ident); + if (ident != null) { + if (isVertical(ident)) { + v.vertical = ident; + v.val_vertical = identToPercent(ident); + } else { + // horizontal || center + v.horizontal = ident; + v.val_horizontal = identToPercent(ident); + } + break; + } + throw new InvalidParamException("unrecognize", + ident, getPropertyName(), ac); + case 2: + // one ident, two values... first MUST be horizontal + // and second vertical + CssValue val0 = v.value.get(0); + if (val0.getType() == CssTypes.CSS_IDENT) { + ident = getMatchingIdent((CssIdent) val0); + if (ident == null) { + throw new InvalidParamException("unrecognize", + ident, getPropertyName(), ac); + } + if (isVertical(ident)) { + throw new InvalidParamException("incompatible", + ident, v.value.get(1), ac); + } + v.horizontal = ident; + v.val_horizontal = identToPercent(ident); + // and the vertical value... + v.vertical = v.value.get(1); + if (v.vertical.getType() == CssTypes.CSS_NUMBER) { + v.vertical = defaultPercent0; + } + v.val_vertical = v.vertical; + } else { + CssValue value1 = v.value.get(1); + if (value1.getType() != CssTypes.CSS_IDENT) { + throw new InvalidParamException("unrecognize", + value1, getPropertyName(), ac); + } + ident = getMatchingIdent((CssIdent) value1); + if (ident == null) { + throw new InvalidParamException("unrecognize", + ident, getPropertyName(), ac); + } + if (isHorizontal(ident)) { + throw new InvalidParamException("incompatible", + val0, value1, ac); + } + v.vertical = ident; + v.val_vertical = identToPercent(ident); + // and the first value + v.horizontal = val0; + if (v.horizontal.getType() == CssTypes.CSS_NUMBER) { + v.horizontal = defaultPercent0; + } + v.val_horizontal = v.horizontal; + } + break; + default: + // one ident, 3 or 4 values is not allowed + throw new InvalidParamException("unrecognize", + ac); + } + break; + default: + // we got two keywords for two values, yeah! + CssIdent id1 = (CssIdent) v.value.get(0); + CssIdent id2 = (CssIdent) v.value.get(1); - public String toString() { - return value.toString(); - } - /** - * Add this property to the CssStyle. - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - org.w3c.css.properties.css.CssBackground cssBackground = ((Css1Style) style).cssBackground; - if (cssBackground.position != null) - style.addRedefinitionWarning(ac, this); - cssBackground.position = this; - } + if (((isVertical(id1) && isVertical(id2))) || + (isHorizontal(id1) && isHorizontal(id2))) { + throw new InvalidParamException("incompatible", + id1, id2, ac); + } + if (isVertical(id1) || isHorizontal(id2)) { + v.horizontal = id2; + v.val_horizontal = identToPercent(id2); + v.vertical = id1; + v.val_vertical = identToPercent(id1); + } else { + v.horizontal = id1; + v.val_horizontal = identToPercent(id1); + v.vertical = id2; + v.val_vertical = identToPercent(id2); + } + } + } - /** - * 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 ((Css1Style) style).getBackgroundPosition(); - } else { - return ((Css1Style) style).cssBackground.position; - } - } - + public CssBackgroundPosition(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); + } }
Received on Thursday, 23 August 2012 20:25:58 UTC