- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Tue, 05 Jan 2010 19:49:52 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/properties/css1 In directory hutz:/tmp/cvs-serv14290/org/w3c/css/properties/css1 Modified Files: CssBackgroundAttachmentCSS1.java CssBackgroundPositionCSS1.java CssBackgroundRepeatCSS1.java CssColor.java Log Message: fix for background-attachment inheritance + background-color CSS3 + starting wrk on background + encoding of some files Index: CssBackgroundPositionCSS1.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssBackgroundPositionCSS1.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- CssBackgroundPositionCSS1.java 5 Jan 2010 13:49:39 -0000 1.7 +++ CssBackgroundPositionCSS1.java 5 Jan 2010 19:49:50 -0000 1.8 @@ -7,235 +7,365 @@ package org.w3c.css.properties.css1; import org.w3c.css.parser.CssStyle; -import org.w3c.css.properties.css.CssBackgroundConstants; +import org.w3c.css.properties.css.CssBackgroundPosition; import org.w3c.css.properties.css.CssProperty; import org.w3c.css.util.ApplContext; import org.w3c.css.util.InvalidParamException; import org.w3c.css.values.CssExpression; import org.w3c.css.values.CssIdent; -import org.w3c.css.values.CssLength; import org.w3c.css.values.CssNumber; -//import org.w3c.css.values.CssNumber; -import org.w3c.css.values.CssOperator; import org.w3c.css.values.CssPercentage; +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: + * <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. * - * <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 */ -public class CssBackgroundPositionCSS1 extends CssProperty -implements CssBackgroundConstants, CssOperator { +public class CssBackgroundPositionCSS1 extends CssBackgroundPosition { - CssValue first; - CssValue second; + 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; /** * Create a new CssBackgroundPositionCSS1 */ public CssBackgroundPositionCSS1() { - first = DefaultValue0; - second = DefaultValue0; + } /** * Creates a new CssBackgroundPositionCSS1 * * @param expression The expression for this property - * @exception InvalidParamException Values are incorrect + * @throws InvalidParamException Values are incorrect */ public CssBackgroundPositionCSS1(ApplContext ac, CssExpression expression, - boolean check) throws InvalidParamException { + boolean check) throws InvalidParamException { + int nb_val = expression.getCount(); - if(check && expression.getCount() > 2) { - throw new InvalidParamException("unrecognize", ac); - } + if (check && nb_val > 2) { + throw new InvalidParamException("unrecognize", ac); + } - setByUser(); - CssValue val = expression.getValue(); - char op = expression.getOperator(); + setByUser(); + setByUser(); + CssValue val; + CssBackgroundPositionValue b_val = null; + char op; - if (op != SPACE) - throw new InvalidParamException("operator", - ((new Character(op)).toString()), - ac); + // we just accumulate values and check at validation + while (!expression.end()) { + val = expression.getValue(); + op = expression.getOperator(); - CssValue next = expression.getNextValue(); + 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(val instanceof CssIdent) { - int index1 = IndexOfIdent((String) val.get()); - if(index1 == -1) { - throw new InvalidParamException("value", val, "background-position", ac); - } - // two keywords - if(next instanceof CssIdent) { - int index2 = IndexOfIdent((String) next.get()); - if(index2 == -1 && check) { - throw new InvalidParamException("value", next, "background-position", ac); - } - // one is vertical, the other is vertical - // or the two are 'center' - if((isHorizontal(index1) && isVertical(index2)) || - (isHorizontal(index2) && isVertical(index1))) { - first = val; - second = next; - } - // both are horizontal or vertical but not 'center' - else if(check){ - throw new InvalidParamException("incompatible", - val, next, ac); - } - else { - first = val; - } - } - // only one value - else if(!check || next == null) { - first = val; - } - // the second value is invalid - else { - throw new InvalidParamException("value", next, - getPropertyName(), ac); - } - } - else if(val instanceof CssLength || val instanceof CssPercentage - || val instanceof CssNumber) { - if(val instanceof CssNumber) { - val = ((CssNumber) val).getLength(); - } - if(next instanceof CssLength || next instanceof CssPercentage || - next instanceof CssNumber) { - if(next instanceof CssNumber) { - next = ((CssNumber) next).getLength(); - } - first = val; - second = next; - } - else if(next == null || !check) { - first = val; - } - else { - throw new InvalidParamException("incompatible", val, next, ac); - } - } - else if(check){ - throw new InvalidParamException("value", expression.getValue(), - getPropertyName(), ac); - } + if (op != SPACE) { + throw new InvalidParamException("operator", + ((new Character(op)).toString()), ac); + } - // we only move the cursor if we found valid values - if(first != null) { - expression.next(); - } - if(second != null) { - expression.next(); - } + } + // if we reach the end in a value that can come in pair + if (b_val != null) { + check(b_val, ac); + value = b_val; + } } - public CssBackgroundPositionCSS1(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } + // check the value - /** - * Returns the value of this property - */ - public Object get() { - return first; - } + 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(); - /** - * Returns the name of this property - */ - public String getPropertyName() { - return "background-position"; + 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); + } + } + + // 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); + + } + 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) { + + 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); + + + 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); + } + } } - /** - * Returns the first value of the position - */ - public CssValue getHorizontalPosition() { - return first; + public CssBackgroundPositionCSS1(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); } /** - * Returns the second value of the position + * Returns the value of this property */ - public CssValue getVerticalPosition() { - return second; + public Object get() { + return value; } /** @@ -243,118 +373,40 @@ * e.g. his value equals inherit */ public boolean isSoftlyInherited() { - return first == inherit; + return (inherit == value); } /** * Returns a string representation of the object. */ public String toString() { - if (first == inherit) { - return inherit.toString(); - } - else { - String ret = ""; - if (first != null) { - ret += first; - } - if (second != null) { - if (!ret.equals("")) { - ret += " "; - } - ret += second; - } - return ret; - } - } + return value.toString(); - private boolean isHorizontal(int index) { - return index == POSITION_LEFT || index == POSITION_RIGHT || - index == POSITION_CENTER; } - private boolean isVertical(int index) { - return index == POSITION_TOP || index == POSITION_BOTTOM || - index == POSITION_CENTER; - } - /* - private void getPercentageFromIdent(int first, int second) { - this.first = DefaultValue50; - this.second = DefaultValue50; - if (first == POSITION_LEFT || second == POSITION_LEFT) - this.first = DefaultValue0; - if (first == POSITION_RIGHT || second == POSITION_RIGHT) - this.first = DefaultValue100; - if (first == POSITION_TOP || second == POSITION_TOP) - this.second = DefaultValue0; - if (first == POSITION_BOTTOM || second == POSITION_BOTTOM) - this.second = DefaultValue100; - } - */ /** * Add this property to the CssStyle. * * @param style The CssStyle */ public void addToStyle(ApplContext ac, CssStyle style) { - CssBackgroundCSS1 cssBackground = ((Css1Style) style).cssBackgroundCSS1; - if (cssBackground.position != null) - style.addRedefinitionWarning(ac, this); - cssBackground.position = this; + CssBackgroundCSS1 cssBackground = ((Css1Style) style).cssBackgroundCSS1; + if (cssBackground.position != null) + style.addRedefinitionWarning(ac, this); + cssBackground.position = this; } /** * Get this property in the style. * - * @param style The style where the property is + * @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).getBackgroundPositionCSS1(); - } else { - return ((Css1Style) style).cssBackgroundCSS1.position; - } - } - - /** - * Compares two properties for equality. - * - * @param value The other property. - */ - public boolean equals(CssProperty property) { - return (property instanceof CssBackgroundPositionCSS1 && - first.equals(((CssBackgroundPositionCSS1) property).first) - && second.equals(((CssBackgroundPositionCSS1) property).second)); - } - - /** - * Is the value of this property is a default value. - * It is used by all macro for the function <code>print</code> - */ - public boolean isDefault() { - return first.equals(DefaultValue0) && second.equals(DefaultValue0); - } - - private int IndexOfIdent(String ident) throws InvalidParamException { - int hash = ident.hashCode(); - for (int i = 0; i < POSITION.length; i++) - if (hash_values[i] == hash) - return i; - - return -1; - } - - private static int[] hash_values; - - //private static int INVALID = -1; - private static CssPercentage DefaultValue0 = new CssPercentage(0); - //private static CssPercentage DefaultValue50 = new CssPercentage(50); - //private static CssPercentage DefaultValue100 = new CssPercentage(100); - - static { - hash_values = new int[POSITION.length]; - for (int i = 0; i < POSITION.length; i++) - hash_values[i] = POSITION[i].hashCode(); + if (resolve) { + return ((Css1Style) style).getBackgroundPositionCSS1(); + } else { + return ((Css1Style) style).cssBackgroundCSS1.position; + } } } Index: CssBackgroundRepeatCSS1.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssBackgroundRepeatCSS1.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- CssBackgroundRepeatCSS1.java 5 Jan 2010 13:49:40 -0000 1.5 +++ CssBackgroundRepeatCSS1.java 5 Jan 2010 19:49:50 -0000 1.6 @@ -49,7 +49,7 @@ */ public class CssBackgroundRepeatCSS1 extends CssBackgroundRepeat { - public static HashMap<String, CssIdent> allowed_values; + private static HashMap<String, CssIdent> allowed_values; static { allowed_values = new HashMap<String, CssIdent>(); Index: CssColor.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssColor.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- CssColor.java 5 Jan 2010 13:49:42 -0000 1.9 +++ CssColor.java 5 Jan 2010 19:49:50 -0000 1.10 @@ -209,7 +209,7 @@ /** * Compares two properties for equality. * - * @param value The other property. + * @param property The other property. */ public boolean equals(CssProperty property) { return (property instanceof CssColor && Index: CssBackgroundAttachmentCSS1.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssBackgroundAttachmentCSS1.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- CssBackgroundAttachmentCSS1.java 5 Jan 2010 13:49:39 -0000 1.5 +++ CssBackgroundAttachmentCSS1.java 5 Jan 2010 19:49:50 -0000 1.6 @@ -44,6 +44,9 @@ */ public class CssBackgroundAttachmentCSS1 extends CssBackgroundAttachment { + private static HashMap<String, CssIdent> allowed_values; + private static CssIdent scroll; + static { allowed_values = new HashMap<String, CssIdent>(); scroll = CssIdent.getIdent("scroll");
Received on Tuesday, 5 January 2010 19:49:55 UTC