W3C home > Mailing lists > Public > www-validator-cvs@w3.org > September 2012

2002/css-validator/org/w3c/css/values CssUnitsCSS1.java,NONE,1.1 CssUnitsCSS2.java,NONE,1.1 CssUnitsCSS21.java,NONE,1.1 CssUnitsCSS3.java,NONE,1.1 CssLength.java,1.10,1.11

From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
Date: Fri, 07 Sep 2012 14:55:27 +0000
To: www-validator-cvs@w3.org
Message-Id: <E1T9zxv-0003vE-Ec@lionel-hutz.w3.org>
Update of /sources/public/2002/css-validator/org/w3c/css/values
In directory hutz:/tmp/cvs-serv15037/values

Modified Files:
	CssLength.java 
Added Files:
	CssUnitsCSS1.java CssUnitsCSS2.java CssUnitsCSS21.java 
	CssUnitsCSS3.java 
Log Message:
first pass at adding units depending on CSS level (including the absolute/relative check

--- NEW FILE: CssUnitsCSS3.java ---
//
// $Id: CssUnitsCSS3.java,v 1.1 2012/09/07 14:55:25 ylafon Exp $
// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr)
//
// (c) COPYRIGHT MIT and INRIA, 1997.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.values;

import org.w3c.css.util.ApplContext;
import org.w3c.css.util.InvalidParamException;

/**
 * @spec http://www.w3.org/TR/2012/CR-css3-values-20120828/
 */
public class CssUnitsCSS3 {
	private static final String[] relative_length_units = {
			"em", "ex", "ch", "rem", "vw", "vh", "vmin", "vmax"
	};

	private static final String[] absolute_length_units = {
			"in", "cm", "mm", "pt", "pc", "px"
	};

	public static final String[] angle_units = {
			"deg", "grad", "rad", "turn"
	};

	public static final String[] time_units = {
			"ms", "s"
	};

	public static final String[] frequency_units = {
			"kHz", "Hz"
	};

	public static final String[] resolution_units = {
			"dpi", "dpcm", "ddpx"
	};

	protected static String getRelativeLengthUnit(String unit) {
		for (String s : relative_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static String getAbsoluteLengthUnit(String unit) {
		for (String s : absolute_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static void parseLengthUnit(String unit, CssLength length, ApplContext ac)
			throws InvalidParamException {
		String matchedUnit = getRelativeLengthUnit(unit);
		if (matchedUnit != null) {
			length.absolute = false;
		} else {
			matchedUnit = getAbsoluteLengthUnit(unit);
			if (matchedUnit == null) {
				throw new InvalidParamException("unit", unit, ac);
			}
			length.absolute = true;
		}
		length.unit = matchedUnit;
	}
}

Index: CssLength.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/values/CssLength.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- CssLength.java	6 Sep 2012 12:37:58 -0000	1.10
+++ CssLength.java	7 Sep 2012 14:55:25 -0000	1.11
@@ -1,9 +1,9 @@
-//
 // $Id$
 // From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr)
 // Updated September 25th 2000 Sijtsche de Jong (sy.de.jong@let.rug.nl)
+// Updated 2012 by Yves Lafon <yves@w3.org>
 //
-// (c) COPYRIGHT MIT and INRIA, 1997.
+// (c) COPYRIGHT MIT, ERCIM and Keio University, 1997.
 // Please first read the full copyright statement in file COPYRIGHT.html
 package org.w3c.css.values;
 
@@ -99,16 +99,8 @@
 
 
 	private BigDecimal value;
-	private int unit;
-	private static String[] units = {"mm", "cm", "pt", "pc", "em",
-			"ex", "px", "in", "gd"};
-	private static int[] hash_units;
-
-	static {
-		hash_units = new int[units.length];
-		for (int i = 0; i < units.length; i++)
-			hash_units[i] = units[i].hashCode();
-	}
+	protected String unit;
+	protected boolean absolute = false;
 
 	/**
 	 * Create a new CssLength
@@ -124,32 +116,46 @@
 	 * @throws InvalidParamException The unit is incorrect
 	 */
 	public void set(String s, ApplContext ac) throws InvalidParamException {
-		s = s.toLowerCase();
-		int length = s.length();
-		String unit = s.substring(length - 2, length);
-		this.value = new BigDecimal(s.substring(0, length - 2));
-
-		this.unit = 2; // there is no unit by default
-
-		if (unit.equals("gd") && (cssversion.equals("css2"))) {
-			throw new InvalidParamException("unit", unit, ac);
+		String low_s = s.toLowerCase();
+		int length = low_s.length();
+		int unitIdx = length - 1;
+		char c = low_s.charAt(unitIdx);
+		while (unitIdx > 0 && c <= 'z' && c >= 'a') {
+			c = low_s.charAt(--unitIdx);
 		}
-
-		if (value.floatValue() != 0) {
-			int hash = unit.hashCode();
-			int i = 0;
-			while (i < units.length) {
-				if (hash == hash_units[i]) {
-					this.unit = i;
-					return;
-				}
-				i++;
-			}
-		} else {
-			return;
+		if (unitIdx == 0 || (unitIdx == length - 1)) {
+			throw new InvalidParamException("unit", s, ac);
+		}
+		// we go back to the beginning of the unit
+		unitIdx++;
+		String unit_str = low_s.substring(unitIdx, length);
+		// let's test the unit
+		boolean ok = true;
+		// TODO check the  if (!BigDecimal.ZERO.equals(value))) test
+		// that was here earlier
+		// seems legit to always test the unit no matter the value
+		switch (ac.getCssVersion()) {
+			case CSS1:
+				CssUnitsCSS1.parseLengthUnit(unit_str, this, ac);
+				break;
+			case CSS2:
+				CssUnitsCSS2.parseLengthUnit(unit_str, this, ac);
+				break;
+			case CSS21:
+				CssUnitsCSS21.parseLengthUnit(unit_str, this, ac);
+				break;
+			case CSS3:
+				CssUnitsCSS3.parseLengthUnit(unit_str, this, ac);
+				break;
+			default:
+				throw new InvalidParamException("unit", s, ac);
+		}
+		try {
+			value = new BigDecimal(low_s.substring(0, unitIdx));
+		} catch (NumberFormatException nex) {
+			throw new InvalidParamException("invalid-number",
+					low_s.substring(0, unitIdx), ac);
 		}
-
-		throw new InvalidParamException("unit", unit, ac);
 	}
 
 	// return self
@@ -204,7 +210,21 @@
 	 * Returns the current value
 	 */
 	public String getUnit() {
-		return units[unit];
+		return unit;
+	}
+
+	/**
+	 * tells if it is relative or not
+	 */
+	public boolean isRelative() {
+		return !absolute;
+	}
+
+	/**
+	 * tells if it is absolute or not
+	 */
+	public boolean isAbsolute() {
+		return absolute;
 	}
 
 	/**
@@ -214,7 +234,7 @@
 		if (BigDecimal.ZERO.equals(value)) {
 			return value.toPlainString();
 		}
-		return value.toPlainString() + getUnit();
+		return value.toPlainString() + unit;
 	}
 
 	/**
@@ -225,7 +245,7 @@
 	public boolean equals(Object value) {
 		return (value instanceof CssLength &&
 				this.value.equals(((CssLength) value).value) &&
-				unit == ((CssLength) value).unit);
+				unit.equals(((CssLength) value).unit));
 	}
 
 }

--- NEW FILE: CssUnitsCSS21.java ---
//
// $Id: CssUnitsCSS21.java,v 1.1 2012/09/07 14:55:25 ylafon Exp $
// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr)
//
// (c) COPYRIGHT MIT and INRIA, 1997.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.values;

import org.w3c.css.util.ApplContext;
import org.w3c.css.util.InvalidParamException;

/**
 * @spec http://www.w3.org/TR/2011/REC-CSS2-20110607/syndata.html#values
 */
public class CssUnitsCSS21 {
	private static final String[] relative_length_units = {
			"em", "ex"
	};

	private static final String[] absolute_length_units = {
			"in", "cm", "mm", "pt", "pc", "px"
	};

	// defined in Appendix A.2
	// http://www.w3.org/TR/2011/REC-CSS2-20110607/aural.html#aural-intro
	public static final String[] angle_units = {
			"deg", "grad", "rad"
	};

	public static final String[] time_units = {
			"ms", "s"
	};

	public static final String[] frequency_units = {
			"kHz", "Hz"
	};

	protected static String getRelativeLengthUnit(String unit) {
		for (String s : relative_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static String getAbsoluteLengthUnit(String unit) {
		for (String s : absolute_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static void parseLengthUnit(String unit, CssLength length, ApplContext ac)
			throws InvalidParamException {
		String matchedUnit = getRelativeLengthUnit(unit);
		if (matchedUnit != null) {
			length.absolute = false;
		} else {
			matchedUnit = getAbsoluteLengthUnit(unit);
			if (matchedUnit == null) {
				throw new InvalidParamException("unit", unit, ac);
			}
			length.absolute = true;
		}
		length.unit = matchedUnit;
	}
}

--- NEW FILE: CssUnitsCSS2.java ---
//
// $Id: CssUnitsCSS2.java,v 1.1 2012/09/07 14:55:25 ylafon Exp $
// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr)
//
// (c) COPYRIGHT MIT and INRIA, 1997.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.values;

import org.w3c.css.util.ApplContext;
import org.w3c.css.util.InvalidParamException;

/**
 * @spec http://www.w3.org/TR/2008/REC-CSS2-20080411/syndata.html#values
 */
public class CssUnitsCSS2 {
	private static final String[] relative_length_units = {
			"em", "ex", "px"
	};

	private static final String[] absolute_length_units = {
			"in", "cm", "mm", "pt", "pc"
	};

	private static final String[] angle_units = {
			"deg", "grad", "rad"
	};

	private static final String[] time_units = {
			"ms", "s"
	};

	private static final String[] frequency_units = {
			"kHz", "Hz"
	};

	protected static String getRelativeLengthUnit(String unit) {
		for (String s : relative_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static String getAbsoluteLengthUnit(String unit) {
		for (String s : absolute_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static void parseLengthUnit(String unit, CssLength length, ApplContext ac)
			throws InvalidParamException {
		String matchedUnit = getRelativeLengthUnit(unit);
		if (matchedUnit != null) {
			length.absolute = false;
		} else {
			matchedUnit = getAbsoluteLengthUnit(unit);
			if (matchedUnit == null) {
				throw new InvalidParamException("unit", unit, ac);
			}
			length.absolute = true;
		}
		length.unit = matchedUnit;
	}
}

--- NEW FILE: CssUnitsCSS1.java ---
//
// $Id: CssUnitsCSS1.java,v 1.1 2012/09/07 14:55:25 ylafon Exp $
// From Philippe Le Hegaret (Philippe.Le_Hegaret@sophia.inria.fr)
//
// (c) COPYRIGHT MIT and INRIA, 1997.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.css.values;

import org.w3c.css.util.ApplContext;
import org.w3c.css.util.InvalidParamException;

/**
 * @spec http://www.w3.org/TR/2008/REC-CSS1-20080411/#units
 */
public class CssUnitsCSS1 {
	private static final String[] relative_length_units = {
			"em", "ex", "px"
	};

	private static final String[] absolute_length_units = {
			"in", "cm", "mm", "pt", "pc"
	};

	protected static String getRelativeLengthUnit(String unit) {
		for (String s : relative_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static String getAbsoluteLengthUnit(String unit) {
		for (String s : absolute_length_units) {
			if (s.equals(unit)) {
				return s;
			}
		}
		return null;
	}

	protected static void parseLengthUnit(String unit, CssLength length, ApplContext ac)
		throws InvalidParamException {
		String matchedUnit = getRelativeLengthUnit(unit);
		if (matchedUnit != null) {
			length.absolute = false;
		} else {
			matchedUnit = getAbsoluteLengthUnit(unit);
			if (matchedUnit == null) {
				throw new InvalidParamException("unit", unit, ac);
			}
			length.absolute = true;
		}
		length.unit = matchedUnit;
	}
}
Received on Friday, 7 September 2012 14:55:33 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 7 January 2015 15:17:51 UTC