#ifndef _CSS_cssparser_h_
#define _CSS_cssparser_h_
#include <qstring.h>
#include <qcolor.h>
#include <dom/dom_string.h>
#include "xml/dom_atomicstring.h"
namespace DOM {
class StyleListImpl;
class CSSStyleSheetImpl;
class CSSRuleImpl;
class CSSStyleRuleImpl;
class DocumentImpl;
class CSSValueImpl;
class CSSValueListImpl;
class CSSPrimitiveValueImpl;
class CSSStyleDeclarationImpl;
class CSSProperty;
class CSSRuleListImpl;
struct ParseString {
unsigned short *string;
int length;
void lower();
};
struct Value;
class ValueList;
struct Function;
struct Value {
int id;
union {
double fValue;
int iValue;
ParseString string;
Function *function;
};
enum {
Operator = 0x100000,
Function = 0x100001,
Q_EMS = 0x100002
};
int unit;
};
static inline QString qString( const ParseString &ps ) {
return QString( (QChar *)ps.string, ps.length );
}
static inline DOMString domString( const ParseString &ps ) {
return DOMString( (QChar *)ps.string, ps.length );
}
static inline AtomicString atomicString( const ParseString &ps ) {
return AtomicString( ps.string, ps.length );
}
class ValueList {
public:
ValueList();
~ValueList();
void addValue( const Value &val );
Value *current() { return currentValue < numValues ? values + currentValue : 0; }
Value *next() { ++currentValue; return current(); }
Value *values;
int numValues;
int maxValues;
int currentValue;
};
struct Function {
ParseString name;
ValueList *args;
~Function() { delete args; }
};
class CSSParser
{
public:
CSSParser( bool strictParsing = true );
~CSSParser();
void parseSheet( DOM::CSSStyleSheetImpl *sheet, const DOM::DOMString &string );
DOM::CSSRuleImpl *parseRule( DOM::CSSStyleSheetImpl *sheet, const DOM::DOMString &string );
bool parseValue( DOM::CSSStyleDeclarationImpl *decls, int id, const DOM::DOMString &string,
bool _important );
bool parseDeclaration( DOM::CSSStyleDeclarationImpl *decls, const DOM::DOMString &string );
static CSSParser *current() { return currentParser; }
DOM::DocumentImpl *document() const;
void addProperty( int propId, CSSValueImpl *value, bool important );
bool hasProperties() const { return numParsedProperties > 0; }
CSSStyleDeclarationImpl *createStyleDeclaration( CSSStyleRuleImpl *rule );
void clearProperties();
bool parseValue( int propId, bool important );
bool parseShortHand( const int *properties, int numProperties, bool important );
bool parse4Values( const int *properties, bool important );
bool parseContent( int propId, bool important );
bool parseShape( int propId, bool important );
bool parseFont(bool important);
CSSValueListImpl *parseFontFamily();
CSSPrimitiveValueImpl *parseColor();
CSSPrimitiveValueImpl *parseColorFromValue(Value* val);
static bool parseColor(const QString &name, QRgb& rgb);
bool parseShadow(int propId, bool important);
int yyparse( void );
public:
bool strict;
bool important;
int id;
DOM::StyleListImpl *styleElement;
DOM::CSSRuleImpl *rule;
ValueList *valueList;
CSSProperty **parsedProperties;
int numParsedProperties;
int maxParsedProperties;
bool inParseShortHand;
Q_UINT16 defaultNamespace;
static CSSParser *currentParser;
public:
int lex( void *yylval );
int token() { return yyTok; }
unsigned short *text( int *length);
int lex();
private:
unsigned short *data;
unsigned short *yytext;
unsigned short *yy_c_buf_p;
unsigned short yy_hold_char;
int yy_last_accepting_state;
unsigned short *yy_last_accepting_cpos;
int yyleng;
int yyTok;
int yy_start;
};
}; #endif