/* * Copyright (c) 1999 World Wide Web Consortium * (Massachusetts Institute of Technology, Institut National de Recherche * en Informatique et en Automatique, Keio University). * All Rights Reserved. http://www.w3.org/Consortium/Legal/ * * $Id: LexicalUnitImpl.java,v 1.3 2000/02/15 02:08:19 plehegar Exp $ */ package org.w3c.flute.parser; import org.w3c.css.sac.LexicalUnit; /** * @version $Revision: 1.3 $ * @author Philippe Le Hegaret */ public class LexicalUnitImpl implements LexicalUnit { /* * My own finals */ public static final short RGBA_COLOR = 43; public static final short HSL_COLOR = 44; public static final short HSLA_COLOR = 45; //public static final short PARAN = 46; public static final short HEX_COLOR = 46; public static final short TURN = 47; public static final short REM = 48; LexicalUnit prev; LexicalUnit next; short type; int line; int column; int i; float f; short dimension; String sdimension; String s; String fname; LexicalUnitImpl params; LexicalUnitImpl(short type, int line, int column, LexicalUnitImpl p) { if (p != null) { prev = p; p.next = this; } this.line = line; this.column = column - 1; this.type = type; } LexicalUnitImpl(int line, int column, LexicalUnitImpl previous, int i) { this(SAC_INTEGER, line, column, previous); this.i = i; } LexicalUnitImpl(int line, int column, LexicalUnitImpl previous, short dimension, String sdimension, float f) { this(dimension, line, column, previous); this.f = f; this.dimension = dimension; this.sdimension = sdimension; } LexicalUnitImpl(int line, int column, LexicalUnitImpl previous, short type, String s) { this(type, line, column, previous); this.s = s; } LexicalUnitImpl(short type, int line, int column, LexicalUnitImpl previous, String fname, LexicalUnitImpl params) { this(type, line, column, previous); this.fname = fname; this.params = params; } LexicalUnitImpl(short type, int line, int column, LexicalUnitImpl previous, LexicalUnitImpl params) { this(type, line, column, previous); this.params = params; } public LexicalUnitImpl(short type, int line, int column, LexicalUnitImpl previous, String fname, String string) { this(type, line, column, previous); this.fname = fname; this.s = string; } public int getLineNumber() { return line; } public int getColumnNumber() { return column; } public short getLexicalUnitType() { return type; } public LexicalUnit getNextLexicalUnit() { return next; } public LexicalUnit getPreviousLexicalUnit() { return prev; } public int getIntegerValue() { return i; } void setIntegerValue(int i) { this.i = i; } public float getFloatValue() { return f; } void setFloatValue(float f) { this.f = f; } public String getDimensionUnitText() { switch (type) { case SAC_PERCENTAGE: return "%"; case SAC_EM: return "em"; case SAC_EX: return "ex"; case SAC_PIXEL: return "px"; case SAC_CENTIMETER: return "cm"; case SAC_MILLIMETER: return "mm"; case SAC_INCH: return "in"; case SAC_POINT: return "pt"; case SAC_PICA: return "pc"; case SAC_DEGREE: return "deg"; case SAC_RADIAN: return "rad"; case SAC_GRADIAN: return "grad"; case TURN: return "turn"; case SAC_MILLISECOND: return "ms"; case SAC_SECOND: return "s"; case SAC_HERTZ: return "Hz"; case SAC_KILOHERTZ: return "kHz"; case SAC_DIMENSION: return sdimension; default: throw new IllegalStateException("invalid dimension " + type); } } public String getStringValue() { return s; } public String getFunctionName() { return fname; } public org.w3c.css.sac.LexicalUnit getParameters() { return params; } public org.w3c.css.sac.LexicalUnit getSubValues() { return params; } public String toString() { String text; switch (type) { case SAC_OPERATOR_COMMA: text = ","; break; case SAC_OPERATOR_PLUS: text = "+"; break; case SAC_OPERATOR_MINUS: text = "-"; break; case SAC_OPERATOR_MULTIPLY: text = "*"; break; case SAC_OPERATOR_SLASH: text = "/"; break; case SAC_OPERATOR_MOD: text = "%"; break; case SAC_OPERATOR_EXP: text = "^"; break; case SAC_OPERATOR_LT: text = "<"; break; case SAC_OPERATOR_GT: text = ">"; break; case SAC_OPERATOR_LE: text = "<="; break; case SAC_OPERATOR_GE: text = "=>"; break; case SAC_OPERATOR_TILDE: text = "~"; break; case SAC_INHERIT: text = "inherit"; break; case SAC_INTEGER: text = Integer.toString(i, 10); break; case SAC_REAL: text = f + ""; break; case SAC_EM: case SAC_EX: case SAC_PIXEL: case SAC_INCH: case SAC_CENTIMETER: case SAC_MILLIMETER: case SAC_POINT: case SAC_PICA: case SAC_PERCENTAGE: case SAC_DEGREE: case SAC_GRADIAN: case TURN: case SAC_RADIAN: case SAC_MILLISECOND: case SAC_SECOND: case SAC_HERTZ: case SAC_KILOHERTZ: case SAC_DIMENSION: //String fs = null; int i = (int) f; if (((float) i) == f) { text = i + getDimensionUnitText(); } else { text = f + getDimensionUnitText(); } break; case SAC_URI: text = "uri(" + s + ")"; break; case SAC_COUNTER_FUNCTION: case SAC_COUNTERS_FUNCTION: case SAC_RGBCOLOR: case SAC_RECT_FUNCTION: case SAC_FUNCTION: text = getFunctionName() + "(" + getParameters() + ")"; break; case SAC_IDENT: text = "attr(" + getStringValue() + ")"; break; case SAC_STRING_VALUE: // @@SEEME. not exact text = "\"" + getStringValue() + "\""; break; case SAC_ATTR: text = "attr(" + getStringValue() + ")"; break; case SAC_UNICODERANGE: text = "@@TODO"; break; case SAC_SUB_EXPRESSION: text = getSubValues().toString(); break; //case PARAN: // text = "(" + getSubValues().toString() + ")"; // break; default: text = "@unknown "; break; } if (next != null) { return text + ' ' + next; } else { return text; } } // here some useful function for creation static LexicalUnitImpl createNumber(int line, int column, LexicalUnitImpl previous, float v) { int i = (int) v; if (v == ((float) i)) { return new LexicalUnitImpl(line, column, previous, i); } else { return new LexicalUnitImpl(line, column, previous, SAC_REAL, "", v); } } static LexicalUnitImpl createInteger(int line, int column, LexicalUnitImpl previous, int i) { return new LexicalUnitImpl(line, column, previous, i); } static LexicalUnitImpl createPercentage(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_PERCENTAGE, null, v); } static LexicalUnitImpl createEMS(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_EM, null, v); } static LexicalUnitImpl createEXS(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_EX, null, v); } static LexicalUnitImpl createPX(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_PIXEL, null, v); } static LexicalUnitImpl createCM(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_CENTIMETER, null, v); } static LexicalUnitImpl createMM(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_MILLIMETER, null, v); } static LexicalUnitImpl createIN(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_INCH, null, v); } static LexicalUnitImpl createPT(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_POINT, null, v); } static LexicalUnitImpl createPC(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_PICA, null, v); } static LexicalUnitImpl createDEG(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_DEGREE, null, v); } static LexicalUnitImpl createRAD(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_RADIAN, null, v); } static LexicalUnitImpl createGRAD(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, SAC_GRADIAN, null, v); } static LexicalUnitImpl createTURN(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, TURN, null, v); } static LexicalUnitImpl createMS(int line, int column, LexicalUnitImpl previous, float v) throws ParseException { if (v < 0) { throw new ParseException("Time values may not be negative"); } return new LexicalUnitImpl(line, column, previous, SAC_MILLISECOND, null, v); } static LexicalUnitImpl createS(int line, int column, LexicalUnitImpl previous, float v) throws ParseException { if (v < 0) { throw new ParseException("Time values may not be negative"); } return new LexicalUnitImpl(line, column, previous, SAC_SECOND, null, v); } static LexicalUnitImpl createHZ(int line, int column, LexicalUnitImpl previous, float v) throws ParseException { if (v < 0) { throw new ParseException("Frequency values may not be negative"); } return new LexicalUnitImpl(line, column, previous, SAC_HERTZ, null, v); } static LexicalUnitImpl createKHZ(int line, int column, LexicalUnitImpl previous, float v) throws ParseException { if (v < 0) { throw new ParseException("Frequency values may not be negative"); } return new LexicalUnitImpl(line, column, previous, SAC_KILOHERTZ, null, v); } static LexicalUnitImpl createDimen(int line, int column, LexicalUnitImpl previous, float v, String s) { return new LexicalUnitImpl(line, column, previous, SAC_DIMENSION, s, v); } static LexicalUnitImpl createInherit(int line, int column, LexicalUnitImpl previous) { return new LexicalUnitImpl(line, column, previous, SAC_INHERIT, "inherit"); } static LexicalUnitImpl createIdent(int line, int column, LexicalUnitImpl previous, String s) { return new LexicalUnitImpl(line, column, previous, SAC_IDENT, s); } static LexicalUnitImpl createString(int line, int column, LexicalUnitImpl previous, String s) { return new LexicalUnitImpl(line, column, previous, SAC_STRING_VALUE, s); } static LexicalUnitImpl createURL(int line, int column, LexicalUnitImpl previous, String s) { return new LexicalUnitImpl(line, column, previous, SAC_URI, s); } static LexicalUnitImpl createAttr(int line, int column, LexicalUnitImpl previous, String s) { return new LexicalUnitImpl(line, column, previous, SAC_ATTR, s); } static LexicalUnitImpl createCounter(int line, int column, LexicalUnitImpl previous, LexicalUnit params) { return new LexicalUnitImpl(SAC_COUNTER_FUNCTION, line, column, previous, "counter", (LexicalUnitImpl) params); } static LexicalUnitImpl createCounters(int line, int column, LexicalUnitImpl previous, LexicalUnit params) { return new LexicalUnitImpl(SAC_COUNTERS_FUNCTION, line, column, previous, "counters", (LexicalUnitImpl) params); } static LexicalUnitImpl createHexColor(int line, int column, LexicalUnitImpl previous, String hexValue) { return new LexicalUnitImpl(HEX_COLOR, line, column, previous, "color", hexValue); } static LexicalUnitImpl createRGBColor(int line, int column, LexicalUnitImpl previous, LexicalUnit params) { return new LexicalUnitImpl(SAC_RGBCOLOR, line, column, previous, "color", (LexicalUnitImpl) params); } static LexicalUnitImpl createRGBAColor(int line, int column, LexicalUnitImpl previous, LexicalUnit params) { return new LexicalUnitImpl(RGBA_COLOR, line, column, previous, "color", (LexicalUnitImpl) params); } static LexicalUnitImpl createHSLColor(int line, int column, LexicalUnitImpl previous, LexicalUnit params) { return new LexicalUnitImpl(HSL_COLOR, line, column, previous, "color", (LexicalUnitImpl) params); } static LexicalUnitImpl createHSLAColor(int line, int column, LexicalUnitImpl previous, LexicalUnit params) { return new LexicalUnitImpl(HSLA_COLOR, line, column, previous, "color", (LexicalUnitImpl) params); } static LexicalUnitImpl createRect(int line, int column, LexicalUnitImpl previous, LexicalUnit params) { return new LexicalUnitImpl(SAC_RECT_FUNCTION, line, column, previous, "rect", (LexicalUnitImpl) params); } static LexicalUnitImpl createFunction(int line, int column, LexicalUnitImpl previous, String fname, LexicalUnit params) { return new LexicalUnitImpl(SAC_FUNCTION, line, column, previous, fname, (LexicalUnitImpl) params); } static LexicalUnitImpl createUnicodeRange(int line, int column, LexicalUnit previous, LexicalUnit params) { // @@ return new LexicalUnitImpl(line, column, previous, null, // SAC_UNICODERANGE, params); return null; } static LexicalUnitImpl createComma(int line, int column, LexicalUnitImpl previous) { return new LexicalUnitImpl(SAC_OPERATOR_COMMA, line, column, previous); } static LexicalUnitImpl createSlash(int line, int column, LexicalUnitImpl previous) { return new LexicalUnitImpl(SAC_OPERATOR_SLASH, line, column, previous); } public static LexicalUnitImpl createREMS(int line, int column, LexicalUnitImpl previous, float v) { return new LexicalUnitImpl(line, column, previous, REM, null, v); } /*public static LexicalUnitImpl createParan(int beginLine, int beginColumn, LexicalUnitImpl prev, LexicalUnit param) { return new LexicalUnitImpl(PARAN, beginLine, beginColumn, prev, (LexicalUnitImpl)param); }*/ }