/*
* 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 1830 2006-04-23 14:51:03Z taqua $
*/
/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 1999 - 2009 Pentaho Corporation, World Wide Web Consortium. All rights reserved.
*/
package org.w3c.flute.parser;
import org.w3c.css.sac.LexicalUnit;
/**
* @author Philippe Le Hegaret
* @version $Revision$
*/
class LexicalUnitImpl implements LexicalUnit {
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;
}
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 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 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 = 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;
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 createMS( int line, int column,
LexicalUnitImpl previous, float v ) {
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 ) {
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 ) {
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 ) {
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 createRGBColor( int line, int column,
LexicalUnitImpl previous,
LexicalUnit params ) {
return new LexicalUnitImpl( SAC_RGBCOLOR, 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 );
}
}