- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Sat, 04 Aug 2012 21:17:07 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/properties/css1 In directory hutz:/tmp/cvs-serv31218/w3c/css/properties/css1 Modified Files: Css1Style.java CssFont.java CssFontFamily.java CssFontSize.java CssFontStyle.java CssFontVariant.java CssFontWeight.java CssLineHeight.java Log Message: font revamp, still some missing properties for CSS3 and @font-face for CSS2 and CSS3 Index: CssFont.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssFont.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- CssFont.java 3 Apr 2012 14:20:54 -0000 1.7 +++ CssFont.java 4 Aug 2012 21:17:05 -0000 1.8 @@ -1,441 +1,238 @@ -// // $Id$ -// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr) +// Author: Yves Lafon <ylafon@w3.org> // -// (c) COPYRIGHT MIT and INRIA, 1997. +// (c) COPYRIGHT MIT, ERCIM and Keio University, 2012. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.css.properties.css1; -import org.w3c.css.parser.CssSelectors; -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.*; - -/** - * <H4> - * 'font' - * </H4> - * <P> - * <EM>Value:</EM> [ <font-style> || <font-variant> || - * <font-weight> ]? <font-size> [ / <line-height> ]? - * <font-family><BR> - * <EM>Initial:</EM> not defined for shorthand properties<BR> - * <EM>Applies to:</EM> all elements<BR> - * <EM>Inherited:</EM> yes<BR> - * <EM>Percentage values:</EM> allowed on <font-size> and - * <line-height><BR> - * <P> - * The 'font' property is a shorthand property for setting - * 'font-style', - * 'font-variant', - * 'font-weight', - * 'font-size', - * 'line-height' and - * 'font-family' at the same place in the style sheet. - * The syntax of this property is based on a traditional typographical - * shorthand notation to set multiple properties related to fonts. - * <P> For a definition of allowed and initial values, see the previously - * defined properties. Properties for which no values are given are set to - * their initial value. - * <PRE> - * P { font: 12pt/14pt sans-serif } - * P { font: 80% sans-serif } - * P { font: x-large/110% "new century schoolbook", serif } - * P { font: bold italic large Palatino, serif } - * P { font: normal small-caps 120%/120% fantasy } - * </PRE> - * <P> In the second rule, the font size percentage value ('80%') refers to - * the font size of the parent element. In the third rule, the line height - * percentage refers to the font size of the element itself. - * <P> In the first three rules above, the 'font-style', 'font-variant' and - * 'font-weight' are not explicitly mentioned, which means they are all three - * set to their initial value ('normal'). The fourth rule sets the - * 'font-weight' to 'bold', the 'font-style' to 'italic' and implicitly sets - * 'font-variant' to 'normal'. - * <P> The fifth rule sets the 'font-variant' ('small-caps'), the 'font-size' - * (120% of the parent's font), the 'line-height' (120% times the font size) - * and the 'font-family' ('fantasy'). It follows that the keyword 'normal' - * applies to the two remaining properties: 'font-style' and 'font-weight'. - * - * @see CssFontStyle - * @see CssFontVariant - * @see CssFontWeight - * @see CssFontSize - * @see CssLineHeight - * @see CssFontFamily - * @see CssPercentage - * @see CssLength - * @version $Revision$ - */ -public class CssFont extends CssProperty - implements CssOperator, CssFontConstant { - - CssValue value; - - CssFontStyle fontStyle; - CssFontVariant fontVariant; - CssFontWeight fontWeight; - - CssFontSize fontSize; - CssLineHeight lineHeight; - CssFontFamily fontFamily; - - // internal hack for strings comparaison - private static int[] hash_values; - - static CssIdent normal = new CssIdent("normal"); - - /** - * Create a new CssFont - */ - public CssFont() { - } - - /** - * Creates a new CssFont - * - * @param expression The expression for this property - * @exception InvalidParamException The expression is incorrect - */ - public CssFont(ApplContext ac, CssExpression expression,boolean check) - throws InvalidParamException { - - CssValue val = expression.getValue(); - char op = SPACE; - boolean find = true; - int max_values = 3; - - int normalNb = 0; - - if (val instanceof CssIdent) { - CssIdent ident = checkIdent((CssIdent) val); - if (ident != null) { - if(expression.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); - } - value = ident; - expression.next(); - return; - } // else continue; - } - - while (find && max_values-- > 0) { - find = false; - val = expression.getValue(); - op = expression.getOperator(); - - if (val == null) { - throw new InvalidParamException("few-value", getPropertyName(), ac); - } +import org.w3c.css.values.CssExpression; +import org.w3c.css.values.CssIdent; +import org.w3c.css.values.CssTypes; +import org.w3c.css.values.CssValue; - if(val.equals(inherit)) { - throw new InvalidParamException("unrecognize", ac); - } +import java.util.HashMap; - if(val.equals(normal)) { - normalNb++; - expression.next(); - find = true; - } +import static org.w3c.css.values.CssOperator.SPACE; - if (!find && fontStyle == null) { - try { - fontStyle = new CssFontStyle(ac, expression); - find = true; - } catch (InvalidParamException e) { - } - } +/** + * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#font + */ +public class CssFont extends org.w3c.css.properties.css.CssFont { - if (!find && fontVariant == null) { - try { - fontVariant = new CssFontVariant(ac, expression); - find = true; - } catch (InvalidParamException e) { - } - } + public static final CssIdent normal; + public static final HashMap<String, CssIdent> systemFonts; + static final String[] _systemFonts = {"caption", "icon", "menu", + "message-box", "small-caption", "status-bar"}; - if (!find && fontWeight == null) { - try { - fontWeight = new CssFontWeight(ac, expression); - find = true; - } catch (InvalidParamException e) { - // we have now (or not) - // [ 'font-style' || 'font-variant' || 'font-weight' ]? - //break; + static { + normal = CssIdent.getIdent("normal"); + systemFonts = new HashMap<String, CssIdent>(); + for (String s : _systemFonts) { + systemFonts.put(s, CssIdent.getIdent(s)); } - } - - if (find && op != SPACE) { - throw new InvalidParamException("operator", - ((new Character(op)).toString()), ac); - } } - // "normal" values - CssExpression normalExpr = new CssExpression(); - normalExpr.addValue(normal); - - for(int i = 0; i < normalNb; i++) { - if (fontStyle == null) { - fontStyle = new CssFontStyle(ac, normalExpr); - normalExpr.starts(); - } - else if (fontVariant == null) { - fontVariant = new CssFontVariant(ac, normalExpr); - normalExpr.starts(); - } - else if (fontWeight == null) { - fontWeight = new CssFontWeight(ac, normalExpr); - normalExpr.starts(); - } - } - - val = expression.getValue(); - op = expression.getOperator(); - - if (val == null) { - throw new InvalidParamException("few-value", getPropertyName(), ac); - } - - if(val.equals(inherit)) { - throw new InvalidParamException("unrecognize", ac); - } - - fontSize = new CssFontSize(ac, expression); - - if (val.getType() == CssTypes.CSS_SWITCH) { - expression.next(); - val = expression.getValue(); - op = expression.getOperator(); - if(expression.getValue().equals(inherit)) { - throw new InvalidParamException("unrecognize", ac); - } - lineHeight = new CssLineHeight(ac, expression); - } - - if(expression.getValue().equals(inherit)) { - throw new InvalidParamException("unrecognize", ac); - } - - if (op == SPACE && expression.getValue() != null) { - fontFamily = new CssFontFamily(ac, expression, true); - } else { - expression.starts(); - throw new InvalidParamException("few-value", expression.toString(), ac); + /** + * Create a new CssFontSize + */ + public CssFont() { } - setByUser(); - } - public CssFont(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } + /** + * Creates a new CssFontSize + * + * @param expression The expression for this property + * @throws org.w3c.css.util.InvalidParamException + * Expressions are incorrect + */ + public CssFont(ApplContext ac, CssExpression expression, boolean check) + throws InvalidParamException { - /** - * Returns the value of this property - */ - public Object get() { - return null; - } + setByUser(); - /** - * Returns a string representation of the object. - */ - public String toString() { - if (value != null) { - return value.toString(); - } else { - String ret = ""; - if (fontStyle != null) { - ret += " " + fontStyle; - } - if (fontVariant != null) { - ret += " " + fontVariant; - } - if (fontWeight != null) { - ret += " " + fontWeight; - } - if(fontSize != null) { - ret += " " + fontSize; - } - if (lineHeight != null) { - ret += "/" + lineHeight; - } - if (fontFamily.size() != 0) { - ret += " " + fontFamily; - } - return ret.substring(1); - } - } + CssValue val; + char op; - /** - * Set this property to be important. - * Overrides this method for a macro - */ - public void setImportant() { - super.setImportant(); - if (value == null) { - if(fontStyle != null) - fontStyle.important = true; - if(fontVariant != null) - fontVariant.important = true; - if(fontWeight != null) - fontWeight.important = true; - if(fontSize != null) - fontSize.important = true; - if(lineHeight != null) - lineHeight.important = true; - if(fontFamily != null) - fontFamily.important = true; - } - } + boolean gotNormal = false; + int state = 0; - /** - * Returns true if this property is important. - * Overrides this method for a macro - */ - public boolean getImportant() { - if (value != null) { - return super.getImportant(); - } else { - return ((fontStyle == null || fontStyle.important) && - (fontVariant == null || fontVariant.important) && - (fontWeight == null || fontWeight.important) && - (fontSize == null || fontSize.important) && - (lineHeight == null || lineHeight.important) && - (fontFamily == null || fontFamily.important)); - } - } + while (!expression.end()) { + val = expression.getValue(); + op = expression.getOperator(); + switch (val.getType()) { + case CssTypes.CSS_IDENT: + if (inherit.equals(val)) { + if (expression.getCount() != 1) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + value = inherit; + break; + } + CssIdent ident; + ident = systemFonts.get(val.toString()); + if (ident != null) { + if (expression.getCount() != 1) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + value = ident; + break; + } - /** - * Add this property to the CssStyle - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - if (value != null) { - ((Css1Style) style).cssFont.value = value; - } else { - if(fontStyle != null) - fontStyle.addToStyle(ac, style); - if(fontVariant != null) - fontVariant.addToStyle(ac, style); - if(fontSize != null) - fontSize.addToStyle(ac, style); - if(fontWeight != null) - fontWeight.addToStyle(ac, style); - if(lineHeight != null) - lineHeight.addToStyle(ac, style); - if(fontFamily != null) - fontFamily.addToStyle(ac, style); - } - } + // first font-style + ident = (CssIdent) val; + if (state == 0) { + // now check for possible font values + // first the strange case of 'normal' + // which sets up to three values... + // we keep it around for the final check + if (normal.equals((CssIdent) val)) { + gotNormal = true; + break; + } + int pos = CssFontStyle.allowed_values.indexOf(ident); + if (pos >= 0) { + if (fontStyle != null) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + fontStyle = new org.w3c.css.properties.css21.CssFontStyle(); + fontStyle.value = CssFontStyle.allowed_values.get(pos); + break; + } + // font-variant + CssIdent v = CssFontVariant.getAllowedFontVariant(ident); + if (v != null) { + if (fontVariant != null) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + fontVariant = new CssFontVariant(); + fontVariant.value = v; + break; + } + // font-weight + v = CssFontWeight.allowed_values.get(ident.toString()); + if (v != null) { + if (fontWeight != null) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + fontWeight = new CssFontWeight(); + fontWeight.value = v; + break; + } + } - /** - * Update the source file and the line. - * Overrides this method for a macro - * - * @param line The line number where this property is defined - * @param source The source file where this property is defined - */ - public void setInfo(int line, String source) { - super.setInfo(line, source); - if (value == null) { - if(fontStyle != null) - fontStyle.setInfo(line, source); - if(fontVariant != null) - fontVariant.setInfo(line, source); - if(fontWeight != null) - fontWeight.setInfo(line, source); - if(fontSize != null) - fontSize.setInfo(line, source); - if(lineHeight != null) - lineHeight.setInfo(line, source); - if(fontFamily != null) - fontFamily.setInfo(line, source); - } - } + // check if we moved past and we now got + // a font-size + if (state == 0) { + CssIdent v = CssFontSize.allowed_values.get(ident.toString()); + if (v != null) { + // we got a FontSize, so no more style/variant/weight + state = 1; + if (fontSize != null) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + fontSize = new CssFontSize(); + fontSize.value = v; + break; + } + } + // still nothing? It must be a font-family then... + // let the fun begin ;) + fontFamily = new CssFontFamily(ac, expression, check); + state = 2; + // expression.next is called, so continue instead + // of next + continue; + case CssTypes.CSS_SWITCH: + // sanity check, it must happen only after a fontSize + if (fontSize == null || state != 1) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + expression.next(); + if (expression.end()) { + throw new InvalidParamException("value", + expression.toString(), + getPropertyName(), ac); + } + // let's parse a line-height + lineHeight = new CssLineHeight(ac, expression, false); + state = 1; + // expression.next is called, so continue instead + // of next + continue; - /** - * Compares two properties for equality. - * - * @param property The other property. - */ - public boolean equals(CssProperty property) { - return false; - } + case CssTypes.CSS_NUMBER: + // must be a font-weight + if (state == 0 && fontWeight == null) { + fontWeight = new CssFontWeight(ac, expression, false); + // expression.next is called, so continue instead + // of next + continue; + } + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); - /** - * Set the context. - * Overrides this method for a macro - * - * @see org.w3c.css.css.CssCascadingOrder#order - * @see org.w3c.css.css.StyleSheetParser#handleRule - */ - public void setSelectors(CssSelectors selector) { - super.setSelectors(selector); - if (fontStyle != null) { - fontStyle.setSelectors(selector); - } - if (fontVariant != null) { - fontVariant.setSelectors(selector); - } - if (fontWeight != null) { - fontWeight.setSelectors(selector); - } - if (fontSize != null) { - fontSize.setSelectors(selector); - } - if (lineHeight != null) { - lineHeight.setSelectors(selector); - } - if (fontFamily != null) { - fontFamily.setSelectors(selector); - } - } + case CssTypes.CSS_PERCENTAGE: + case CssTypes.CSS_LENGTH: + if (state == 0 && fontSize == null) { + fontSize = new CssFontSize(ac, expression, false); + state = 1; + // expression.next is called, so continue instead + // of next + continue; + } + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + default: + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + if (op != SPACE) { + throw new InvalidParamException("operator", + Character.toString(op), + ac); + } + expression.next(); + } + if (gotNormal) { + if (fontSize == null) { + fontSize = new CssFontSize(); + fontSize.value = normal; + } + if (fontVariant == null) { + fontVariant = new CssFontVariant(); + fontVariant.value = normal; + } + if (fontWeight == null) { + fontWeight = new CssFontWeight(); + fontWeight.value = normal; - /** - * 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).getFont(); - } else { - return ((Css1Style) style).cssFont; + } + } } - } - /** - * Returns the name of this property - */ - public String getPropertyName() { - return "font"; - } - - private CssIdent checkIdent(CssIdent ident) { - int hash = ident.hashCode(); - for (int i = 0; i < CssFontConstant.FONT.length; i++) { - if (hash_values[i] == hash) { - return ident; - } + public CssFont(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); } - return null; - } - - static { - hash_values = new int[CssFontConstant.FONT.length]; - for (int i=0; i<CssFontConstant.FONT.length; i++) - hash_values[i] = CssFontConstant.FONT[i].hashCode(); - } } - - - - Index: CssFontVariant.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssFontVariant.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- CssFontVariant.java 5 Jan 2010 13:49:43 -0000 1.4 +++ CssFontVariant.java 4 Aug 2012 21:17:05 -0000 1.5 @@ -1,178 +1,80 @@ -// // $Id$ -// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr) +// Author: Yves Lafon <ylafon@w3.org> // -// (c) COPYRIGHT MIT and INRIA, 1997. +// (c) COPYRIGHT MIT, ERCIM and Keio University, 2012. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.css.properties.css1; -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.CssExpression; import org.w3c.css.values.CssIdent; +import org.w3c.css.values.CssTypes; +import org.w3c.css.values.CssValue; /** - * <H4> - * 'font-variant' - * </H4> - * <P> - * <EM>Value:</EM> normal | small-caps<BR> - * <EM>Initial:</EM> normal<BR> - * <EM>Applies to:</EM> all elements<BR> - * <EM>Inherited:</EM> yes<BR> - * <EM>Percentage values:</EM> N/A<BR> - * <P> Another type of variation within a font family is the small-caps. In a - * small-caps font the lower case letters look similar to the uppercase ones, - * but in a smaller size and with slightly different proportions. The - * 'font-variant' property selects that font. - * <P> A value of 'normal' selects a font that is not a small-caps font, - * 'small-caps' selects a small-caps font. It is acceptable (but not required) - * in CSS1 if the small-caps font is a created by taking a normal font and - * replacing the lower case letters by scaled uppercase characters. As a last - * resort, uppercase letters will be used as replacement for a small-caps - * font. - * <P> The following example results in an 'H3' element in small-caps, with - * emphasized words in oblique small-caps: - * <PRE> - * H3 { font-variant: small-caps } - * EM { font-style: oblique } - * </PRE> - * <P> There may be other variants in the font family as well, such as fonts - * with old-style numerals, small-caps numerals, condensed or expanded - * letters, etc. CSS1 has no properties that select those. - * <P> <EM>CSS1 core:</EM> insofar as this property causes text to be - * transformed to uppercase, the same considerations as for 'text-transform' - * apply - * - * @see CssFont - * @see TextTransform - * @version $Revision$ + * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#font-variant */ -public class CssFontVariant extends CssProperty implements CssFontConstant { - - int value; - - /** - * Create a new CssFontVariant - */ - public CssFontVariant() { - // nothing to do - } - - /** - * Creates a new CssFontVariant - * - * @param expression the font variant - * @exception InvalidParamException Values are incorrect - */ - public CssFontVariant(ApplContext ac, CssExpression expression, - boolean check) - throws InvalidParamException { +public class CssFontVariant extends org.w3c.css.properties.css.CssFontVariant { - if(check && expression.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); - } + public static final CssIdent normal = CssIdent.getIdent("normal"); + public static final CssIdent smallCaps = CssIdent.getIdent("small-caps"); - setByUser(); - if (expression.getValue() instanceof CssIdent) { - int hash = expression.getValue().hashCode(); - for (int i=0; i<hash_values.length; i++) - if (hash_values[i] == hash) { - value = i; - expression.next(); - return; + public static final CssIdent getAllowedFontVariant(CssIdent ident) { + if (smallCaps.equals(ident)) { + return smallCaps; } + if (normal.equals(ident)) { + return normal; + } + return null; } - throw new InvalidParamException("value", expression.getValue(), - getPropertyName(), ac); - } - - public CssFontVariant(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } - - /** - * Returns the current value - */ - public Object get() { - return FONTVARIANT[value]; - } - - /** - * Returns true if this property is "softly" inherited - * e.g. his value equals inherit - */ - public boolean isSoftlyInherited() { - return value == FONTVARIANT.length - 1; - } - - /** - * Returns a string representation of the object. - */ - public String toString() { - return FONTVARIANT[value]; - } + /** + * Creates a new CssFontVariant + * + * @param expression The expression for this property + * @throws org.w3c.css.util.InvalidParamException + * Expressions are incorrect + */ + public CssFontVariant(ApplContext ac, CssExpression expression, boolean check) + throws InvalidParamException { + if (check && expression.getCount() > 1) { + throw new InvalidParamException("unrecognize", ac); + } + setByUser(); - /** - * Returns the name of this property - */ - public String getPropertyName() { - return "font-variant"; - } + CssValue val; + char op; - /** - * Add this property to the CssStyle. - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - CssFont cssFont = ((Css1Style) style).cssFont; - if (cssFont.fontVariant != null) - style.addRedefinitionWarning(ac, this); - cssFont.fontVariant = this; - } + val = expression.getValue(); + op = expression.getOperator(); - /** - * 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).getFontVariant(); - } else { - return ((Css1Style) style).cssFont.fontVariant; + if (val.getType() == CssTypes.CSS_IDENT) { + CssIdent ident = (CssIdent) val; + if (smallCaps.equals(ident)) { + value = smallCaps; + } else if (normal.equals(ident)) { + value = normal; + } else { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + } else { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + expression.next(); } - } - - /** - * Compares two properties for equality. - * - * @param value The other property. - */ - public boolean equals(CssProperty property) { - return (property instanceof CssFontVariant && - ((CssFontVariant) property).value == value); - } - - /** - * 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 value == 0; - } - private static int[] hash_values; + public CssFontVariant(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); + } - static { - hash_values = new int[FONTVARIANT.length]; - for (int i=0;i<FONTVARIANT.length;i++) - hash_values[i] = FONTVARIANT[i].hashCode(); - } + public CssFontVariant() { + } } + Index: CssFontStyle.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssFontStyle.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- CssFontStyle.java 5 Jan 2010 13:49:43 -0000 1.4 +++ CssFontStyle.java 4 Aug 2012 21:17:05 -0000 1.5 @@ -1,172 +1,81 @@ -// // $Id$ -// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr) +// Author: Yves Lafon <ylafon@w3.org> // -// (c) COPYRIGHT MIT and INRIA, 1997. +// (c) COPYRIGHT MIT, ERCIM and Keio University, 2012. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.css.properties.css1; -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.CssExpression; import org.w3c.css.values.CssIdent; +import org.w3c.css.values.CssTypes; +import org.w3c.css.values.CssValue; + +import java.util.ArrayList; /** - * <H4> - * 'font-style' - * </H4> - * <P> - * <EM>Value:</EM> normal | italic | oblique<BR> - * <EM>Initial:</EM> normal<BR> - * <EM>Applies to:</EM> all elements<BR> - * <EM>Inherited:</EM> yes<BR> - * <EM>Percentage values:</EM> N/A<BR> - * <P> The 'font-style' property selects between normal (sometimes referred to - * as "roman" or "upright"), italic and oblique faces within a font family. - * <P> A value of 'normal' selects a font that is classified as 'normal' in - * the UA's font database, while 'oblique' selects a font that is labeled - * 'oblique'. A value of 'italic' selects a font that is labeled 'italic', - * or, if that is not available, one labeled 'oblique'. - * <P> The font that is labeled 'oblique' in the UA's font database may - * actually have been generated by electronically slanting a normal font. - * <P> Fonts with Oblique, Slanted or Incline in their names will typically be - * labeled 'oblique' in the UA's font database. Fonts with <EM>Italic, - * Cursive</EM> or <EM>Kursiv</EM> in their names will typically be labeled - * 'italic'. - * <PRE> - * H1, H2, H3 { font-style: italic } - * H1 EM { font-style: normal } - * </PRE> - * <P> - * In the example above, emphasized text within 'H1' will appear in a normal - * face. - * - * @version $Revision$ + * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#font-style */ -public class CssFontStyle extends CssProperty implements CssFontConstant { - - int value; - - /** - * Create a new CssFontStyle - */ - public CssFontStyle() { - // nothing to do - } - - /** - * Creates a new CssFontStyle - * - * @param expression the font style - * @exception InvalidParamException values are incorrect - */ - public CssFontStyle(ApplContext ac, CssExpression expression, - boolean check) throws InvalidParamException { +public class CssFontStyle extends org.w3c.css.properties.css.CssFontStyle { - if(check && expression.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); - } + static final String[] _allowed_values = {"italic", "normal", "oblique"}; + static final ArrayList<CssIdent> allowed_values; - setByUser(); - if (expression.getValue() instanceof CssIdent) { - int hash = ((CssIdent) expression.getValue()).hashCode(); - for (int i=0; i<hash_values.length; i++) - if (hash_values[i] == hash) { - value = i; - expression.next(); - return; + static { + allowed_values = new ArrayList<CssIdent>(3); + for (String s : _allowed_values) { + allowed_values.add(CssIdent.getIdent(s)); } } - throw new InvalidParamException("value", expression.getValue(), - getPropertyName(), ac); - } - - public CssFontStyle(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } - - /** - * Returns the current value - */ - public Object get() { - return FONTSTYLE[value]; - } - - /** - * Returns true if this property is "softly" inherited - * e.g. his value equals inherit - */ - public boolean isSoftlyInherited() { - return value == FONTSTYLE.length - 1; - } + /** + * Create a new CssFontStyle + */ + public CssFontStyle() { + } - /** - * Returns a string representation of the object. - */ - public String toString() { - return FONTSTYLE[value]; - } + /** + * Creates a new CssFontStyle + * + * @param expression The expression for this property + * @throws org.w3c.css.util.InvalidParamException + * Expressions are incorrect + */ + public CssFontStyle(ApplContext ac, CssExpression expression, boolean check) + throws InvalidParamException { + if (check && expression.getCount() > 1) { + throw new InvalidParamException("unrecognize", ac); + } + setByUser(); - /** - * Returns the name of this property - */ - public String getPropertyName() { - return "font-style"; - } + CssValue val; + char op; - /** - * Add this property to the CssStyle. - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - CssFont cssFont = ((Css1Style) style).cssFont; - if (cssFont.fontStyle != null) - style.addRedefinitionWarning(ac, this); - cssFont.fontStyle = this; - } + val = expression.getValue(); + op = expression.getOperator(); - /** - * 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).getFontStyle(); - } else { - return ((Css1Style) style).cssFont.fontStyle; + if (val.getType() == CssTypes.CSS_IDENT) { + CssIdent ident = (CssIdent) val; + int pos = allowed_values.indexOf(ident); + if (pos < 0) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + value = allowed_values.get(pos); + } else { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + expression.next(); } - } - - /** - * Compares two properties for equality. - * - * @param value The other property. - */ - public boolean equals(CssProperty property) { - return (property instanceof CssFontStyle && - ((CssFontStyle) property).value == value); - } - /** - * 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 value == 0; - } - - private static int[] hash_values; + public CssFontStyle(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); + } - static { - hash_values = new int[FONTSTYLE.length]; - for (int i=0; i<FONTSTYLE.length; i++) - hash_values[i] = FONTSTYLE[i].hashCode(); - } } + Index: Css1Style.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/Css1Style.java,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- Css1Style.java 25 Apr 2012 20:21:55 -0000 1.26 +++ Css1Style.java 4 Aug 2012 21:17:05 -0000 1.27 @@ -31,14 +31,8 @@ /** * Font properties */ - public CssFont cssFont = new CssFont(); - public CssFontCSS2 cssFontCSS2 = new CssFontCSS2(); - public CssFontCSS1 cssFontCSS1 = new CssFontCSS1(); - public CssFontStretch cssFontStretch; - public CssFontStretchCSS2 cssFontStretchCSS2; - public CssFontStretchCSS1 cssFontStretchCSS1; - public CssFontSizeAdjust cssFontSizeAdjust; - public CssFontSizeAdjustCSS2 cssFontSizeAdjustCSS2; + public org.w3c.css.properties.css.CssFont cssFont = new org.w3c.css.properties.css.CssFont(); + /* Color and Background properties */ /** @@ -278,210 +272,71 @@ /** * Get the font-style property */ - public final CssFontStyle getFontStyle() { + public final org.w3c.css.properties.css.CssFontStyle getFontStyle() { if (cssFont.fontStyle == null) { cssFont.fontStyle = - (CssFontStyle) style.CascadingOrder(new CssFontStyle(), + (org.w3c.css.properties.css.CssFontStyle) style.CascadingOrder(new org.w3c.css.properties.css.CssFontStyle(), style, selector); } return cssFont.fontStyle; } - public final CssFontStyleCSS2 getFontStyleCSS2() { - if (cssFontCSS2.fontStyle == null) { - cssFontCSS2.fontStyle = - (CssFontStyleCSS2) style.CascadingOrder(new CssFontStyleCSS2(), - style, selector); - } - return cssFontCSS2.fontStyle; - } - - public final CssFontStyleCSS1 getFontStyleCSS1() { - if (cssFontCSS1.fontStyle == null) { - cssFontCSS1.fontStyle = - (CssFontStyleCSS1) style.CascadingOrder(new CssFontStyleCSS1(), - style, selector); - } - return cssFontCSS1.fontStyle; - } - /** * Get the font-variant property */ - public final CssFontVariant getFontVariant() { + public final org.w3c.css.properties.css.CssFontVariant getFontVariant() { if (cssFont.fontVariant == null) { cssFont.fontVariant = - (CssFontVariant) style.CascadingOrder(new CssFontVariant(), + (org.w3c.css.properties.css.CssFontVariant) style.CascadingOrder(new org.w3c.css.properties.css.CssFontVariant(), style, selector); } return cssFont.fontVariant; } - public final CssFontVariantCSS2 getFontVariantCSS2() { - if (cssFontCSS2.fontVariant == null) { - cssFontCSS2.fontVariant = - (CssFontVariantCSS2) style.CascadingOrder(new CssFontVariantCSS2(), - style, selector); - } - return cssFontCSS2.fontVariant; - } - public final CssFontVariantCSS1 getFontVariantCSS1() { - if (cssFontCSS1.fontVariant == null) { - cssFontCSS1.fontVariant = - (CssFontVariantCSS1) style.CascadingOrder(new CssFontVariantCSS1(), - style, selector); - } - return cssFontCSS1.fontVariant; - } /** * Get the font-weight property */ - public final CssFontWeightCSS2 getFontWeightCSS2() { - if (cssFontCSS2.fontWeight == null) { - cssFontCSS2.fontWeight = - (CssFontWeightCSS2) style.CascadingOrder(new CssFontWeightCSS2(), - style, selector); - } - return cssFontCSS2.fontWeight; - } - - public final CssFontWeight getFontWeight() { + public final org.w3c.css.properties.css.CssFontWeight getFontWeight() { if (cssFont.fontWeight == null) { cssFont.fontWeight = - (CssFontWeight) style.CascadingOrder(new CssFontWeight(), + (org.w3c.css.properties.css.CssFontWeight) style.CascadingOrder(new org.w3c.css.properties.css.CssFontWeight(), style, selector); } return cssFont.fontWeight; } - public final CssFontWeightCSS1 getFontWeightCSS1() { - if (cssFontCSS1.fontWeight == null) { - cssFontCSS1.fontWeight = - (CssFontWeightCSS1) style.CascadingOrder(new CssFontWeightCSS1(), - style, selector); - } - return cssFontCSS1.fontWeight; - } - - /** - * Get the font-stretch property - */ - public final CssFontStretch getFontStretch() { - if (cssFontStretch == null) { - cssFontStretch = - (CssFontStretch) style.CascadingOrder(new CssFontStretch(), - style, selector); - } - return cssFontStretch; - } - - public final CssFontStretchCSS2 getFontStretchCSS2() { - if (cssFontStretchCSS2 == null) { - cssFontStretchCSS2 = - (CssFontStretchCSS2) style.CascadingOrder(new CssFontStretchCSS2(), - style, selector); - } - return cssFontStretchCSS2; - } - - public final CssFontStretchCSS1 getFontStretchCSS1() { - if (cssFontStretchCSS1 == null) { - cssFontStretchCSS1 = - (CssFontStretchCSS1) style.CascadingOrder(new CssFontStretchCSS1(), - style, selector); - } - return cssFontStretchCSS1; - } /** * Get the font-size property */ - public final CssFontSizeCSS2 getFontSizeCSS2() { - if (cssFontCSS2.fontSize == null) { - cssFontCSS2.fontSize = - (CssFontSizeCSS2) style.CascadingOrder(new CssFontSizeCSS2(), - style, selector); - } - return cssFontCSS2.fontSize; - } - public final CssFontSize getFontSize() { + public final org.w3c.css.properties.css.CssFontSize getFontSize() { if (cssFont.fontSize == null) { cssFont.fontSize = - (CssFontSize) style.CascadingOrder(new CssFontSize(), + (org.w3c.css.properties.css.CssFontSize) style.CascadingOrder(new org.w3c.css.properties.css.CssFontSize(), style, selector); } return cssFont.fontSize; } - public final CssFontSizeCSS1 getFontSizeCSS1() { - if (cssFontCSS1.fontSize == null) { - cssFontCSS1.fontSize = - (CssFontSizeCSS1) style.CascadingOrder(new CssFontSizeCSS1(), - style, selector); - } - return cssFontCSS1.fontSize; - } - - /** - * Get the font-size-adjust property - */ - public final CssFontSizeAdjustCSS2 getFontSizeAdjustCSS2() { - if (cssFontSizeAdjustCSS2 == null) { - cssFontSizeAdjustCSS2 = - (CssFontSizeAdjustCSS2) style.CascadingOrder( - new CssFontSizeAdjustCSS2(), - style, selector); - } - return cssFontSizeAdjustCSS2; - } - - public final CssFontSizeAdjust getFontSizeAdjust() { - if (cssFontSizeAdjust == null) { - cssFontSizeAdjust = - (CssFontSizeAdjust) style.CascadingOrder( - new CssFontSizeAdjust(), - style, selector); - } - return cssFontSizeAdjust; - } - /** * Get the font-family property */ - public final CssFontFamily getFontFamily() { + public final org.w3c.css.properties.css.CssFontFamily getFontFamily() { if (cssFont.fontFamily == null) { cssFont.fontFamily = - (CssFontFamily) style.CascadingOrder(new CssFontFamily(), + (org.w3c.css.properties.css.CssFontFamily) style.CascadingOrder(new org.w3c.css.properties.css.CssFontFamily(), style, selector); } return cssFont.fontFamily; } - public final CssFontFamilyCSS2 getFontFamilyCSS2() { - if (cssFontCSS2.fontFamily == null) { - cssFontCSS2.fontFamily = - (CssFontFamilyCSS2) style.CascadingOrder(new CssFontFamilyCSS2(), - style, selector); - } - return cssFontCSS2.fontFamily; - } - - public final CssFontFamilyCSS1 getFontFamilyCSS1() { - if (cssFontCSS1.fontFamily == null) { - cssFontCSS1.fontFamily = - (CssFontFamilyCSS1) style.CascadingOrder(new CssFontFamilyCSS1(), - style, selector); - } - return cssFontCSS1.fontFamily; - } - /** * Get the font property */ - public final CssFont getFont() { + public final org.w3c.css.properties.css.CssFont getFont() { if (cssFont.value != null) { // nothing } else { @@ -507,57 +362,6 @@ return cssFont; } - public final CssFontCSS2 getFontCSS2() { - if (cssFontCSS2.value != null) { - // nothing - } else { - if (cssFontCSS2.fontStyle == null) { - cssFontCSS2.fontStyle = getFontStyleCSS2(); - } - if (cssFontCSS2.fontVariant == null) { - cssFontCSS2.fontVariant = getFontVariantCSS2(); - } - if (cssFontCSS2.fontWeight == null) { - cssFontCSS2.fontWeight = getFontWeightCSS2(); - } - if (cssFontCSS2.fontSize == null) { - cssFontCSS2.fontSize = getFontSizeCSS2(); - } - if (cssFontCSS2.lineHeight == null) { - cssFontCSS2.lineHeight = getLineHeightCSS2(); - } - if (cssFontCSS2.fontFamily == null) { - cssFontCSS2.fontFamily = getFontFamilyCSS2(); - } - } - return cssFontCSS2; - } - - public final CssFontCSS1 getFontCSS1() { - if (cssFontCSS1.value != null) { - // nothing - } else { - if (cssFontCSS1.fontStyle == null) { - cssFontCSS1.fontStyle = getFontStyleCSS1(); - } - if (cssFontCSS1.fontVariant == null) { - cssFontCSS1.fontVariant = getFontVariantCSS1(); - } - if (cssFontCSS1.fontWeight == null) { - cssFontCSS1.fontWeight = getFontWeightCSS1(); - } - if (cssFontCSS1.fontSize == null) { - cssFontCSS1.fontSize = getFontSizeCSS1(); - } - if (cssFontCSS1.lineHeight == null) { - cssFontCSS1.lineHeight = getLineHeightCSS1(); - } - if (cssFontCSS1.fontFamily == null) { - cssFontCSS1.fontFamily = getFontFamilyCSS1(); - } - } - return cssFontCSS1; - } /* * Color and Background properties @@ -883,33 +687,15 @@ /** * Get the line-height property */ - public final CssLineHeight getLineHeight() { + public final org.w3c.css.properties.css.CssLineHeight getLineHeight() { if (cssFont.lineHeight == null) { cssFont.lineHeight = - (CssLineHeight) style.CascadingOrder(new CssLineHeight(), + (org.w3c.css.properties.css.CssLineHeight) style.CascadingOrder(new CssLineHeight(), style, selector); } return cssFont.lineHeight; } - public final CssLineHeightCSS2 getLineHeightCSS2() { - if (cssFontCSS2.lineHeight == null) { - cssFontCSS2.lineHeight = - (CssLineHeightCSS2) style.CascadingOrder(new CssLineHeightCSS2(), - style, selector); - } - return cssFontCSS2.lineHeight; - } - - public final CssLineHeightCSS1 getLineHeightCSS1() { - if (cssFontCSS1.lineHeight == null) { - cssFontCSS1.lineHeight = - (CssLineHeightCSS1) style.CascadingOrder(new CssLineHeightCSS1(), - style, selector); - } - return cssFontCSS1.lineHeight; - } - /* * Box properties */ @@ -1690,40 +1476,11 @@ private void findConflictsFontFamily(ApplContext ac, Warnings warnings, CssSelectors selector, CssSelectors[] allSelectors) { - // first CSS2 (the default) - if (cssFontCSS2.fontFamily != null) { - if (!cssFontCSS2.fontFamily.containsGenericFamily()) { - warnings.addWarning(new Warning(cssFontCSS2.fontFamily, - "no-generic-family", 2, ac)); - } - if (cssFontCSS2.fontFamily.withSpace) { - warnings.addWarning(new Warning(cssFontCSS2.fontFamily, - "with-space", 1, ac)); - } - return; - } - // CSS 3 if (cssFont.fontFamily != null) { - if (!cssFont.fontFamily.containsGenericFamily()) { + if (!cssFont.fontFamily.hasGenericFamily()) { warnings.addWarning(new Warning(cssFont.fontFamily, "no-generic-family", 2, ac)); } - if (cssFont.fontFamily.withSpace) { - warnings.addWarning(new Warning(cssFont.fontFamily, - "with-space", 1, ac)); - } - return; - } - // CSS1 - if (cssFontCSS1.fontFamily != null) { - if (!cssFontCSS1.fontFamily.containsGenericFamily()) { - warnings.addWarning(new Warning(cssFontCSS1.fontFamily, - "no-generic-family", 2, ac)); - } - if (cssFontCSS1.fontFamily.withSpace) { - warnings.addWarning(new Warning(cssFontCSS1.fontFamily, - "with-space", 1, ac)); - } } } Index: CssLineHeight.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssLineHeight.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- CssLineHeight.java 5 Jan 2010 13:49:43 -0000 1.5 +++ CssLineHeight.java 4 Aug 2012 21:17:05 -0000 1.6 @@ -1,13 +1,10 @@ -// // $Id$ -// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr) +// Author: Yves Lafon <ylafon@w3.org> // -// (c) COPYRIGHT MIT and INRIA, 1997. +// (c) COPYRIGHT MIT, ERCIM and Keio University, 2012. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.css.properties.css1; -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.CssExpression; @@ -15,187 +12,82 @@ import org.w3c.css.values.CssLength; import org.w3c.css.values.CssNumber; import org.w3c.css.values.CssPercentage; +import org.w3c.css.values.CssTypes; import org.w3c.css.values.CssValue; /** - * <H4> - * 'line-height' - * </H4> - * <P> - * <EM>Value:</EM> normal | <number> | <length> | - * <percentage><BR> - * <EM>Initial:</EM> normal<BR> - * <EM>Applies to:</EM> all elements<BR> - * <EM>Inherited:</EM> yes<BR> - * <EM>Percentage values:</EM> relative to the font size of the element itself<BR> - * <P> - * The property sets the distance between two adjacent lines' baselines. - * <P> When a numerical value is specified, the line height is given by the - * font size of the current element multiplied with the numerical value. This - * differs from a percentage value in the way it inherits: when a numerical - * value is specified, child elements will inherit the factor itself, not the - * resultant value (as is the case with <A - * HREF="#percentage-units">percentage</A> and other units). - * <P> - * Negative values are not allowed. - * <P> - * The three rules in the example below have the same resultant line height: - * <PRE> - * DIV { line-height: 1.2; font-size: 10pt } /* number * / - * DIV { line-height: 1.2em; font-size: 10pt } /* length * / - * DIV { line-height: 120%; font-size: 10pt } /* percentage * / - * </PRE> - * - * @version $Revision$ + * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#line-height */ -public class CssLineHeight extends CssProperty { - - - private CssValue value; - private static CssIdent normal = new CssIdent("normal"); - private static CssIdent number = new CssIdent("number"); - private static CssIdent none = new CssIdent("none"); - private static CssIdent initial = new CssIdent("initial"); - - /** - * Create a new CssLineHeight - */ - public CssLineHeight() { - value = normal; - } +public class CssLineHeight extends org.w3c.css.properties.css.CssLineHeight { - /** - * Creates a new CssLineHeight - * - * @param expression The expression for this property - * @exception InvalidParamException The expression is incorrect - */ - public CssLineHeight(ApplContext ac, CssExpression expression, - boolean check) throws InvalidParamException { + public static final CssIdent normal = CssIdent.getIdent("normal"); - if(check && expression.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); + /** + * Create a new CssLineHeight + */ + public CssLineHeight() { } - CssValue val = expression.getValue(); - - setByUser(); + /** + * Creates a new CssLineHeight + * + * @param expression The expression for this property + * @throws org.w3c.css.util.InvalidParamException + * Expressions are incorrect + */ + public CssLineHeight(ApplContext ac, CssExpression expression, boolean check) + throws InvalidParamException { + if (check && expression.getCount() > 1) { + throw new InvalidParamException("unrecognize", ac); + } + setByUser(); + CssValue val = expression.getValue(); - if (val instanceof CssNumber || val instanceof CssLength || - val instanceof CssPercentage) { - float v = ((Number) val.get()).floatValue(); - if (v >= 0) { - value = val; - expression.next(); - return; - } else { - throw new InvalidParamException("negative-value", - Float.toString(v), ac); - } - } else if (inherit.equals(val)) { - value = inherit; - expression.next(); - return; - } else if (normal.equals(val)) { - value = normal; - expression.next(); - return; - } else if (number.equals(val)) { - value = number; - expression.next(); - return; - } else if (none.equals(val)) { - value = none; - expression.next(); - return; - } else if (initial.equals(val)) { - value = initial; + switch (val.getType()) { + case CssTypes.CSS_IDENT: + if (normal.equals(val)) { + value = normal; + } else { + throw new InvalidParamException("value", val.toString(), + getPropertyName(), ac); + } + break; + case CssTypes.CSS_LENGTH: + CssLength length = (CssLength) val; + if (!length.isPositive()) { + throw new InvalidParamException("negative-value", + val.toString(), ac); + } + value = val; + break; + case CssTypes.CSS_NUMBER: + CssNumber number = (CssNumber) val; + if (!number.isPositive()) { + throw new InvalidParamException("negative-value", + val.toString(), ac); + } + value = val; + break; + case CssTypes.CSS_PERCENTAGE: + CssPercentage percent = (CssPercentage) val; + if (!percent.isPositive()) { + throw new InvalidParamException("negative-value", + val.toString(), ac); + } + value = val; + break; + default: + throw new InvalidParamException("value", val.toString(), + getPropertyName(), ac); + } expression.next(); - return; } - throw new InvalidParamException("value", expression.getValue(), - getPropertyName(), ac); - } - - public CssLineHeight(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } - - /** - * Returns the value of this property - */ - public Object get() { - if (value == null) - return normal; - return value; - } - - /** - * Returns the name of this property - */ - public String getPropertyName() { - return "line-height"; - } - - /** - * Returns true if this property is "softly" inherited - * e.g. his value equals inherit - */ - public boolean isSoftlyInherited() { - return value == inherit; - } - - /** - * Returns a string representation of the object. - */ - public String toString() { - return value.toString(); - } - - /** - * Add this property to the CssStyle. - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - CssFont cssFont = ((Css1Style) style).cssFont; - if (cssFont.lineHeight != null) - style.addRedefinitionWarning(ac, this); - cssFont.lineHeight = 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 ((Css1Style) style).getLineHeight(); - } else { - return ((Css1Style) style).cssFont.lineHeight; + public CssLineHeight(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); } - } - /** - * Compares two properties for equality. - * - * @param value The other property. - */ - public boolean equals(CssProperty property) { - return (property instanceof CssLineHeight && - ((CssLineHeight) property).value == value); - } - - /** - * 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 value == normal; - } } + Index: CssFontSize.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssFontSize.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- CssFontSize.java 5 Jan 2010 13:49:43 -0000 1.4 +++ CssFontSize.java 4 Aug 2012 21:17:05 -0000 1.5 @@ -1,14 +1,10 @@ -// // $Id$ -// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr) +// Author: Yves Lafon <ylafon@w3.org> // -// (c) COPYRIGHT MIT and INRIA, 1997. +// (c) COPYRIGHT MIT, ERCIM and Keio University, 2012. // Please first read the full copyright statement in file COPYRIGHT.html - package org.w3c.css.properties.css1; -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.CssExpression; @@ -16,220 +12,95 @@ import org.w3c.css.values.CssLength; import org.w3c.css.values.CssNumber; import org.w3c.css.values.CssPercentage; +import org.w3c.css.values.CssTypes; import org.w3c.css.values.CssValue; +import java.util.HashMap; /** - * <H4> - * 'font-size' - * </H4> - * <P> - * <EM>Value:</EM> <absolute-size> | <relative-size> | - * <length> | <percentage><BR> - * <EM>Initial:</EM> medium<BR> - * <EM>Applies to:</EM> all elements<BR> - * <EM>Inherited:</EM> yes<BR> - * <EM>Percentage values:</EM> relative to parent element's font size<BR> - * <DL> - * <DT> - * <B><absolute-size></B> - * <DD> An <absolute-size> keyword is an index to a table of font - * sizes computed and kept by the UA. Possible values are: [ xx-small | - * x-small | small | medium | large | x-large | xx-large ]. On a computer - * screen a scaling factor of 1.5 is suggested between adjacent indexes; if - * the 'medium' font is 10pt, the 'large' font could be 15pt. Different - * media may need different scaling factors. Also, the UA should take the - * quality and availability of fonts into account when computing the - * table. The table may be different from one font family to another. - * <DT> - * <B><relative-size></B> - * <DD> A <relative-size> keyword is interpreted relative to the table - * of font sizes and the font size of the parent element. Possible values - * are: [ larger | smaller ]. For example, if the parent element has a font - * size of 'medium', a value of 'larger' will make the font size of the - * current element be 'large'. If the parent element's size is not close to - * a table entry, the UA is free to interpolate between table entries or - * round off to the closest one. The UA may have to extrapolate table values - * if the numerical value goes beyond the keywords. - * </DL> - * <P> Length and percentage values should not take the font size table into - * account when calculating the font size of the element. - * <P> Negative values are not allowed. - * <P> On all other properties, 'em' and 'ex' length values refer to the font - * size of the current element. On the 'font-size' property, these length - * units refer to the font size of the parent element. - * <P> - * Note that an application may reinterpret an explicit size, depending on the - * context. E.g., inside a VR scene a font may get a different size because - * of perspective distortion. - * <P> - * Examples: - * <PRE> - * P { font-size: 12pt; } - * BLOCKQUOTE { font-size: larger } - * EM { font-size: 150% } - * EM { font-size: 1.5em } - * </PRE> - * <P> - * If the suggested scaling factor of 1.5 is used, the last three declarations - * are identical. - * @version $Revision$ + * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#font-size */ -public class CssFontSize extends CssProperty implements CssFontConstant { - - int value; - CssValue cssValue; - - /** - * Create a new FontSize - */ - public CssFontSize() { - value = 3; // default value is medium - } - - /** - * Creates a new CssFontSize - * - * @param expression the expression of the size - * @exception InvalidParamException The expression is incorrect - */ - public CssFontSize(ApplContext ac, CssExpression expression, - boolean check) throws InvalidParamException { +public class CssFontSize extends org.w3c.css.properties.css.CssFontSize { - if(check && expression.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); - } + public static final HashMap<String,CssIdent> allowed_values; + static final String[] absolute_values = {"xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large"}; + static final String[] relative_values = {"smaller", "larger"}; - CssValue val = expression.getValue(); - setByUser(); - if (val instanceof CssIdent) { - int hash = val.hashCode(); - for (int i=0; i<hash_values.length; i++) { - if (hash_values[i] == hash) { - value = i; - cssValue = null; - expression.next(); - return; + static { + allowed_values = new HashMap<String, CssIdent>(); + for (String s : absolute_values) { + allowed_values.put(s, CssIdent.getIdent(s)); + } + for (String s : relative_values) { + allowed_values.put(s, CssIdent.getIdent(s)); } - } - } else if (val instanceof CssPercentage) { - float num = ((Float) val.get()).floatValue(); - if (num < 0) { - throw new InvalidParamException("negative-value", - val.toString(), ac); - } - this.cssValue = val; - expression.next(); - return; - } else if (val instanceof CssNumber) { - CssValue length = ((CssNumber) val).getLength(); - if (length != null) { - cssValue = length; - expression.next(); - return; - } - } else if (val instanceof CssLength) { - float f = ((Float) val.get()).floatValue(); - if (f >= 0) { - cssValue = val; - expression.next(); - return; - } else { - throw new InvalidParamException("negative-value", - val.toString(), ac); - } + } + /** + * Create a new CssFontSize + */ + public CssFontSize() { } - throw new InvalidParamException("value", - val, getPropertyName(), ac); - } - - public CssFontSize(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } - - /** - * Returns the current value - */ - public Object get() { - if (cssValue != null) - return cssValue; - else - return FONTSIZE[value]; - } - - /** - * Returns true if this property is "softly" inherited - * e.g. his value equals inherit - */ - public boolean isSoftlyInherited() { - return value == FONTSIZE.length - 1; - } - - /** - * Returns a string representation of the object. - */ - public String toString() { - if (cssValue != null) - return cssValue.toString(); - else - return FONTSIZE[value]; - } - + /** + * Creates a new CssFontSize + * + * @param expression The expression for this property + * @throws org.w3c.css.util.InvalidParamException + * Expressions are incorrect + */ + public CssFontSize(ApplContext ac, CssExpression expression, boolean check) + throws InvalidParamException { + if (check && expression.getCount() > 1) { + throw new InvalidParamException("unrecognize", ac); + } + setByUser(); - /** - * Returns the name of this property - */ - public String getPropertyName() { - return "font-size"; - } + CssValue val; + char op; - /** - * Add this property to the CssStyle. - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - CssFont cssFont = ((Css1Style) style).cssFont; - if (cssFont.fontSize != null) - style.addRedefinitionWarning(ac, this); - cssFont.fontSize = this; - } + val = expression.getValue(); + op = expression.getOperator(); - /** - * 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).getFontSize(); - } else { - return ((Css1Style) style).cssFont.fontSize; + switch (val.getType()) { + case CssTypes.CSS_NUMBER: + val = ((CssNumber)val).getLength(); + case CssTypes.CSS_LENGTH: + CssLength l = (CssLength) val; + if (!l.isPositive()) { + throw new InvalidParamException("negative-value", + val.toString(), ac); + } + value = l; + break; + case CssTypes.CSS_PERCENTAGE: + CssPercentage p = (CssPercentage) val; + if (!p.isPositive()) { + throw new InvalidParamException("negative-value", + val.toString(), ac); + } + value = p; + break; + case CssTypes.CSS_IDENT: + value = allowed_values.get(val.toString()); + if (value == null) { + throw new InvalidParamException("value", + expression.getValue().toString(), + getPropertyName(), ac); + } + break; + default: + throw new InvalidParamException("value", + expression.getValue().toString(), + getPropertyName(), ac); + } + expression.next(); } - } - /** - * Compares two properties for equality. - * - * @param value The other property. - */ - public boolean equals(CssProperty property) { - if (cssValue == null) - return (property instanceof CssFontSize && - ((CssFontSize) property).value == value); - else - return (property instanceof CssFontSize && - ((CssFontSize) property).cssValue.equals(cssValue)); - } + public CssFontSize(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); + } - private static int[] hash_values; - static { - hash_values = new int[FONTSIZE.length]; - for (int i=0; i<FONTSIZE.length; i++) - hash_values[i] = FONTSIZE[i].hashCode(); - } } + Index: CssFontWeight.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssFontWeight.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- CssFontWeight.java 26 Mar 2012 11:14:39 -0000 1.6 +++ CssFontWeight.java 4 Aug 2012 21:17:05 -0000 1.7 @@ -1,197 +1,95 @@ -// // $Id$ -// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr) +// Author: Yves Lafon <ylafon@w3.org> // -// (c) COPYRIGHT MIT and INRIA, 1997. +// (c) COPYRIGHT MIT, ERCIM and Keio University, 2012. // Please first read the full copyright statement in file COPYRIGHT.html package org.w3c.css.properties.css1; -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.*; +import org.w3c.css.values.CssExpression; +import org.w3c.css.values.CssIdent; +import org.w3c.css.values.CssNumber; +import org.w3c.css.values.CssTypes; +import org.w3c.css.values.CssValue; + +import java.util.HashMap; /** - * <H4> - * 'font-weight' - * </H4> - * <p/> - * <EM>Value:</EM> normal | bold | bolder | lighter | 100 | 200 | 300 | 400 - * | 500 | 600 | 700 | 800 | 900<BR> - * <EM>Initial:</EM> normal<BR> - * <EM>Applies to:</EM> all elements<BR> - * <EM>Inherited:</EM> yes<BR> - * <EM>Percentage values:</EM> N/A<BR> - * <P> The 'font-weight' property selects the weight of the font. The values - * '100' to '900' form an ordered sequence, where each number indicates a - * weight that is at least as dark as its predecessor. The keyword 'normal' is - * synonymous with '400', and 'bold' is synonymous with '700'. Keywords other - * than 'normal' and 'bold' have been shown to be often confused with font - * names and a numerical scale was therefore chosen for the 9-value list. - * <PRE> - * P { font-weight: normal } 400 - * H1 { font-weight: 700 } bold - * </PRE> - * <p/> - * The 'bolder' and 'lighter' values select font weights that are relative to - * the weight inherited from the parent: - * <PRE> - * STRONG { font-weight: bolder } - * </PRE> - * <p/> - * Child elements inherit the resultant weight, not the keyword value. - * <P> Fonts (the font data) typically have one or more properties whose - * values are names that are descriptive of the "weight" of a font. There is - * no accepted, universal meaning to these weight names. Their primary role is - * to distinguish faces of differing darkness within a single font - * family. Usage across font families is quite variant; for example a font - * that you might think of as being bold might be described as being - * <EM>Regular, Roman, Book, Medium, Semi-</EM> or <EM>DemiBold, Bold,</EM> or - * <EM>Black,</EM> depending on how black the "normal" face of the font is - * within the design. Because there is no standard usage of names, the weight - * property values in CSS1 are given on a numerical scale in which the value - * '400' (or 'normal') corresponds to the "normal" text face for that - * family. The weight name associated with that face will typically be - * <EM>Book, Regular, Roman, Normal</EM> or sometimes <EM>Medium</EM>. - * <p/> - * The association of other weights within a family to the numerical weight - * values is intended only to preserve the ordering of darkness within that - * family. However, the following heuristics tell how the assignment is done - * in typical cases: - * <UL> - * <LI> If the font family already uses a numerical scale with nine values - * (like e.g. <EM>OpenType</EM> does), the font weights should be mapped - * directly. - * <LI> If there is both a face labeled <EM>Medium</EM> and one labeled - * <EM>Book, Regular, Roman</EM> or <EM>Normal,</EM> then the - * <EM>Medium</EM> is normally assigned to the '500'. - * <LI> The font labeled "Bold" will often correspond to the weight value - * '700'. - * <LI> If there are fewer then 9 weights in the family, the default - * algorithm for filling the "holes" is as follows. If '500' is unassigned, - * it will be assigned the same font as '400'. If any of the values '600', - * '700', '800' or '900' remains unassigned, they are assigned to the same - * face as the next darker assigned keyword, if any, or the next lighter one - * otherwise. If any of '300', '200' or '100' remains unassigned, it is - * assigned to the next lighter assigned keyword, if any, or the next darker - * otherwise. - * </UL> - * <P> The following two examples illustrate the process. Assume four weights - * in the "Example1" family, from lightest to darkest: <EM>Regular, Medium, - * Bold, Heavy.</EM> And assume six weights in the "Example2" family: - * <EM>Book, Medium, Bold, Heavy, Black, ExtraBlack.</EM> Note how in the - * second example it has been decided <EM>not</EM> to assign "Example2 - * ExtraBlack" to anything. - * <PRE> - * Available faces | Assignments | Filling the holes - * ----------------------+---------------+------------------- - * "Example1 Regular" | 400 | 100, 200, 300 - * "Example1 Medium" | 500 | - * "Example1 Bold" | 700 | 600 - * "Example1 Heavy" | 800 | 900 - * </PRE> - * <PRE> - * Available faces | Assignments | Filling the holes - * ----------------------+---------------+------------------- - * "Example2 Book" | 400 | 100, 200, 300 - * "Example2 Medium" | 500 | - * "Example2 Bold" | 700 | 600 - * "Example2 Heavy" | 800 | - * "Example2 Black" | 900 | - * "Example2 ExtraBlack" | (none) | - * </PRE> - * <P> Since the intent of the relative keywords 'bolder' and 'lighter' is to - * darken or lighten the face <EM>within the family</EM> and because a family - * may not have faces aligned with all the symbolic weight values, the - * matching of 'bolder' is to the next darker face available on the client - * within the family and the matching of 'lighter' is to the next lighter face - * within the family. To be precise, the meaning of the relative keywords - * 'bolder' and 'lighter' is as follows: - * <UL> - * <LI> 'bolder' selects the next weight that is assigned to a font that is - * darker than the inherited one. If there is no such weight, it simply - * results in the next darker numerical value (and the font remains - * unchanged), unless the inherited value was '900' in which case the - * resulting weight is also '900'. - * <LI> 'lighter' is similar, but works in the opposite direction: it - * selects the next lighter keyword with a different font from the inherited - * one, unless there is no such font, in which case it selects the next - * lighter numerical value (and keeps the font unchanged). - * </UL> - * <P> There is no guarantee that there will be a darker face for each of the - * 'font-weight' values; for example, some fonts may have only a normal and a - * bold face, others may have eight different face weights. There is no - * guarantee on how a UA will map font faces within a family to weight - * values. The only guarantee is that a face of a given value will be no less - * dark than the faces of lighter values. - * - * @version $Revision$ + * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#font-weight */ -public class CssFontWeight extends CssProperty implements CssFontConstant { - - - /** - * an index in a array - * - * @see CssFontConstant#FONTWEIGHT - */ - protected int value; +public class CssFontWeight extends org.w3c.css.properties.css.CssFontWeight { - // internal hack to compare strings - private static int[] hash_values; + public static final HashMap<String,CssIdent> allowed_values; + static final String[] _allowed_values = {"normal", "bold", "bolder", "lighter"}; + static { + allowed_values = new HashMap<String, CssIdent>(_allowed_values.length); + for (String s : _allowed_values) { + allowed_values.put(s, CssIdent.getIdent(s)); + } + } /** - * Create a new FontWeight with the default value. + * Create a new CssFontWeight */ public CssFontWeight() { - // nothing to do } /** - * Creates a new CssFontWeight with an expression. + * Creates a new CssFontWeight * - * @param expr the expression - * @throws InvalidParamException values are incorrect + * @param expression The expression for this property + * @throws org.w3c.css.util.InvalidParamException + * Expressions are incorrect */ - public CssFontWeight(ApplContext ac, CssExpression expr, boolean check) + public CssFontWeight(ApplContext ac, CssExpression expression, boolean check) throws InvalidParamException { + if (check && expression.getCount() > 1) { + throw new InvalidParamException("unrecognize", ac); + } + setByUser(); - if (check && expr.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); - } - - CssValue val = expr.getValue(); + CssValue val; + char op; - setByUser(); + val = expression.getValue(); + op = expression.getOperator(); - switch (val.getType()) { - case CssTypes.CSS_IDENT: - int hash = expr.getValue().hashCode(); - // try to find the hashCode in my internal hack array - for (int i = 0; i < hash_values.length; i++) { - if (hash_values[i] == hash) { - this.value = i; - expr.next(); - return; - } - } - throw new InvalidParamException("value", expr.getValue().toString(), - getPropertyName(), ac); - case CssTypes.CSS_NUMBER: - CssNumber num = (CssNumber) val; - if (num.isInteger()) { - int vali = num.getInt(); - if (isCorrectWeight(vali)) { // verify the entire part number - this.value = vali; - break; - } - } - default: - throw new InvalidParamException("value", expr.getValue().toString(), - getPropertyName(), ac); - } - expr.next(); + switch (val.getType()) { + case CssTypes.CSS_NUMBER: + CssNumber num = (CssNumber) val; + switch(num.getInt()) { + case 100: + case 200: + case 300: + case 400: + case 500: + case 600: + case 700: + case 800: + case 900: + value = num; + break; + default: + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + break; + case CssTypes.CSS_IDENT: + value = allowed_values.get(val.toString()); + if (value == null) { + throw new InvalidParamException("value", + val.toString(), + getPropertyName(), ac); + } + break; + default: + throw new InvalidParamException("value", + expression.getValue().toString(), + getPropertyName(), ac); + } + expression.next(); } public CssFontWeight(ApplContext ac, CssExpression expression) @@ -199,95 +97,5 @@ this(ac, expression, false); } - /** - * Returns the current value. - */ - public Object get() { - if (value >= 100) - return new Integer(value); - else - return FONTWEIGHT[value]; - } - - - /** - * Returns true if this property is "softly" inherited - * e.g. his value equals inherit - */ - public boolean isSoftlyInherited() { - return value == FONTWEIGHT.length - 1; - } - - /** - * Returns a string representation of the object. - */ - public String toString() { - if (value >= 100) - return Integer.toString(value); - else - return FONTWEIGHT[value]; - } - - /** - * Returns the name of this property. - */ - public String getPropertyName() { - return "font-weight"; - } - - /** - * Add this property to the CssStyle - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - CssFont cssFont = ((Css1Style) style).cssFont; - if (cssFont.fontWeight != null) - style.addRedefinitionWarning(ac, this); - cssFont.fontWeight = 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 ((Css1Style) style).getFontWeight(); - } else { - return ((Css1Style) style).cssFont.fontWeight; - } - } - - /** - * Compares two properties for equality. - * - * @param value The other property. - */ - public boolean equals(CssProperty property) { - return (property instanceof CssFontWeight && - ((CssFontWeight) property).value == value); - } - - /** - * 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 value == 0; - } - - private boolean isCorrectWeight(int val) { - val = val / 100; - return val > 0 && val < 10; - } - - static { - hash_values = new int[FONTWEIGHT.length]; - for (int i = 0; i < FONTWEIGHT.length; i++) - hash_values[i] = FONTWEIGHT[i].hashCode(); - } } Index: CssFontFamily.java =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/properties/css1/CssFontFamily.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- CssFontFamily.java 5 Jan 2010 13:49:43 -0000 1.5 +++ CssFontFamily.java 4 Aug 2012 21:17:05 -0000 1.6 @@ -1,372 +1,204 @@ -// // $Id$ -// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr) +// Author: Yves Lafon <ylafon@w3.org> // -// (c) COPYRIGHT MIT and INRIA, 1997. +// (c) COPYRIGHT MIT, ERCIM and Keio University, 2012. // Please first read the full copyright statement in file COPYRIGHT.html - package org.w3c.css.properties.css1; -import java.util.Enumeration; -import java.util.Vector; - -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.util.Util; import org.w3c.css.values.CssExpression; import org.w3c.css.values.CssIdent; -import org.w3c.css.values.CssOperator; -import org.w3c.css.values.CssString; +import org.w3c.css.values.CssTypes; import org.w3c.css.values.CssValue; -/** - * <H4> - * 'font-family' - * </H4> - * <P> - * <EM>Value:</EM> [[<family-name> | <generic-family>],]* - * [<family-name> | <generic-family>]<BR> - * <EM>Initial:</EM> UA specific<BR> - * <EM>Applies to:</EM> all elements<BR> - * <EM>Inherited:</EM> yes<BR> - * <EM>Percentage values:</EM> N/A<BR> - * <P> - * The value is a prioritized list of font family names and/or generic family - * names. Unlike most other CSS1 properties, values are separated by a comma - * to indicate that they are alternatives: - * <PRE> - * BODY { font-family: gill, helvetica, sans-serif } - * </PRE> - * <P> - * There are two types of list values: - * <DL> - * <DT> - * <STRONG><family-name></STRONG> - * <DD> The name of a font family of choice. In the last example, "gill" and - * "helvetica" are font families. - * <DT> - * <STRONG><generic-family></STRONG> - * <DD> In the example above, the last value is a generic family name. The - * following generic families are defined: - * <UL> - * <LI> - * 'serif' (e.g. Times) - * <LI> - * 'sans-serif' (e.g. Helvetica) - * <LI> - * 'cursive' (e.g. Zapf-Chancery) - * <LI> - * 'fantasy' (e.g. Western) - * <LI> - * 'monospace' (e.g. Courier) - * </UL> - * <P> Style sheet designers are encouraged to offer a generic font family - * as a last alternative. - * </DL> - * <P> - * Font names containing whitespace should be quoted: - * <PRE> - * BODY { font-family: "new century schoolbook", serif } - * - * <BODY STYLE="font-family: 'My own font', fantasy"> - * </PRE> - * <P> - * If quoting is omitted, any whitespace characters before and after the font - * name are ignored and any sequence of whitespace characters inside the font - * name is converted to a single space. - * - * @see CssFont - * @version $Revision$ - */ -public class CssFontFamily extends CssProperty implements CssOperator { - - Vector family_name = new Vector(); - - boolean inheritedValue; - - CssIdent none = new CssIdent("none"); - CssValue fontfamily = null; - - static String[] genericFamily = { "serif", "sans-serif", "cursive", - "fantasy", "monospace" }; - - static int[] genericFamilyHash; - - boolean withSpace = false; - - /** - * Create a new CssFontFamily - */ - public CssFontFamily() { - } +import java.util.ArrayList; - /** - * Create a new CssFontFamily - * - * @param expression the font name - * @exception InvalidParamException The expression is incorrect - */ - public CssFontFamily(ApplContext ac, CssExpression expression, - boolean check) - throws InvalidParamException { +import static org.w3c.css.values.CssOperator.COMMA; +import static org.w3c.css.values.CssOperator.SPACE; - boolean manyValues = expression.getCount() > 1; +/** + * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#font-family + */ +public class CssFontFamily extends org.w3c.css.properties.css.CssFontFamily { - boolean family = true; - CssValue val = expression.getValue(); - char op; + public static final ArrayList<CssIdent> genericNames; + public static final ArrayList<CssIdent> reservedNames; - setByUser(); - //@@ and if name is already in the vector ? + public static final String[] _genericNames = { + "serif", + "sans-serif", + "cursive", + "fantasy", + "monospace"}; + public static final String[] _reservedNames = {"inherit", + "initial", "default" + }; - if (val.equals(inherit)) { - if(expression.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); - } - inheritedValue = true; - expression.next(); - return; - } else if (val.equals(none)) { - if(expression.getCount() > 1) { - throw new InvalidParamException("unrecognize", ac); - } - fontfamily = none; - expression.next(); - return; + static { + genericNames = new ArrayList<CssIdent>(); + for (String s : _genericNames) { + genericNames.add(CssIdent.getIdent(s)); + } + reservedNames = new ArrayList<CssIdent>(); + for (String s : _reservedNames) { + reservedNames.add(CssIdent.getIdent(s)); + } } - while (family) { - val = expression.getValue(); - op = expression.getOperator(); - - if(manyValues && val != null && val.equals(inherit)) { - throw new InvalidParamException("unrecognize", ac); - } - - if ((op != COMMA) && (op != SPACE)) { - throw new InvalidParamException("operator", - ((new Character(op)).toString()), - ac); - } - - if(val != null && val.equals(inherit)) { - throw new InvalidParamException("unrecognize", ac); - } + static CssIdent getGenericFontName(CssIdent ident) { + int pos = genericNames.indexOf(ident); + if (pos >= 0) { + return genericNames.get(pos); + } + return null; + } - if (val instanceof CssString) { - String familyName = null; - if (op == COMMA) { // "helvetica", "roman" - familyName = trimToOneSpace(val.toString()); - expression.next(); - } else { // "helvetica" CssValue - familyName = trimToOneSpace(val.toString()); - family = false; - expression.next(); + static CssIdent getReservedFontName(CssIdent ident) { + int pos = reservedNames.indexOf(ident); + if (pos >= 0) { + return reservedNames.get(pos); } - if (familyName.length() > 2) { - String tmp = familyName.substring(1, familyName.length()-1); - for (int i = 0; i < genericFamily.length; i++) { - if (genericFamily[i].equals(tmp)) { - throw new InvalidParamException("generic-family.quote", - genericFamily[i], - getPropertyName(), - ac); + return null; + } + + private void checkExpression(ApplContext ac, ArrayList<CssValue> curval, + ArrayList<CssIdent> values, boolean check) { + CssIdent val; + if (values.size() > 1) { + // create a value out of that. We could even create + // a CssString for the output (TODO ?) + StringBuilder sb = new StringBuilder(); + boolean addSpace = false; + for (CssIdent id : values) { + if (addSpace) { + sb.append(' '); + } else { + addSpace = true; + } + sb.append(id); } - } - } - family_name.addElement(familyName); - } else if (val instanceof CssIdent) { - if (op == COMMA) { - family_name.addElement(convertString(val.toString())); - expression.next(); + ac.getFrame().addWarning("with-space", 1); + val = new CssIdent(sb.toString()); } else { - CssValue next = expression.getNextValue(); - - if (next != null) { - CssIdent New = new CssIdent(val.get() + " " - + next.get()); - withSpace = true; - expression.remove(); - op = expression.getOperator(); - expression.remove(); - expression.insert(New); - expression.setCurrentOperator(op); - } else { - family_name.addElement(convertString(val.toString())); - expression.next(); - family = false; - } + val = values.get(0); + // could be done in the consistency check, but... + if (null != getGenericFontName(val)) { + hasGenericFontFamily = true; + } + if (inherit.equals(val)) { + val = inherit; + } } - } else - throw new InvalidParamException("value", expression.getValue(), - getPropertyName(), ac); - } - if(check && !expression.end()) { - throw new InvalidParamException("unrecognize", ac); + curval.add(val); } - // This looks like obsolete code: (no context, no level, and duplicate - // of a warning handled already in CSS1Style.java - // olivier 2006-12-13 - //if (!containsGenericFamily()) { - // ac.getFrame().addWarning("no-generic-family", "font-family"); - //} - } - public CssFontFamily(ApplContext ac, CssExpression expression) - throws InvalidParamException { - this(ac, expression, false); - } + // 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.equals(val)) { + throw new InvalidParamException("unrecognize", ac); + } + } + } + } - /** - * Returns all fonts name - */ - public Enumeration elements() { - return family_name.elements(); - } + /** + * Creates a new CssFontFamily + * + * @param expression The expression for this property + * @throws org.w3c.css.util.InvalidParamException + * Expressions are incorrect + */ + public CssFontFamily(ApplContext ac, CssExpression expression, boolean check) + throws InvalidParamException { - /** - * Returns the size - */ - public int size() { - return family_name.size(); - } - /** - * Returns the font (null if no font) - */ - public Object get() { + ArrayList<CssValue> values = new ArrayList<CssValue>(); - if (fontfamily != null) { - return fontfamily; - } else if (family_name.size() == 0) { - return null; + while (!expression.end()) { + char op = expression.getOperator(); + CssValue val = expression.getValue(); + switch (val.getType()) { + case CssTypes.CSS_STRING: + // check it's not a quoted reserved keyword + String s = val.toString(); + if (s.length() > 2) { + // we remove quotes and check it's not reserved. + CssIdent id = new CssIdent(s.substring(1, s.length() - 1)); + if (getGenericFontName(id) != null) { + ac.getFrame().addWarning("generic-family.quote", 2); + } + } + values.add(val); + break; + case CssTypes.CSS_IDENT: + ArrayList<CssIdent> idval = new ArrayList<CssIdent>(); + idval.add((CssIdent) val); + // we add idents if separated by spaces... + expression.next(); + while (op == SPACE && !expression.end()) { + op = expression.getOperator(); + val = expression.getValue(); + if (val.getType() == CssTypes.CSS_IDENT) { + idval.add((CssIdent) val); + } else { + throw new InvalidParamException("value", val, + getPropertyName(), ac); + } + expression.next(); + } + checkExpression(ac, values, idval, 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); + } } - - return family_name.firstElement(); - } - - /** - * Returns true if this property is "softly" inherited - * e.g. his value equals inherit - */ - public boolean isSoftlyInherited() { - return inheritedValue; - } - - /** - * Returns a string representation of the object. - */ - public String toString() { - if (inheritedValue) { - return inherit.toString(); - } else { - String r = ""; - for (Enumeration e = elements(); e.hasMoreElements();) - // r += ", " + convertString(e.nextElement().toString()); - r += ", " + e.nextElement().toString(); - if (r.length() < 3) { - return null; - } - return r.substring(2); + checkValues(ac, values); + value = (values.size() > 1) ? values : values.get(0); } - } - String convertString (String value) { - if (value.indexOf('"') != -1) { - return '\'' + value + '\''; - } else if (value.indexOf('\'') != -1) { - return '"' + value + '"'; - } else { - return value; + public CssFontFamily(ApplContext ac, CssExpression expression) + throws InvalidParamException { + this(ac, expression, false); } - } - /** - * Returns the name of this property - */ - public String getPropertyName() { - return "font-family"; - } - - /** - * Add this property to the CssStyle. - * - * @param style The CssStyle - */ - public void addToStyle(ApplContext ac, CssStyle style) { - CssFont cssFont = ((Css1Style) style).cssFont; - - if (cssFont.fontFamily != null) - style.addRedefinitionWarning(ac, this); - cssFont.fontFamily = 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 ((Css1Style) style).getFontFamily(); - } else { - return ((Css1Style) style).cssFont.fontFamily; + /** + * Returns true if this property is "softly" inherited + * e.g. his value is equals to inherit + */ + public boolean isSoftlyInherited() { + return inherit.equals(value); } - } - - /** - * Compares two properties for equality. - * - * @param value The other property. - */ - public boolean equals(CssProperty property) { - return false; //@@ FIXME - } - private static String trimToOneSpace(String name) { - int count = name.length(); - char[] dst = new char[count]; - char[] src = new char[count]; - int index = -1; - - name.getChars(0, count, src, 0); - for(int i=0; i < count; i++) - if ( i == 0 || ! Util.isWhiteSpace(src[i]) || - ( Util.isWhiteSpace(src[i]) && - !Util.isWhiteSpace(dst[index]) ) ) - dst[++index] = src[i]; - - return new String(dst, 0, index+1); - } + /** + * Returns a string representation of the object. + */ + public String toString() { + return value.toString(); + } - /** - * Returns true if this property contains a generic family name - */ - public boolean containsGenericFamily() { - if (family_name.size() == 0) { - return true; - } else { - for (Enumeration e = family_name.elements(); - e.hasMoreElements();) { - int hash = ((String) e.nextElement()).toLowerCase().hashCode(); - for (int i = 0; i < genericFamilyHash.length; i++) { - if (hash == genericFamilyHash[i]) - return true; - } - } - return false; + /** + * Compares two properties for equality. + * + * @param property The other property. + */ + public boolean equals(CssProperty property) { + return (property instanceof CssFontFamily && + value.equals(((CssFontFamily) property).value)); } - } - static { - genericFamilyHash = new int[genericFamily.length]; - for (int i = 0; i < genericFamily.length; i++) { - genericFamilyHash[i] = genericFamily[i].hashCode(); - } - } } +
Received on Saturday, 4 August 2012 21:17:42 UTC