- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Sat, 25 Aug 2012 14:05:37 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/properties/css3
In directory hutz:/tmp/cvs-serv13110/css3
Modified Files:
CssFontVariant.java
Log Message:
font-variant per http://www.w3.org/TR/2011/WD-css3-fonts-20111004/#propdef-font-variant
Index: CssFontVariant.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css3/CssFontVariant.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- CssFontVariant.java 5 Aug 2012 06:22:56 -0000 1.2
+++ CssFontVariant.java 25 Aug 2012 14:05:35 -0000 1.3
@@ -5,32 +5,43 @@
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.properties.css3;
+import org.w3c.css.parser.CssStyle;
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.CssOperator;
import org.w3c.css.values.CssTypes;
import org.w3c.css.values.CssValue;
+import org.w3c.css.values.CssValueList;
+
+import java.util.ArrayList;
/**
- * //spec http://www.w3.org/TR/2011/WD-css3-fonts-20111004/#font-variant-prop
- * // TODO UNFINISHED
+ * @spec http://www.w3.org/TR/2011/WD-css3-fonts-20111004/#font-variant-prop
*/
public class CssFontVariant extends org.w3c.css.properties.css.CssFontVariant {
- public static final CssIdent normal = CssIdent.getIdent("normal");
- public static final CssIdent smallCaps = CssIdent.getIdent("small-caps");
+ public static final CssIdent normal;
- public static final CssIdent getAllowedFontVariant(CssIdent ident) {
- if (smallCaps.equals(ident)) {
- return smallCaps;
- }
- if (normal.equals(ident)) {
- return normal;
- }
- return null;
+ static {
+ normal = CssIdent.getIdent("normal");
}
+ // we can't parse font-variant-* in one pass
+ // as the values might be spread all over the shorthand :(
+ // so we need to care for all the possible values, then reconstruct
+ // the whole thing.
+
+ // best bet should be to test things twice, building CssExpression for
+ // only 5 properties instead of 18 variables...
+
+ CssFontVariantAlternates altValue = null;
+ CssFontVariantCaps capValue = null;
+ CssFontVariantEastAsian asiValue = null;
+ CssFontVariantLigatures ligValue = null;
+ CssFontVariantNumeric numValue = null;
+
/**
* Creates a new CssFontVariant
*
@@ -40,7 +51,7 @@
*/
public CssFontVariant(ApplContext ac, CssExpression expression, boolean check)
throws InvalidParamException {
- if (check && expression.getCount() > 1) {
+ if (check && expression.getCount() > 18) {
throw new InvalidParamException("unrecognize", ac);
}
setByUser();
@@ -48,28 +59,135 @@
CssValue val;
char op;
- val = expression.getValue();
- op = expression.getOperator();
+ CssExpression ligExp = null;
+ CssExpression altExp = null;
+ CssExpression capExp = null;
+ CssExpression numExp = null;
+ CssExpression asiExp = null;
- // TODO FIXME this is a shorthand!
- if (val.getType() == CssTypes.CSS_IDENT) {
- CssIdent ident = (CssIdent) val;
- if (inherit.equals(ident)) {
- value = inherit;
- } else {
- value = org.w3c.css.properties.css21.CssFontVariant.getAllowedFontVariant(ident);
- if (value == null) {
+ while (!expression.end()) {
+ val = expression.getValue();
+ op = expression.getOperator();
+ switch (val.getType()) {
+ case CssTypes.CSS_FUNCTION:
+ // functions are only present in font-variant-alternates
+ // defer checking to the class
+ if (altExp == null) {
+ altExp = new CssExpression();
+ }
+ altExp.addValue(val);
+ break;
+ case CssTypes.CSS_IDENT:
+ CssIdent ident = (CssIdent) val;
+ if (inherit.equals(ident)) {
+ if (expression.getCount() != 1) {
+ throw new InvalidParamException("value",
+ val.toString(),
+ getPropertyName(), ac);
+ }
+ value = inherit;
+ break;
+ } else if (normal.equals(ident)) {
+ if (expression.getCount() != 1) {
+ throw new InvalidParamException("value",
+ val.toString(),
+ getPropertyName(), ac);
+ }
+ value = normal;
+ // normal also resets the values of individual
+ // properties, so...
+ altValue = new CssFontVariantAlternates();
+ altValue.value = normal;
+ capValue = new CssFontVariantCaps();
+ capValue.value = normal;
+ asiValue = new CssFontVariantEastAsian();
+ asiValue.value = normal;
+ ligValue = new CssFontVariantLigatures();
+ ligValue.value = normal;
+ numValue = new CssFontVariantNumeric();
+ numValue.value = normal;
+ break;
+ } else {
+ // we test the possible values
+ // of the 5 possible properties
+ if (CssFontVariantCaps.getCapsValue(ident) != null) {
+ if (capExp == null) {
+ capExp = new CssExpression();
+ }
+ capExp.addValue(ident);
+ break;
+ }
+ if (CssFontVariantNumeric.getAllowedValue(ident) != null) {
+ if (numExp == null) {
+ numExp = new CssExpression();
+ }
+ numExp.addValue(ident);
+ break;
+ }
+ if (CssFontVariantLigatures.getAllowedValue(ident) != null) {
+ if (ligExp == null) {
+ ligExp = new CssExpression();
+ }
+ ligExp.addValue(ident);
+ break;
+ }
+ if (CssFontVariantEastAsian.getAllowedValue(ident) != null) {
+ if (asiExp == null) {
+ asiExp = new CssExpression();
+ }
+ asiExp.addValue(ident);
+ break;
+ }
+ if (CssFontVariantAlternates.getAllowedIdent(ident) != null) {
+ if (altExp == null) {
+ altExp = new CssExpression();
+ }
+ altExp.addValue(ident);
+ break;
+ }
+ }
+ // unrecognized... let it fail.
+ default:
throw new InvalidParamException("value",
val.toString(),
getPropertyName(), ac);
- }
}
- } else {
- throw new InvalidParamException("value",
- val.toString(),
- getPropertyName(), ac);
+ if (op != CssOperator.SPACE) {
+ throw new InvalidParamException("operator",
+ ((new Character(op)).toString()), ac);
+ }
+ expression.next();
+ }
+ // value not yet set, we must reassign values
+ if (value == null) {
+ CssFontVariantAlternates altValue = null;
+ CssFontVariantCaps capValue = null;
+ CssFontVariantEastAsian asiValue = null;
+ CssFontVariantLigatures ligValue = null;
+ CssFontVariantNumeric numValue = null;
+ ArrayList<CssValue> vlist = new ArrayList<CssValue>(5);
+ if (altExp != null) {
+ altValue = new CssFontVariantAlternates(ac, altExp, check);
+ vlist.add(altValue.value);
+ }
+ if (capExp != null) {
+ capValue = new CssFontVariantCaps(ac, capExp, check);
+ vlist.add(capValue.value);
+ }
+ if (asiExp != null) {
+ asiValue = new CssFontVariantEastAsian(ac, asiExp, check);
+ vlist.add(asiValue.value);
+ }
+ if (ligExp != null) {
+ ligValue = new CssFontVariantLigatures(ac, ligExp, check);
+ vlist.add(ligValue.value);
+ }
+ if (numExp != null) {
+ numValue = new CssFontVariantNumeric(ac, numExp, check);
+ vlist.add(numValue.value);
+ }
+ value = (vlist.size() > 1) ? new CssValueList(vlist) : vlist.get(0);
}
- expression.next();
}
public CssFontVariant(ApplContext ac, CssExpression expression)
@@ -80,5 +198,29 @@
public CssFontVariant() {
value = initial;
}
+
+ /**
+ * Add this property to the CssStyle.
+ *
+ * @param style The CssStyle
+ */
+ public void addToStyle(ApplContext ac, CssStyle style) {
+ super.addToStyle(ac, style);
+ if (altValue != null) {
+ altValue.addToStyle(ac, style);
+ }
+ if (capValue != null) {
+ capValue.addToStyle(ac, style);
+ }
+ if (asiValue != null) {
+ asiValue.addToStyle(ac, style);
+ }
+ if (ligValue != null) {
+ ligValue.addToStyle(ac, style);
+ }
+ if (numValue != null) {
+ numValue.addToStyle(ac, style);
+ }
+ }
}
Received on Saturday, 25 August 2012 14:05:44 UTC