- From: CVS User ylafon <cvsmail@w3.org>
- Date: Tue, 08 Jan 2013 11:13:38 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/properties/css3 In directory roscoe:/tmp/cvs-serv4867/css3 Added Files: CssVoiceFamily.java Log Message: voice-family per css2/21 and css3 http://www.w3.org/TR/2012/CR-css3-speech-20120320/#voice-props-voice-family --- /sources/public/2002/css-validator/org/w3c/css/properties/css3/CssVoiceFamily.java 2013/01/08 11:13:38 NONE +++ /sources/public/2002/css-validator/org/w3c/css/properties/css3/CssVoiceFamily.java 2013/01/08 11:13:38 1.1 // $Id: CssVoiceFamily.java,v 1.1 2013/01/08 11:13:38 ylafon Exp $ // Author: Yves Lafon <ylafon@w3.org> // // (c) COPYRIGHT MIT, ERCIM and Keio University, 2013. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.css.properties.css3; 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.CssLayerList; 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; /** * @spec http://www.w3.org/TR/2012/CR-css3-speech-20120320/#voice-props-voice-family */ public class CssVoiceFamily extends org.w3c.css.properties.css.CssVoiceFamily { public static final ArrayList<CssIdent> genericVoices, age; public static final CssIdent preserve; static { preserve = CssIdent.getIdent("preserve"); String[] _genericVoices = {"male", "female", "neutral"}; genericVoices = new ArrayList<CssIdent>(_genericVoices.length); for (String s : _genericVoices) { genericVoices.add(CssIdent.getIdent(s)); } String[] _age = {"child", "young", "old"}; age = new ArrayList<CssIdent>(_age.length); for (String s : _age) { age.add(CssIdent.getIdent(s)); } } static CssIdent getGenericVoiceName(CssIdent ident) { for (CssIdent id : genericVoices) { if (id.equals(ident)) { return id; } } return null; } static CssIdent getAge(CssIdent ident) { for (CssIdent id : age) { if (id.equals(ident)) { return id; } } return null; } /** * Create a new CssVoiceFamily */ public CssVoiceFamily() { value = initial; } /** * Creates a new CssVoiceFamily * * @param expression The expression for this property * @throws org.w3c.css.util.InvalidParamException * Expressions are incorrect */ public CssVoiceFamily(ApplContext ac, CssExpression expression, boolean check) throws InvalidParamException { ArrayList<CssValue> values = new ArrayList<CssValue>(); while (!expression.end()) { char op = expression.getOperator(); CssValue val = expression.getValue(); switch (val.getType()) { case CssTypes.CSS_STRING: case CssTypes.CSS_IDENT: ArrayList<CssValue> cssValues = new ArrayList<CssValue>(); cssValues.add(val); // we add idents if separated by spaces... while (op == SPACE && expression.getRemainingCount() > 1) { expression.next(); op = expression.getOperator(); val = expression.getValue(); int type = val.getType(); if (type == CssTypes.CSS_IDENT || type == CssTypes.CSS_STRING || type == CssTypes.CSS_NUMBER) { cssValues.add(val); } else { throw new InvalidParamException("value", val, getPropertyName(), ac); } } checkExpression(ac, values, cssValues, check); break; default: throw new InvalidParamException("value", val, getPropertyName(), ac); } expression.next(); if (!expression.end() && (op != COMMA)) { throw new InvalidParamException("operator", ((new Character(op)).toString()), ac); } } checkValues(ac, values); value = (values.size() > 1) ? new CssLayerList(values) : values.get(0); } public CssVoiceFamily(ApplContext ac, CssExpression expression) throws InvalidParamException { this(ac, expression, false); } private void checkExpression(ApplContext ac, ArrayList<CssValue> curval, ArrayList<CssValue> values, boolean check) throws InvalidParamException { CssIdent ageVal = null; CssValue numVal = null; CssValue nameVal = null; ArrayList<CssIdent> identl = null; // so we can have a generic voice or a string or an ident list... // let's triage things... that will require extra checks (again) // at the end *sigh* for (CssValue val : values) { if (ageVal == null && nameVal == null && val.getType() == CssTypes.CSS_IDENT) { ageVal = getAge((CssIdent) val); if (ageVal != null) { continue; } } if (numVal == null) { switch (val.getType()) { case CssTypes.CSS_STRING: if (nameVal != null) { // don't mix string and everything else. throw new InvalidParamException("value", val, getPropertyName(), ac); } nameVal = val; break; case CssTypes.CSS_IDENT: CssIdent id = (CssIdent) val; if (inherit.equals(id)) { val = inherit; } else if (preserve.equals(id)) { val = preserve; } if (nameVal == null) { nameVal = val; identl = new ArrayList<CssIdent>(); } if (identl == null) { // else we got a string before... throw new InvalidParamException("value", val, getPropertyName(), ac); } identl.add((CssIdent) val); break; case CssTypes.CSS_NUMBER: CssNumber n = val.getNumber(); n.checkStrictPositiveness(ac, this); numVal = val; break; } } else { // we can't have things after the number. throw new InvalidParamException("value", val, getPropertyName(), ac); } } if (values.size() == 1) { // that's the easy one... if (nameVal == null) { throw new InvalidParamException("value", values.get(0), getPropertyName(), ac); } if (nameVal.getType() == CssTypes.CSS_IDENT) { hasGenericVoiceFamily = (getGenericVoiceName((CssIdent) nameVal) != null); } curval.add(nameVal); } else { // let the fun begin... if (numVal != null || ageVal != null) { // we must have a generic name... // this also checks that we don't have a String. if (identl == null || identl.size() != 1) { CssValue v = new CssValueList(values); throw new InvalidParamException("value", v, getPropertyName(), ac); } // ok so now check that we have a generic value in nameVal if (getGenericVoiceName((CssIdent) nameVal) == null) { throw new InvalidParamException("value", nameVal, getPropertyName(), ac); } } else { if (identl != null) { if (identl.size() > 1) { ac.getFrame().addWarning("with-space", 1); } else { hasGenericVoiceFamily = (getGenericVoiceName(identl.get(0)) != null); } } } // now addthe value... curval.add(new CssValueList(values)); } } // final consistency check private void checkValues(ApplContext ac, ArrayList<CssValue> values) throws InvalidParamException { // we need to check that we don't have 'inherit' in multiple values if (values.size() > 1) { for (CssValue val : values) { if ((inherit == val) || (preserve == val)) { throw new InvalidParamException("unrecognize", ac); } } } if (inherit != value && preserve != value && !hasGenericVoiceFamily) { ac.getFrame().addWarning("no-generic-family", getPropertyName()); } } }
Received on Tuesday, 8 January 2013 11:13:39 UTC