aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/css.cc27
-rw-r--r--src/css.hh275
-rw-r--r--src/cssparser.cc536
-rw-r--r--src/cssparser.hh32
-rw-r--r--src/html.cc89
-rw-r--r--src/styleengine.cc158
-rw-r--r--src/table.cc64
7 files changed, 648 insertions, 533 deletions
diff --git a/src/css.cc b/src/css.cc
index b7e34398..5e37220f 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -30,23 +30,34 @@ CssPropertyList::~CssPropertyList () {
getRef (i)->free ();
}
-void CssPropertyList::set (CssProperty::Name name, CssProperty::Value value) {
- for (int i = 0; i < size (); i++)
- if (getRef (i)->name == name) {
+void CssPropertyList::set (CssPropertyName name, CssValueType type,
+ CssPropertyValue value) {
+ CssProperty *prop;
+
+ for (int i = 0; i < size (); i++) {
+ prop = getRef (i);
+
+ if (prop->name == name) {
if (ownerOfStrings)
- getRef (i)->free ();
- getRef (i)->value = value;
+ prop->free ();
+ prop->type = type;
+ prop->value = value;
return;
}
+ }
increase ();
- getRef (size () - 1)->name = name;
- getRef (size () - 1)->value = value;
+ prop = getRef (size () - 1);
+ prop->name = name;
+ prop->type = type;
+ prop->value = value;
}
void CssPropertyList::apply (CssPropertyList *props) {
for (int i = 0; i < size (); i++)
- props->set (getRef (i)->name, getRef (i)->value);
+ props->set ((CssPropertyName) getRef (i)->name,
+ (CssValueType) getRef (i)->type,
+ getRef (i)->value);
}
void CssPropertyList::print () {
diff --git a/src/css.hh b/src/css.hh
index 805f2c5c..ef9774e8 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -14,6 +14,33 @@ typedef enum {
CSS_PRIMARY_LAST,
} CssPrimaryOrder;
+typedef enum {
+ CSS_TYPE_INTEGER, /* This type is only used internally, for x-*
+ properties. */
+ CSS_TYPE_ENUM, /* Value is i, if represented by
+ enum_symbols[i]. */
+ CSS_TYPE_MULTI_ENUM, /* For all enum_symbols[i], 1 << i are
+ combined. */
+ CSS_TYPE_LENGTH_PERCENTAGE, /* <length> or <percentage>. Represented by
+ CssLength. */
+ CSS_TYPE_LENGTH, /* <length>, represented as CssLength.
+ Note: In some cases, CSS_TYPE_LENGTH is used
+ instead of CSS_TYPE_LENGTH_PERCENTAGE,
+ only because Dw cannot handle percentages
+ in this particular case (e.g.
+ 'margin-*-width'). */
+ CSS_TYPE_COLOR, /* Represented as integer. */
+ CSS_TYPE_FONT_WEIGHT, /* this very special and only used by
+ 'font-weight' */
+ CSS_TYPE_STRING, /* <string> */
+ CSS_TYPE_SYMBOL, /* Symbols, which are directly copied (as
+ opposed to CSS_TYPE_ENUM and
+ CSS_TYPE_MULTI_ENUM). Used for
+ 'font-family'. */
+ CSS_TYPE_UNUSED /* Not yet used. Will itself get unused some
+ day. */
+} CssValueType;
+
/*
* Lengths are represented as int in the following way:
*
@@ -45,125 +72,136 @@ enum {
#define CSS_LENGTH_VALUE(l) ( ( (float)((l) & ~7) ) / (1 << 19) )
#define CSS_LENGTH_TYPE(l) ((l) & 7)
+typedef enum {
+ CSS_PROPERTY_BACKGROUND_ATTACHMENT,
+ CSS_PROPERTY_BACKGROUND_COLOR,
+ CSS_PROPERTY_BACKGROUND_IMAGE,
+ CSS_PROPERTY_BACKGROUND_POSITION,
+ CSS_PROPERTY_BACKGROUND_REPEAT,
+ CSS_PROPERTY_BORDER_BOTTOM_COLOR,
+ CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+ CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+ CSS_PROPERTY_BORDER_COLLAPSE,
+ CSS_PROPERTY_BORDER_LEFT_COLOR,
+ CSS_PROPERTY_BORDER_LEFT_STYLE,
+ CSS_PROPERTY_BORDER_LEFT_WIDTH,
+ CSS_PROPERTY_BORDER_RIGHT_COLOR,
+ CSS_PROPERTY_BORDER_RIGHT_STYLE,
+ CSS_PROPERTY_BORDER_RIGHT_WIDTH,
+ CSS_PROPERTY_BORDER_SPACING,
+ CSS_PROPERTY_BORDER_TOP_COLOR,
+ CSS_PROPERTY_BORDER_TOP_STYLE,
+ CSS_PROPERTY_BORDER_TOP_WIDTH,
+ CSS_PROPERTY_BOTTOM,
+ CSS_PROPERTY_CAPTION_SIDE,
+ CSS_PROPERTY_CLEAR,
+ CSS_PROPERTY_CLIP,
+ CSS_PROPERTY_COLOR,
+ CSS_PROPERTY_CONTENT,
+ CSS_PROPERTY_COUNTER_INCREMENT,
+ CSS_PROPERTY_COUNTER_RESET,
+ CSS_PROPERTY_CURSOR,
+ CSS_PROPERTY_DIRECTION,
+ CSS_PROPERTY_DISPLAY,
+ CSS_PROPERTY_EMPTY_CELLS,
+ CSS_PROPERTY_FLOAT,
+ CSS_PROPERTY_FONT_FAMILY,
+ CSS_PROPERTY_FONT_SIZE,
+ CSS_PROPERTY_FONT_SIZE_ADJUST,
+ CSS_PROPERTY_FONT_STRETCH,
+ CSS_PROPERTY_FONT_STYLE,
+ CSS_PROPERTY_FONT_VARIANT,
+ CSS_PROPERTY_FONT_WEIGHT,
+ CSS_PROPERTY_HEIGHT,
+ CSS_PROPERTY_LEFT,
+ CSS_PROPERTY_LETTER_SPACING,
+ CSS_PROPERTY_LINE_HEIGHT,
+ CSS_PROPERTY_LIST_STYLE_IMAGE,
+ CSS_PROPERTY_LIST_STYLE_POSITION,
+ CSS_PROPERTY_LIST_STYLE_TYPE,
+ CSS_PROPERTY_MARGIN_BOTTOM,
+ CSS_PROPERTY_MARGIN_LEFT,
+ CSS_PROPERTY_MARGIN_RIGHT,
+ CSS_PROPERTY_MARGIN_TOP,
+ CSS_PROPERTY_MARKER_OFFSET,
+ CSS_PROPERTY_MARKS,
+ CSS_PROPERTY_MAX_HEIGHT,
+ CSS_PROPERTY_MAX_WIDTH,
+ CSS_PROPERTY_MIN_HEIGHT,
+ CSS_PROPERTY_MIN_WIDTH,
+ CSS_PROPERTY_OUTLINE_COLOR,
+ CSS_PROPERTY_OUTLINE_STYLE,
+ CSS_PROPERTY_OUTLINE_WIDTH,
+ CSS_PROPERTY_OVERFLOW,
+ CSS_PROPERTY_PADDING_BOTTOM,
+ CSS_PROPERTY_PADDING_LEFT,
+ CSS_PROPERTY_PADDING_RIGHT,
+ CSS_PROPERTY_PADDING_TOP,
+ CSS_PROPERTY_POSITION,
+ CSS_PROPERTY_QUOTES,
+ CSS_PROPERTY_RIGHT,
+ CSS_PROPERTY_TEXT_ALIGN,
+ CSS_PROPERTY_TEXT_DECORATION,
+ CSS_PROPERTY_TEXT_INDENT,
+ CSS_PROPERTY_TEXT_SHADOW,
+ CSS_PROPERTY_TEXT_TRANSFORM,
+ CSS_PROPERTY_TOP,
+ CSS_PROPERTY_UNICODE_BIDI,
+ CSS_PROPERTY_VERTICAL_ALIGN,
+ CSS_PROPERTY_VISIBILITY,
+ CSS_PROPERTY_WHITE_SPACE,
+ CSS_PROPERTY_WIDTH,
+ CSS_PROPERTY_WORD_SPACING,
+ CSS_PROPERTY_Z_INDEX,
+ CSS_PROPERTY_X_LINK,
+ CSS_PROPERTY_X_COLSPAN,
+ CSS_PROPERTY_X_ROWSPAN,
+ PROPERTY_X_LINK,
+ PROPERTY_X_IMG,
+ PROPERTY_X_TOOLTIP,
+ CSS_PROPERTY_LAST
+} CssPropertyName;
+
+typedef union {
+ int intVal;
+ char *strVal;
+} CssPropertyValue;
+
+typedef enum {
+ CSS_FONT_WEIGHT_BOLD,
+ CSS_FONT_WEIGHT_BOLDER,
+ CSS_FONT_WEIGHT_LIGHT,
+ CSS_FONT_WEIGHT_LIGHTER,
+ CSS_FONT_WEIGHT_NORMAL,
+} CssFontWeightExtensions;
+
+typedef enum {
+ CSS_FONT_SIZE_LARGE,
+ CSS_FONT_SIZE_LARGER,
+ CSS_FONT_SIZE_MEDIUM,
+ CSS_FONT_SIZE_SMALL,
+ CSS_FONT_SIZE_SMALLER,
+ CSS_FONT_SIZE_XX_LARGE,
+ CSS_FONT_SIZE_XX_SMALL,
+ CSS_FONT_SIZE_X_LARGE,
+ CSS_FONT_SIZE_X_SMALL,
+} CssFontSizeExtensions;
+
+
/**
* \brief This class holds a CSS property and value pair.
*/
class CssProperty {
public:
- typedef union {
- int intVal;
- char *strVal;
- } Value;
- typedef enum {
- CSS_PROPERTY_BACKGROUND_ATTACHMENT,
- CSS_PROPERTY_BACKGROUND_COLOR,
- CSS_PROPERTY_BACKGROUND_IMAGE,
- CSS_PROPERTY_BACKGROUND_POSITION,
- CSS_PROPERTY_BACKGROUND_REPEAT,
- CSS_PROPERTY_BORDER_BOTTOM_COLOR,
- CSS_PROPERTY_BORDER_BOTTOM_STYLE,
- CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
- CSS_PROPERTY_BORDER_COLLAPSE,
- CSS_PROPERTY_BORDER_LEFT_COLOR,
- CSS_PROPERTY_BORDER_LEFT_STYLE,
- CSS_PROPERTY_BORDER_LEFT_WIDTH,
- CSS_PROPERTY_BORDER_RIGHT_COLOR,
- CSS_PROPERTY_BORDER_RIGHT_STYLE,
- CSS_PROPERTY_BORDER_RIGHT_WIDTH,
- CSS_PROPERTY_BORDER_SPACING,
- CSS_PROPERTY_BORDER_TOP_COLOR,
- CSS_PROPERTY_BORDER_TOP_STYLE,
- CSS_PROPERTY_BORDER_TOP_WIDTH,
- CSS_PROPERTY_BOTTOM,
- CSS_PROPERTY_CAPTION_SIDE,
- CSS_PROPERTY_CLEAR,
- CSS_PROPERTY_CLIP,
- CSS_PROPERTY_COLOR,
- CSS_PROPERTY_CONTENT,
- CSS_PROPERTY_COUNTER_INCREMENT,
- CSS_PROPERTY_COUNTER_RESET,
- CSS_PROPERTY_CURSOR,
- CSS_PROPERTY_DIRECTION,
- CSS_PROPERTY_DISPLAY,
- CSS_PROPERTY_EMPTY_CELLS,
- CSS_PROPERTY_FLOAT,
- CSS_PROPERTY_FONT_FAMILY,
- CSS_PROPERTY_FONT_SIZE,
- CSS_PROPERTY_FONT_SIZE_ADJUST,
- CSS_PROPERTY_FONT_STRETCH,
- CSS_PROPERTY_FONT_STYLE,
- CSS_PROPERTY_FONT_VARIANT,
- CSS_PROPERTY_FONT_WEIGHT,
- CSS_PROPERTY_HEIGHT,
- CSS_PROPERTY_LEFT,
- CSS_PROPERTY_LETTER_SPACING,
- CSS_PROPERTY_LINE_HEIGHT,
- CSS_PROPERTY_LIST_STYLE_IMAGE,
- CSS_PROPERTY_LIST_STYLE_POSITION,
- CSS_PROPERTY_LIST_STYLE_TYPE,
- CSS_PROPERTY_MARGIN_BOTTOM,
- CSS_PROPERTY_MARGIN_LEFT,
- CSS_PROPERTY_MARGIN_RIGHT,
- CSS_PROPERTY_MARGIN_TOP,
- CSS_PROPERTY_MARKER_OFFSET,
- CSS_PROPERTY_MARKS,
- CSS_PROPERTY_MAX_HEIGHT,
- CSS_PROPERTY_MAX_WIDTH,
- CSS_PROPERTY_MIN_HEIGHT,
- CSS_PROPERTY_MIN_WIDTH,
- CSS_PROPERTY_OUTLINE_COLOR,
- CSS_PROPERTY_OUTLINE_STYLE,
- CSS_PROPERTY_OUTLINE_WIDTH,
- CSS_PROPERTY_OVERFLOW,
- CSS_PROPERTY_PADDING_BOTTOM,
- CSS_PROPERTY_PADDING_LEFT,
- CSS_PROPERTY_PADDING_RIGHT,
- CSS_PROPERTY_PADDING_TOP,
- CSS_PROPERTY_POSITION,
- CSS_PROPERTY_QUOTES,
- CSS_PROPERTY_RIGHT,
- CSS_PROPERTY_TEXT_ALIGN,
- CSS_PROPERTY_TEXT_DECORATION,
- CSS_PROPERTY_TEXT_INDENT,
- CSS_PROPERTY_TEXT_SHADOW,
- CSS_PROPERTY_TEXT_TRANSFORM,
- CSS_PROPERTY_TOP,
- CSS_PROPERTY_UNICODE_BIDI,
- CSS_PROPERTY_VERTICAL_ALIGN,
- CSS_PROPERTY_VISIBILITY,
- CSS_PROPERTY_WHITE_SPACE,
- CSS_PROPERTY_WIDTH,
- CSS_PROPERTY_WORD_SPACING,
- CSS_PROPERTY_Z_INDEX,
- CSS_PROPERTY_X_LINK,
- CSS_PROPERTY_X_COLSPAN,
- CSS_PROPERTY_X_ROWSPAN,
- PROPERTY_X_LINK,
- PROPERTY_X_IMG,
- PROPERTY_X_TOOLTIP,
- CSS_PROPERTY_LAST
- } Name;
-
- typedef enum {
- CSS_FONT_WEIGHT_LIGHTER = -1,
- CSS_FONT_WEIGHT_BOLDER = -2,
- CSS_FONT_WEIGHT_STEP = 300,
- /* Some special font weights. */
- CSS_FONT_WEIGHT_LIGHT = 100,
- CSS_FONT_WEIGHT_NORMAL = 400,
- CSS_FONT_WEIGHT_BOLD = 700,
- CSS_FONT_WEIGHT_MIN = 100,
- CSS_FONT_WEIGHT_MAX = 900,
- } FontWeightExtensions;
-
- Name name;
- Value value;
+ short name;
+ short type;
+ CssPropertyValue value;
inline void free () {
- switch (name) {
- case CssProperty::CSS_PROPERTY_CONTENT:
- case CssProperty::CSS_PROPERTY_FONT_FAMILY:
+ switch (type) {
+ case CSS_TYPE_STRING:
+ case CSS_TYPE_SYMBOL:
dFree (value.strVal);
break;
default:
@@ -193,16 +231,17 @@ class CssPropertyList : public lout::misc::SimpleVector <CssProperty> {
};
~CssPropertyList ();
- void set (CssProperty::Name name, CssProperty::Value value);
- inline void set (CssProperty::Name name, char *value) {
- CssProperty::Value v;
+ void set (CssPropertyName name, CssValueType type,
+ CssPropertyValue value);
+ inline void set (CssPropertyName name, CssValueType type, char *value) {
+ CssPropertyValue v;
v.strVal = value;
- set (name, v);
+ set (name, type, v);
};
- inline void set (CssProperty::Name name, int value) {
- CssProperty::Value v;
+ inline void set (CssPropertyName name, CssValueType type, int value) {
+ CssPropertyValue v;
v.intVal = value;
- set (name, v);
+ set (name, type, v);
};
void apply (CssPropertyList *props);
void print ();
diff --git a/src/cssparser.cc b/src/cssparser.cc
index 09b0c530..81e289a2 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -56,10 +56,18 @@ static const char *const Css_display_enum_vals[DISPLAY_LAST + 1] = {
"table-cell", NULL
};
+static const char *const Css_font_size_enum_vals[] = {
+ "large", "larger", "medium", "small", "smaller", "xx-large", "xx-small", "x-large", "x-small", NULL
+};
+
static const char *const Css_font_style_enum_vals[] = {
"normal", "italic", "oblique", NULL
};
+static const char *const Css_font_weight_enum_vals[] = {
+ "bold", "bolder", "light", "lighter", "normal", NULL
+};
+
static const char *const Css_list_style_type_enum_vals[] = {
"disc", "circle", "square", "decimal", "decimal-leading-zero",
"lower-roman", "upper-roman", "lower-greek", "lower-alpha",
@@ -84,94 +92,93 @@ static const char *const Css_white_space_vals[] = {
"normal", "pre", "nowrap", NULL
};
-const CssPropertyInfo Css_property_info[CssProperty::CSS_PROPERTY_LAST] = {
- {"background-attachment", CSS_TYPE_UNUSED, NULL},
- {"background-color", CSS_TYPE_COLOR, NULL},
- {"background-image", CSS_TYPE_UNUSED, NULL},
- {"background-position", CSS_TYPE_UNUSED, NULL},
- {"background-repeat", CSS_TYPE_UNUSED, NULL},
- {"border-bottom-color", CSS_TYPE_COLOR, NULL},
- {"border-bottom-style", CSS_TYPE_ENUM, Css_border_style_enum_vals},
- {"border-bottom-width", CSS_TYPE_LENGTH, NULL},
- {"border-collapse", CSS_TYPE_UNUSED, NULL},
- {"border-left-color", CSS_TYPE_COLOR, NULL},
- {"border-left-style", CSS_TYPE_ENUM, Css_border_style_enum_vals},
- {"border-left-width", CSS_TYPE_LENGTH, NULL},
- {"border-right-color", CSS_TYPE_COLOR, NULL},
- {"border-right-style", CSS_TYPE_ENUM, Css_border_style_enum_vals},
- {"border-right-width", CSS_TYPE_LENGTH, NULL},
- {"border-spacing", CSS_TYPE_LENGTH, NULL},
- {"border-top-color", CSS_TYPE_COLOR, NULL},
- {"border-top-style", CSS_TYPE_ENUM, Css_border_style_enum_vals},
- {"border-top-width", CSS_TYPE_LENGTH, NULL},
- {"bottom", CSS_TYPE_UNUSED, NULL},
- {"caption-side", CSS_TYPE_UNUSED, NULL},
- {"clear", CSS_TYPE_UNUSED, NULL},
- {"clip", CSS_TYPE_UNUSED, NULL},
- {"color", CSS_TYPE_COLOR, NULL},
- {"content", CSS_TYPE_STRING, NULL},
- {"counter-increment", CSS_TYPE_UNUSED, NULL},
- {"counter-reset", CSS_TYPE_UNUSED, NULL},
- {"cursor", CSS_TYPE_ENUM, Css_cursor_enum_vals},
- {"direction", CSS_TYPE_UNUSED, NULL},
- {"display", CSS_TYPE_ENUM, Css_display_enum_vals},
- {"empty-cells", CSS_TYPE_UNUSED, NULL},
- {"float", CSS_TYPE_UNUSED, NULL},
- {"font-family", CSS_TYPE_SYMBOL, NULL},
- {"font-size", CSS_TYPE_LENGTH_PERCENTAGE, NULL},
- {"font-size-adjust", CSS_TYPE_UNUSED, NULL},
- {"font-stretch", CSS_TYPE_UNUSED, NULL},
- {"font-style", CSS_TYPE_ENUM, Css_font_style_enum_vals},
- {"font-variant", CSS_TYPE_UNUSED, NULL},
- {"font-weight", CSS_TYPE_FONT_WEIGHT, NULL},
- {"height", CSS_TYPE_LENGTH_PERCENTAGE, NULL},
- {"left", CSS_TYPE_UNUSED, NULL},
- {"letter-spacing", CSS_TYPE_UNUSED, NULL},
- {"line-height", CSS_TYPE_UNUSED, NULL},
- {"list-style-image", CSS_TYPE_UNUSED, NULL},
- {"list-style-position", CSS_TYPE_UNUSED, NULL},
- {"list-style-type", CSS_TYPE_ENUM, Css_list_style_type_enum_vals},
- {"margin-bottom", CSS_TYPE_LENGTH, NULL},
- {"margin-left", CSS_TYPE_LENGTH, NULL},
- {"margin-right", CSS_TYPE_LENGTH, NULL},
- {"margin-top", CSS_TYPE_LENGTH, NULL},
- {"marker-offset", CSS_TYPE_UNUSED, NULL},
- {"marks", CSS_TYPE_UNUSED, NULL},
- {"max-height", CSS_TYPE_UNUSED, NULL},
- {"max-width", CSS_TYPE_UNUSED, NULL},
- {"min-height", CSS_TYPE_UNUSED, NULL},
- {"min-width", CSS_TYPE_UNUSED, NULL},
- {"outline-color", CSS_TYPE_UNUSED, NULL},
- {"outline-style", CSS_TYPE_UNUSED, NULL},
- {"outline-width", CSS_TYPE_UNUSED, NULL},
- {"overflow", CSS_TYPE_UNUSED, NULL},
- {"padding-bottom", CSS_TYPE_LENGTH, NULL},
- {"padding-left", CSS_TYPE_LENGTH, NULL},
- {"padding-right", CSS_TYPE_LENGTH, NULL},
- {"padding-top", CSS_TYPE_LENGTH, NULL},
- {"position", CSS_TYPE_UNUSED, NULL},
- {"quotes", CSS_TYPE_UNUSED, NULL},
- {"right", CSS_TYPE_UNUSED, NULL},
- {"text-align", CSS_TYPE_ENUM, Css_text_align_enum_vals},
- {"text-decoration", CSS_TYPE_MULTI_ENUM, Css_text_decoration_enum_vals},
- {"text-indent", CSS_TYPE_UNUSED, NULL},
- {"text-shadow", CSS_TYPE_UNUSED, NULL},
- {"text-transform", CSS_TYPE_UNUSED, NULL},
- {"top", CSS_TYPE_UNUSED, NULL},
- {"unicode-bidi", CSS_TYPE_UNUSED, NULL},
- {"vertical-align", CSS_TYPE_ENUM, Css_vertical_align_vals},
- {"visibility", CSS_TYPE_UNUSED, NULL},
- {"white-space", CSS_TYPE_ENUM, Css_white_space_vals},
- {"width", CSS_TYPE_LENGTH_PERCENTAGE, NULL},
- {"word-spacing", CSS_TYPE_UNUSED, NULL},
- {"z-index", CSS_TYPE_UNUSED, NULL},
+const CssPropertyInfo Css_property_info[CSS_PROPERTY_LAST] = {
+ {"background-attachment", {CSS_TYPE_UNUSED}, NULL},
+ {"background-color", {CSS_TYPE_COLOR, CSS_TYPE_UNUSED}, NULL},
+ {"background-image", {CSS_TYPE_UNUSED}, NULL},
+ {"background-position", {CSS_TYPE_UNUSED}, NULL},
+ {"background-repeat", {CSS_TYPE_UNUSED}, NULL},
+ {"border-bottom-color", {CSS_TYPE_COLOR, CSS_TYPE_UNUSED}, NULL},
+ {"border-bottom-style", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_border_style_enum_vals},
+ {"border-bottom-width", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"border-collapse", {CSS_TYPE_UNUSED}, NULL},
+ {"border-left-color", {CSS_TYPE_COLOR, CSS_TYPE_UNUSED}, NULL},
+ {"border-left-style", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_border_style_enum_vals},
+ {"border-left-width", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"border-right-color", {CSS_TYPE_COLOR, CSS_TYPE_UNUSED}, NULL},
+ {"border-right-style", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_border_style_enum_vals},
+ {"border-right-width", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"border-spacing", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"border-top-color", {CSS_TYPE_COLOR, CSS_TYPE_UNUSED}, NULL},
+ {"border-top-style", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_border_style_enum_vals},
+ {"border-top-width", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"bottom", {CSS_TYPE_UNUSED}, NULL},
+ {"caption-side", {CSS_TYPE_UNUSED}, NULL},
+ {"clear", {CSS_TYPE_UNUSED}, NULL},
+ {"clip", {CSS_TYPE_UNUSED}, NULL},
+ {"color", {CSS_TYPE_COLOR, CSS_TYPE_UNUSED}, NULL},
+ {"content", {CSS_TYPE_STRING, CSS_TYPE_UNUSED}, NULL},
+ {"counter-increment", {CSS_TYPE_UNUSED}, NULL},
+ {"counter-reset", {CSS_TYPE_UNUSED}, NULL},
+ {"cursor", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_cursor_enum_vals},
+ {"direction", {CSS_TYPE_UNUSED}, NULL},
+ {"display", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_display_enum_vals},
+ {"empty-cells", {CSS_TYPE_UNUSED}, NULL},
+ {"float", {CSS_TYPE_UNUSED}, NULL},
+ {"font-family", {CSS_TYPE_SYMBOL, CSS_TYPE_UNUSED}, NULL},
+ {"font-size", {CSS_TYPE_ENUM, CSS_TYPE_LENGTH_PERCENTAGE, CSS_TYPE_UNUSED}, Css_font_size_enum_vals},
+ {"font-size-adjust", {CSS_TYPE_UNUSED}, NULL},
+ {"font-stretch", {CSS_TYPE_UNUSED}, NULL},
+ {"font-style", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_font_style_enum_vals},
+ {"font-variant", {CSS_TYPE_UNUSED}, NULL},
+ {"font-weight", {CSS_TYPE_ENUM, CSS_TYPE_FONT_WEIGHT, CSS_TYPE_UNUSED}, Css_font_weight_enum_vals},
+ {"height", {CSS_TYPE_LENGTH_PERCENTAGE, CSS_TYPE_UNUSED}, NULL},
+ {"left", {CSS_TYPE_UNUSED}, NULL},
+ {"letter-spacing", {CSS_TYPE_UNUSED}, NULL},
+ {"line-height", {CSS_TYPE_UNUSED}, NULL},
+ {"list-style-image", {CSS_TYPE_UNUSED}, NULL},
+ {"list-style-position", {CSS_TYPE_UNUSED}, NULL},
+ {"list-style-type", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_list_style_type_enum_vals},
+ {"margin-bottom", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"margin-left", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"margin-right", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"margin-top", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"marker-offset", {CSS_TYPE_UNUSED}, NULL},
+ {"marks", {CSS_TYPE_UNUSED}, NULL},
+ {"max-height", {CSS_TYPE_UNUSED}, NULL},
+ {"max-width", {CSS_TYPE_UNUSED}, NULL},
+ {"min-height", {CSS_TYPE_UNUSED}, NULL},
+ {"min-width", {CSS_TYPE_UNUSED}, NULL},
+ {"outline-color", {CSS_TYPE_UNUSED}, NULL},
+ {"outline-style", {CSS_TYPE_UNUSED}, NULL},
+ {"outline-width", {CSS_TYPE_UNUSED}, NULL},
+ {"overflow", {CSS_TYPE_UNUSED}, NULL},
+ {"padding-bottom", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"padding-left", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"padding-right", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"padding-top", {CSS_TYPE_LENGTH, CSS_TYPE_UNUSED}, NULL},
+ {"position", {CSS_TYPE_UNUSED}, NULL},
+ {"quotes", {CSS_TYPE_UNUSED}, NULL},
+ {"right", {CSS_TYPE_UNUSED}, NULL},
+ {"text-align", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_text_align_enum_vals},
+ {"text-decoration", {CSS_TYPE_MULTI_ENUM, CSS_TYPE_UNUSED}, Css_text_decoration_enum_vals},
+ {"text-indent", {CSS_TYPE_UNUSED}, NULL},
+ {"text-shadow", {CSS_TYPE_UNUSED}, NULL},
+ {"text-transform", {CSS_TYPE_UNUSED}, NULL},
+ {"top", {CSS_TYPE_UNUSED}, NULL},
+ {"unicode-bidi", {CSS_TYPE_UNUSED}, NULL},
+ {"vertical-align", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_vertical_align_vals},
+ {"visibility", {CSS_TYPE_UNUSED}, NULL},
+ {"white-space", {CSS_TYPE_ENUM, CSS_TYPE_UNUSED}, Css_white_space_vals},
+ {"width", {CSS_TYPE_LENGTH_PERCENTAGE, CSS_TYPE_UNUSED}, NULL},
+ {"word-spacing", {CSS_TYPE_UNUSED}, NULL},
+ {"z-index", {CSS_TYPE_UNUSED}, NULL},
/* These are extensions, for internal used, and never parsed. */
- {"x-link", CSS_TYPE_INTEGER, NULL},
- {"x-colspan", CSS_TYPE_INTEGER, NULL},
- {"x-rowspan", CSS_TYPE_INTEGER, NULL},
-
- {"last", CSS_TYPE_UNUSED, NULL},
+ {"x-link", {CSS_TYPE_INTEGER, CSS_TYPE_UNUSED}, NULL},
+ {"x-colspan", {CSS_TYPE_INTEGER, CSS_TYPE_UNUSED}, NULL},
+ {"x-rowspan", {CSS_TYPE_INTEGER, CSS_TYPE_UNUSED}, NULL},
+ {"last", {CSS_TYPE_UNUSED}, NULL},
};
typedef struct {
@@ -183,124 +190,124 @@ typedef struct {
CSS_SHORTHAND_BORDER, /* special, used for 'border' */
CSS_SHORTHAND_FONT, /* special, used for 'font' */
} type;
- const CssProperty::Name * properties;/* CSS_SHORTHAND_MULTIPLE:
- * must be terminated by -1
- * CSS_SHORTHAND_DIRECTIONS:
- * must have length 4
- * CSS_SHORTHAND_BORDERS:
- * must have length 12
- * CSS_SHORTHAND_FONT:
- * unused */
+ const CssPropertyName * properties;/* CSS_SHORTHAND_MULTIPLE:
+ * must be terminated by -1
+ * CSS_SHORTHAND_DIRECTIONS:
+ * must have length 4
+ * CSS_SHORTHAND_BORDERS:
+ * must have length 12
+ * CSS_SHORTHAND_FONT:
+ * unused */
} CssShorthandInfo;
-const CssProperty::Name Css_background_properties[] = {
- CssProperty::CSS_PROPERTY_BACKGROUND_COLOR,
- CssProperty::CSS_PROPERTY_BACKGROUND_IMAGE,
- CssProperty::CSS_PROPERTY_BACKGROUND_REPEAT,
- CssProperty::CSS_PROPERTY_BACKGROUND_ATTACHMENT,
- CssProperty::CSS_PROPERTY_BACKGROUND_POSITION,
- (CssProperty::Name) - 1
+const CssPropertyName Css_background_properties[] = {
+ CSS_PROPERTY_BACKGROUND_COLOR,
+ CSS_PROPERTY_BACKGROUND_IMAGE,
+ CSS_PROPERTY_BACKGROUND_REPEAT,
+ CSS_PROPERTY_BACKGROUND_ATTACHMENT,
+ CSS_PROPERTY_BACKGROUND_POSITION,
+ (CssPropertyName) - 1
};
-const CssProperty::Name Css_border_bottom_properties[] = {
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_COLOR,
- (CssProperty::Name) - 1
+const CssPropertyName Css_border_bottom_properties[] = {
+ CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+ CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+ CSS_PROPERTY_BORDER_BOTTOM_COLOR,
+ (CssPropertyName) - 1
};
-const CssProperty::Name Css_border_color_properties[4] = {
- CssProperty::CSS_PROPERTY_BORDER_TOP_COLOR,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_COLOR,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_COLOR,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_COLOR
+const CssPropertyName Css_border_color_properties[4] = {
+ CSS_PROPERTY_BORDER_TOP_COLOR,
+ CSS_PROPERTY_BORDER_BOTTOM_COLOR,
+ CSS_PROPERTY_BORDER_LEFT_COLOR,
+ CSS_PROPERTY_BORDER_RIGHT_COLOR
};
-const CssProperty::Name Css_border_left_properties[] = {
- CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_COLOR,
- (CssProperty::Name) - 1
+const CssPropertyName Css_border_left_properties[] = {
+ CSS_PROPERTY_BORDER_LEFT_WIDTH,
+ CSS_PROPERTY_BORDER_LEFT_STYLE,
+ CSS_PROPERTY_BORDER_LEFT_COLOR,
+ (CssPropertyName) - 1
};
-const CssProperty::Name Css_border_right_properties[] = {
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_COLOR,
- (CssProperty::Name) - 1
+const CssPropertyName Css_border_right_properties[] = {
+ CSS_PROPERTY_BORDER_RIGHT_WIDTH,
+ CSS_PROPERTY_BORDER_RIGHT_STYLE,
+ CSS_PROPERTY_BORDER_RIGHT_COLOR,
+ (CssPropertyName) - 1
};
-const CssProperty::Name Css_border_style_properties[] = {
- CssProperty::CSS_PROPERTY_BORDER_TOP_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_STYLE
+const CssPropertyName Css_border_style_properties[] = {
+ CSS_PROPERTY_BORDER_TOP_STYLE,
+ CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+ CSS_PROPERTY_BORDER_LEFT_STYLE,
+ CSS_PROPERTY_BORDER_RIGHT_STYLE
};
-const CssProperty::Name Css_border_top_properties[] = {
- CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_TOP_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_TOP_COLOR,
- (CssProperty::Name) - 1
+const CssPropertyName Css_border_top_properties[] = {
+ CSS_PROPERTY_BORDER_TOP_WIDTH,
+ CSS_PROPERTY_BORDER_TOP_STYLE,
+ CSS_PROPERTY_BORDER_TOP_COLOR,
+ (CssPropertyName) - 1
};
-const CssProperty::Name Css_border_width_properties[] = {
- CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH
+const CssPropertyName Css_border_width_properties[] = {
+ CSS_PROPERTY_BORDER_TOP_WIDTH,
+ CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+ CSS_PROPERTY_BORDER_LEFT_WIDTH,
+ CSS_PROPERTY_BORDER_RIGHT_WIDTH
};
-const CssProperty::Name Css_list_style_properties[] = {
- CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE,
- CssProperty::CSS_PROPERTY_LIST_STYLE_POSITION,
- CssProperty::CSS_PROPERTY_LIST_STYLE_IMAGE,
- (CssProperty::Name) - 1
+const CssPropertyName Css_list_style_properties[] = {
+ CSS_PROPERTY_LIST_STYLE_TYPE,
+ CSS_PROPERTY_LIST_STYLE_POSITION,
+ CSS_PROPERTY_LIST_STYLE_IMAGE,
+ (CssPropertyName) - 1
};
-const CssProperty::Name Css_margin_properties[] = {
- CssProperty::CSS_PROPERTY_MARGIN_TOP,
- CssProperty::CSS_PROPERTY_MARGIN_BOTTOM,
- CssProperty::CSS_PROPERTY_MARGIN_LEFT,
- CssProperty::CSS_PROPERTY_MARGIN_RIGHT
+const CssPropertyName Css_margin_properties[] = {
+ CSS_PROPERTY_MARGIN_TOP,
+ CSS_PROPERTY_MARGIN_BOTTOM,
+ CSS_PROPERTY_MARGIN_LEFT,
+ CSS_PROPERTY_MARGIN_RIGHT
};
-const CssProperty::Name Css_outline_properties[] = {
- CssProperty::CSS_PROPERTY_OUTLINE_COLOR,
- CssProperty::CSS_PROPERTY_OUTLINE_STYLE,
- CssProperty::CSS_PROPERTY_OUTLINE_WIDTH,
- (CssProperty::Name) - 1
+const CssPropertyName Css_outline_properties[] = {
+ CSS_PROPERTY_OUTLINE_COLOR,
+ CSS_PROPERTY_OUTLINE_STYLE,
+ CSS_PROPERTY_OUTLINE_WIDTH,
+ (CssPropertyName) - 1
};
-const CssProperty::Name Css_padding_properties[] = {
- CssProperty::CSS_PROPERTY_PADDING_TOP,
- CssProperty::CSS_PROPERTY_PADDING_BOTTOM,
- CssProperty::CSS_PROPERTY_PADDING_LEFT,
- CssProperty::CSS_PROPERTY_PADDING_RIGHT
+const CssPropertyName Css_padding_properties[] = {
+ CSS_PROPERTY_PADDING_TOP,
+ CSS_PROPERTY_PADDING_BOTTOM,
+ CSS_PROPERTY_PADDING_LEFT,
+ CSS_PROPERTY_PADDING_RIGHT
};
-const CssProperty::Name Css_border_properties[] = {
- CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_TOP_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_TOP_COLOR,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_BOTTOM_COLOR,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_LEFT_COLOR,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_STYLE,
- CssProperty::CSS_PROPERTY_BORDER_RIGHT_COLOR
+const CssPropertyName Css_border_properties[] = {
+ CSS_PROPERTY_BORDER_TOP_WIDTH,
+ CSS_PROPERTY_BORDER_TOP_STYLE,
+ CSS_PROPERTY_BORDER_TOP_COLOR,
+ CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+ CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+ CSS_PROPERTY_BORDER_BOTTOM_COLOR,
+ CSS_PROPERTY_BORDER_LEFT_WIDTH,
+ CSS_PROPERTY_BORDER_LEFT_STYLE,
+ CSS_PROPERTY_BORDER_LEFT_COLOR,
+ CSS_PROPERTY_BORDER_RIGHT_WIDTH,
+ CSS_PROPERTY_BORDER_RIGHT_STYLE,
+ CSS_PROPERTY_BORDER_RIGHT_COLOR
};
-const CssProperty::Name Css_font_properties[] = {
- CssProperty::CSS_PROPERTY_FONT_SIZE,
- CssProperty::CSS_PROPERTY_FONT_STYLE,
- CssProperty::CSS_PROPERTY_FONT_VARIANT,
- CssProperty::CSS_PROPERTY_FONT_WEIGHT,
- CssProperty::CSS_PROPERTY_FONT_FAMILY,
- (CssProperty::Name) - 1
+const CssPropertyName Css_font_properties[] = {
+ CSS_PROPERTY_FONT_SIZE,
+ CSS_PROPERTY_FONT_STYLE,
+ CSS_PROPERTY_FONT_VARIANT,
+ CSS_PROPERTY_FONT_WEIGHT,
+ CSS_PROPERTY_FONT_FAMILY,
+ (CssPropertyName) - 1
};
static const CssShorthandInfo Css_shorthand_info[] = {
@@ -545,85 +552,98 @@ static void Css_next_token(CssParser * parser)
static bool Css_token_matches_property(CssParser * parser,
- CssProperty::Name prop)
+ CssPropertyName prop,
+ CssValueType * type)
{
int i, err = 1;
- switch (Css_property_info[prop].type) {
- case CSS_TYPE_ENUM:
- if (parser->ttype == CSS_TK_SYMBOL) {
- for (i = 0; Css_property_info[prop].enum_symbols[i]; i++)
- if (dStrcasecmp(parser->tval,
- Css_property_info[prop].enum_symbols[i]) == 0)
- return true;
- }
- return false;
+ for (int j = 0; Css_property_info[prop].type[j] != CSS_TYPE_UNUSED; j++) {
+ *type = Css_property_info[prop].type[j];
- case CSS_TYPE_MULTI_ENUM:
- if (parser->ttype == CSS_TK_SYMBOL) {
- if (dStrcasecmp(parser->tval, "none") != 0)
- return true;
- else {
- for (i = 0; Css_property_info[prop].enum_symbols[i]; i++) {
- if (dStrcasecmp(parser->tval,
- Css_property_info[prop].enum_symbols[i]) == 0)
- return true;
+ switch (Css_property_info[prop].type[j]) {
+
+ case CSS_TYPE_ENUM:
+ if (parser->ttype == CSS_TK_SYMBOL) {
+ for (i = 0; Css_property_info[prop].enum_symbols[i]; i++)
+ if (dStrcasecmp(parser->tval,
+ Css_property_info[prop].enum_symbols[i]) == 0)
+ return true;
}
- }
- }
- return true;
+ break;
- case CSS_TYPE_LENGTH_PERCENTAGE:
- case CSS_TYPE_LENGTH:
- return parser->ttype == CSS_TK_DECINT ||
- parser->ttype == CSS_TK_FLOAT || (parser->ttype == CSS_TK_SYMBOL
- && dStrcasecmp(parser->tval,
- "auto") == 0);
+ case CSS_TYPE_MULTI_ENUM:
+ if (parser->ttype == CSS_TK_SYMBOL) {
+ if (dStrcasecmp(parser->tval, "none") == 0)
+ return true;
+ else {
+ for (i = 0; Css_property_info[prop].enum_symbols[i]; i++) {
+ if (dStrcasecmp(parser->tval,
+ Css_property_info[prop].enum_symbols[i]) == 0)
+ return true;
+ }
+ }
+ }
+ break;
- case CSS_TYPE_COLOR:
- return (parser->ttype == CSS_TK_COLOR ||
- parser->ttype == CSS_TK_SYMBOL) &&
- a_Color_parse(parser->tval, -1, &err) != -1;
+ case CSS_TYPE_LENGTH_PERCENTAGE:
+ case CSS_TYPE_LENGTH:
+ if (parser->ttype == CSS_TK_DECINT ||
+ parser->ttype == CSS_TK_FLOAT ||
+ (parser->ttype == CSS_TK_SYMBOL && dStrcasecmp(parser->tval,
+ "auto") == 0))
+ return true;
+ break;
- case CSS_TYPE_STRING:
- return parser->ttype == CSS_TK_STRING;
+ case CSS_TYPE_COLOR:
+ if ((parser->ttype == CSS_TK_COLOR ||
+ parser->ttype == CSS_TK_SYMBOL) &&
+ a_Color_parse(parser->tval, -1, &err) != -1)
+ return true;
+ break;
- case CSS_TYPE_SYMBOL:
- return parser->ttype == CSS_TK_SYMBOL || parser->ttype == CSS_TK_STRING;
+ case CSS_TYPE_STRING:
+ if (parser->ttype == CSS_TK_STRING)
+ return true;
+ break;
- case CSS_TYPE_FONT_WEIGHT:
- if (parser->ttype == CSS_TK_DECINT) {
- i = strtol(parser->tval, NULL, 10);
- return i >= 100 && i <= 900;
- } else
- return (parser->ttype == CSS_TK_SYMBOL &&
- (dStrcasecmp(parser->tval, "normal") == 0 ||
- dStrcasecmp(parser->tval, "bold") == 0 ||
- dStrcasecmp(parser->tval, "bolder") == 0 ||
- dStrcasecmp(parser->tval, "lighter") == 0));
- break;
+ case CSS_TYPE_SYMBOL:
+ if (parser->ttype == CSS_TK_SYMBOL ||
+ parser->ttype == CSS_TK_STRING)
+ return true;
+ break;
- case CSS_TYPE_UNUSED:
- return false;
+ case CSS_TYPE_FONT_WEIGHT:
+ if (parser->ttype == CSS_TK_DECINT) {
+ i = strtol(parser->tval, NULL, 10);
+ if (i >= 100 && i <= 900)
+ return true;
+ }
+ break;
- case CSS_TYPE_INTEGER:
- /* Not used for parser values. */
- default:
- assert(false);
- return false;
+ case CSS_TYPE_UNUSED:
+ case CSS_TYPE_INTEGER:
+ /* Not used for parser values. */
+ default:
+ assert(false);
+ break;
+ }
}
+
+ *type = CSS_TYPE_UNUSED;
+ return false;
}
static bool Css_parse_value(CssParser * parser,
- CssProperty::Name prop,
- CssProperty::Value * val)
+ CssPropertyName prop,
+ CssValueType type,
+ CssPropertyValue * val)
{
int i, lentype;
bool found, ret = false;
float fval;
int ival, err = 1;
- switch (Css_property_info[prop].type) {
+ switch (type) {
case CSS_TYPE_ENUM:
if (parser->ttype == CSS_TK_SYMBOL) {
for (i = 0; Css_property_info[prop].enum_symbols[i]; i++)
@@ -694,8 +714,7 @@ static bool Css_parse_value(CssParser * parser,
lentype = CSS_LENGTH_TYPE_EX;
Css_next_token(parser);
}
- } else if (Css_property_info[prop].type ==
- CSS_TYPE_LENGTH_PERCENTAGE &&
+ } else if (type == CSS_TYPE_LENGTH_PERCENTAGE &&
parser->ttype == CSS_TK_CHAR &&
parser->tval[0] == '%') {
fval /= 100;
@@ -753,15 +772,6 @@ static bool Css_parse_value(CssParser * parser,
if (ival < 100 || ival > 900)
/* invalid */
ival = 0;
- } else if (parser->ttype == CSS_TK_SYMBOL) {
- if (dStrcasecmp(parser->tval, "normal") == 0)
- ival = CssProperty::CSS_FONT_WEIGHT_NORMAL;
- if (dStrcasecmp(parser->tval, "bold") == 0)
- ival = CssProperty::CSS_FONT_WEIGHT_BOLD;
- if (dStrcasecmp(parser->tval, "bolder") == 0)
- ival = CssProperty::CSS_FONT_WEIGHT_BOLDER;
- if (dStrcasecmp(parser->tval, "lighter") == 0)
- ival = CssProperty::CSS_FONT_WEIGHT_LIGHTER;
}
if (ival != 0) {
@@ -821,11 +831,12 @@ static void Css_parse_declaration(CssParser * parser,
CssPropertyList * props,
CssPropertyList * importantProps)
{
- CssPropertyInfo pi, *pip;
+ CssPropertyInfo pi = {NULL, {CSS_TYPE_UNUSED}, NULL}, *pip;
CssShorthandInfo si, *sip;
+ CssValueType type = CSS_TYPE_UNUSED;
- CssProperty::Name prop;
- CssProperty::Value val, dir_vals[4];
+ CssPropertyName prop;
+ CssPropertyValue val, dir_vals[4];
bool found, weight;
int sh_index, i, j, n;
int dir_set[4][4] = {
@@ -843,16 +854,17 @@ static void Css_parse_declaration(CssParser * parser,
sizeof(CssPropertyInfo),
Css_property_info_cmp);
if (pip) {
- prop = (CssProperty::Name) (pip - Css_property_info);
+ prop = (CssPropertyName) (pip - Css_property_info);
Css_next_token(parser);
if (parser->ttype == CSS_TK_CHAR && parser->tval[0] == ':') {
Css_next_token(parser);
- if (Css_parse_value(parser, prop, &val)) {
+ if (Css_token_matches_property (parser, prop, &type) &&
+ Css_parse_value(parser, prop, type, &val)) {
weight = Css_parse_weight(parser);
if (weight && importantProps)
- importantProps->set(prop, val);
+ importantProps->set(prop, type, val);
else
- props->set(prop, val);
+ props->set(prop, type, val);
}
}
} else {
@@ -882,7 +894,7 @@ static void Css_parse_declaration(CssParser * parser,
if (Css_token_matches_property(parser,
Css_shorthand_info
[sh_index].
- properties[i])) {
+ properties[i], &type)) {
found = true;
DEBUG_MSG(DEBUG_PARSE_LEVEL,
"will assign to '%s'\n",
@@ -891,15 +903,15 @@ static void Css_parse_declaration(CssParser * parser,
.properties[i]].symbol);
if (Css_parse_value(parser,
Css_shorthand_info[sh_index]
- .properties[i], &val)) {
+ .properties[i], type, &val)) {
weight = Css_parse_weight(parser);
if (weight && importantProps)
importantProps->
set(Css_shorthand_info[sh_index].
- properties[i], val);
+ properties[i], type, val);
else
props->set(Css_shorthand_info[sh_index].
- properties[i], val);
+ properties[i], type, val);
}
}
} while (found);
@@ -911,10 +923,10 @@ static void Css_parse_declaration(CssParser * parser,
if (Css_token_matches_property(parser,
Css_shorthand_info
[sh_index].
- properties[0]) &&
+ properties[0], &type) &&
Css_parse_value(parser,
Css_shorthand_info[sh_index]
- .properties[0], &val)) {
+ .properties[0], type, &val)) {
dir_vals[n] = val;
n++;
} else
@@ -927,11 +939,13 @@ static void Css_parse_declaration(CssParser * parser,
if (weight && importantProps)
importantProps->set(Css_shorthand_info[sh_index]
.properties[i],
+ type,
dir_vals[dir_set[n - 1]
[i]]);
else
props->set(Css_shorthand_info[sh_index]
.properties[i],
+ type,
dir_vals[dir_set[n - 1][i]]);
} else
MSG_CSS("no values for shorthand property '%s'\n",
@@ -947,20 +961,20 @@ static void Css_parse_declaration(CssParser * parser,
if (Css_token_matches_property(parser,
Css_shorthand_info
[sh_index].
- properties[i])) {
+ properties[i], &type)) {
found = true;
if (Css_parse_value(parser,
Css_shorthand_info[sh_index]
- .properties[i], &val)) {
+ .properties[i], type, &val)) {
weight = Css_parse_weight(parser);
for (j = 0; j < 4; j++)
if (weight && importantProps)
importantProps->
set(Css_shorthand_info[sh_index].
- properties[j * 3 + i], val);
+ properties[j * 3 + i], type, val);
else
props->set(Css_shorthand_info[sh_index].
- properties[j * 3 + i], val);
+ properties[j * 3 + i], type, val);
}
}
} while (found);
diff --git a/src/cssparser.hh b/src/cssparser.hh
index f88a780e..7fd3b5d0 100644
--- a/src/cssparser.hh
+++ b/src/cssparser.hh
@@ -6,35 +6,9 @@
/* The last three ones are never parsed. */
#define CSS_NUM_INTERNAL_PROPERTIES 3
#define CSS_NUM_PARSED_PROPERTIES \
- (CssProperty::CSS_PROPERTY_LAST - CSS_NUM_INTERNAL_PROPERTIES)
+ (CSS_PROPERTY_LAST - CSS_NUM_INTERNAL_PROPERTIES)
-typedef enum {
- CSS_TYPE_INTEGER, /* This type is only used internally, for x-*
- properties. */
- CSS_TYPE_ENUM, /* Value is i, if represented by
- enum_symbols[i]. */
- CSS_TYPE_MULTI_ENUM, /* For all enum_symbols[i], 1 << i are
- combined. */
- CSS_TYPE_LENGTH_PERCENTAGE, /* <length> or <percentage>. Represented by
- CssLength. */
- CSS_TYPE_LENGTH, /* <length>, represented as CssLength.
- Note: In some cases, CSS_TYPE_LENGTH is used
- instead of CSS_TYPE_LENGTH_PERCENTAGE,
- only because Dw cannot handle percentages
- in this particular case (e.g.
- 'margin-*-width'). */
- CSS_TYPE_COLOR, /* Represented as integer. */
- CSS_TYPE_FONT_WEIGHT, /* this very special and only used by
- 'font-weight' */
- CSS_TYPE_STRING, /* <string> */
- CSS_TYPE_SYMBOL, /* Symbols, which are directly copied (as
- opposed to CSS_TYPE_ENUM and
- CSS_TYPE_MULTI_ENUM). Used for
- 'font-family'. */
- CSS_TYPE_UNUSED /* Not yet used. Will itself get unused some
- day. */
-} CssValueType;
typedef enum {
CSS_ORIGIN_USER_AGENT,
@@ -44,7 +18,7 @@ typedef enum {
typedef struct {
const char *symbol;
- CssValueType type;
+ const CssValueType type[3];
const char *const *enum_symbols;
} CssPropertyInfo;
@@ -55,6 +29,6 @@ void a_Css_parse (CssContext *context,
CssPropertyList *a_Css_parse_declaration(const char *buf, int buflen);
-extern const CssPropertyInfo Css_property_info[CssProperty::CSS_PROPERTY_LAST];
+extern const CssPropertyInfo Css_property_info[CSS_PROPERTY_LAST];
#endif // __CSS_H__
diff --git a/src/html.cc b/src/html.cc
index 9dff41a0..92c015d5 100644
--- a/src/html.cc
+++ b/src/html.cc
@@ -340,7 +340,7 @@ void a_Html_tag_set_align_attr(DilloHtml *html,
style_attrs.textAlignChar = '.';
}
#endif
- props->set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, textAlignType);
+ props->set (CSS_PROPERTY_TEXT_ALIGN, CSS_TYPE_ENUM, textAlignType);
}
}
@@ -364,7 +364,7 @@ bool a_Html_tag_set_valign_attr(DilloHtml *html, const char *tag,
else
valign = VALIGN_MIDDLE;
- props->set (CssProperty::CSS_PROPERTY_VERTICAL_ALIGN, valign);
+ props->set (CSS_PROPERTY_VERTICAL_ALIGN, CSS_TYPE_ENUM, valign);
return true;
} else
return false;
@@ -1698,12 +1698,12 @@ static void Html_tag_open_body(DilloHtml *html, const char *tag, int tagsize)
if (color == 0xffffff && !prefs.allow_white_bg)
color = prefs.bg_color;
S_TOP(html)->current_bg_color = color;
- props.set (CssProperty::CSS_PROPERTY_BACKGROUND_COLOR, color);
+ props.set (CSS_PROPERTY_BACKGROUND_COLOR, CSS_TYPE_COLOR, color);
}
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "text"))) {
color = a_Html_color_parse(html, attrbuf, prefs.text_color);
- props.set (CssProperty::CSS_PROPERTY_COLOR, color);
+ props.set (CSS_PROPERTY_COLOR, CSS_TYPE_COLOR, color);
}
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "link")))
@@ -1788,7 +1788,7 @@ static void Html_tag_open_frame (DilloHtml *html, const char *tag, int tagsize)
html->styleEngine->setPseudoLink ();
}
- props.set (CssProperty::PROPERTY_X_LINK, Html_set_new_link(html, &url));
+ props.set (PROPERTY_X_LINK, CSS_TYPE_INTEGER, Html_set_new_link(html, &url));
html->styleEngine->setNonCssHints (&props);
textblock->addParbreak (5, html->styleEngine->wordStyle ());
@@ -1886,12 +1886,12 @@ static void Html_tag_open_font(DilloHtml *html, const char *tag, int tagsize)
color = a_Html_color_parse(html, attrbuf, -1);
}
if (color != -1)
- props.set (CssProperty::CSS_PROPERTY_COLOR, color);
+ props.set (CSS_PROPERTY_COLOR, CSS_TYPE_COLOR, color);
}
// \todo reenable font face handling when font selection is implemented
// if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "face")))
-// props.set (CssProperty::CSS_PROPERTY_FONT_FAMILY, attrbuf);
+// props.set (CSS_PROPERTY_FONT_FAMILY, CSS_TYPE_SYMBOL, attrbuf);
html->styleEngine->setNonCssHints (&props);
}
@@ -1976,9 +1976,9 @@ DilloImage *a_Html_add_new_image(DilloHtml *html, const char *tag,
MSG("a_Html_add_new_image: suspicious image size request %dx%d\n", w, h);
} else {
if (CSS_LENGTH_TYPE(l_w) != CSS_LENGTH_TYPE_AUTO)
- props.set (CssProperty::CSS_PROPERTY_WIDTH, l_w);
+ props.set (CSS_PROPERTY_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE, l_w);
if (CSS_LENGTH_TYPE(l_h) != CSS_LENGTH_TYPE_AUTO)
- props.set (CssProperty::CSS_PROPERTY_HEIGHT, l_h);
+ props.set (CSS_PROPERTY_HEIGHT, CSS_TYPE_LENGTH_PERCENTAGE, l_h);
}
/* TODO: we should scale the image respecting its ratio.
@@ -1993,8 +1993,8 @@ DilloImage *a_Html_add_new_image(DilloHtml *html, const char *tag,
space = strtol(attrbuf, NULL, 10);
if (space > 0) {
space = CSS_CREATE_LENGTH(space, CSS_LENGTH_TYPE_PX);
- props.set (CssProperty::CSS_PROPERTY_MARGIN_LEFT, space);
- props.set (CssProperty::CSS_PROPERTY_MARGIN_RIGHT, space);
+ props.set (CSS_PROPERTY_MARGIN_LEFT, CSS_TYPE_LENGTH_PERCENTAGE, space);
+ props.set (CSS_PROPERTY_MARGIN_RIGHT, CSS_TYPE_LENGTH_PERCENTAGE, space);
}
}
@@ -2003,8 +2003,8 @@ DilloImage *a_Html_add_new_image(DilloHtml *html, const char *tag,
space = strtol(attrbuf, NULL, 10);
if (space > 0) {
space = CSS_CREATE_LENGTH(space, CSS_LENGTH_TYPE_PX);
- props.set (CssProperty::CSS_PROPERTY_MARGIN_TOP, space);
- props.set (CssProperty::CSS_PROPERTY_MARGIN_BOTTOM, space);
+ props.set (CSS_PROPERTY_MARGIN_TOP, CSS_TYPE_LENGTH_PERCENTAGE, space);
+ props.set (CSS_PROPERTY_MARGIN_BOTTOM, CSS_TYPE_LENGTH_PERCENTAGE, space);
}
}
@@ -2013,22 +2013,29 @@ DilloImage *a_Html_add_new_image(DilloHtml *html, const char *tag,
border = strtol(attrbuf, NULL, 10);
if (border >= 0) {
border = CSS_CREATE_LENGTH(border, CSS_LENGTH_TYPE_PX);
- props.set (CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH, border);
- props.set (CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH, border);
- props.set (CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH, border);
- props.set (CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH, border);
-
- props.set (CssProperty::CSS_PROPERTY_BORDER_TOP_STYLE, BORDER_SOLID);
- props.set (CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+ props.set (CSS_PROPERTY_BORDER_TOP_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ border);
+ props.set (CSS_PROPERTY_BORDER_BOTTOM_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ border);
+ props.set (CSS_PROPERTY_BORDER_LEFT_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ border);
+ props.set (CSS_PROPERTY_BORDER_RIGHT_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ border);
+
+ props.set (CSS_PROPERTY_BORDER_TOP_STYLE, CSS_TYPE_ENUM,
+ BORDER_SOLID);
+ props.set (CSS_PROPERTY_BORDER_BOTTOM_STYLE, CSS_TYPE_ENUM,
+ BORDER_SOLID);
+ props.set (CSS_PROPERTY_BORDER_LEFT_STYLE, CSS_TYPE_ENUM,
+ BORDER_SOLID);
+ props.set (CSS_PROPERTY_BORDER_RIGHT_STYLE, CSS_TYPE_ENUM,
BORDER_SOLID);
- props.set (CssProperty::CSS_PROPERTY_BORDER_LEFT_STYLE, BORDER_SOLID);
- props.set (CssProperty::CSS_PROPERTY_BORDER_RIGHT_STYLE,BORDER_SOLID);
}
}
/* x_img is an index to a list of {url,image} pairs.
* We know Html_add_new_linkimage() will use size() as its next index */
- props.set (CssProperty::PROPERTY_X_IMG, html->images->size());
+ props.set (PROPERTY_X_IMG, CSS_TYPE_INTEGER, html->images->size());
html->styleEngine->setNonCssHints(&props);
@@ -2292,7 +2299,8 @@ static void Html_tag_open_object(DilloHtml *html, const char *tag, int tagsize)
html->styleEngine->setPseudoLink ();
}
- props.set(CssProperty::PROPERTY_X_LINK, Html_set_new_link(html, &url));
+ props.set(PROPERTY_X_LINK, CSS_TYPE_INTEGER,
+ Html_set_new_link(html, &url));
html->styleEngine->setNonCssHints (&props);
DW2TB(html->dw)->addText("[OBJECT]", html->styleEngine->wordStyle ());
@@ -2366,14 +2374,15 @@ static void Html_tag_open_a(DilloHtml *html, const char *tag, int tagsize)
html->InVisitedLink = true;
html->styleEngine->setPseudoVisited ();
if (html->visited_color != -1)
- props.set (CssProperty::CSS_PROPERTY_COLOR, html->visited_color);
+ props.set (CSS_PROPERTY_COLOR, CSS_TYPE_COLOR, html->visited_color);
} else {
html->styleEngine->setPseudoLink ();
if (html->link_color != -1)
- props.set (CssProperty::CSS_PROPERTY_COLOR, html->link_color);
+ props.set (CSS_PROPERTY_COLOR, CSS_TYPE_COLOR, html->link_color);
}
- props.set (CssProperty::PROPERTY_X_LINK, Html_set_new_link(html, &url));
+ props.set (PROPERTY_X_LINK, CSS_TYPE_INTEGER,
+ Html_set_new_link(html, &url));
html->styleEngine->setNonCssHints (&props);
}
@@ -2467,7 +2476,7 @@ static void Html_tag_open_ul(DilloHtml *html, const char *tag, int tagsize)
/* invalid value */
list_style_type = LIST_STYLE_TYPE_DISC;
- props.set(CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE, list_style_type);
+ props.set(CSS_PROPERTY_LIST_STYLE_TYPE, CSS_TYPE_ENUM, list_style_type);
html->styleEngine->setNonCssHints (&props);
}
@@ -2526,7 +2535,7 @@ static void Html_tag_open_ol(DilloHtml *html, const char *tag, int tagsize)
else if (*attrbuf == 'I')
listStyleType = LIST_STYLE_TYPE_UPPER_ROMAN;
- props.set (CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE, listStyleType);
+ props.set (CSS_PROPERTY_LIST_STYLE_TYPE, CSS_TYPE_ENUM, listStyleType);
html->styleEngine->setNonCssHints (&props);
}
@@ -2620,7 +2629,7 @@ static void Html_tag_open_hr(DilloHtml *html, const char *tag, int tagsize)
width_ptr = a_Html_get_attr_wdef(html, tag, tagsize, "width", NULL);
if (width_ptr) {
- props.set (CssProperty::CSS_PROPERTY_WIDTH,
+ props.set (CSS_PROPERTY_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
a_Html_parse_length (html, width_ptr));
dFree(width_ptr);
}
@@ -2632,10 +2641,10 @@ static void Html_tag_open_hr(DilloHtml *html, const char *tag, int tagsize)
/* TODO: evaluate attribute */
if (a_Html_get_attr(html, tag, tagsize, "noshade")) {
- props.set (CssProperty::CSS_PROPERTY_BORDER_TOP_STYLE, BORDER_SOLID);
- props.set (CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE, BORDER_SOLID);
- props.set (CssProperty::CSS_PROPERTY_BORDER_LEFT_STYLE, BORDER_SOLID);
- props.set (CssProperty::CSS_PROPERTY_BORDER_RIGHT_STYLE, BORDER_SOLID);
+ props.set (CSS_PROPERTY_BORDER_TOP_STYLE, CSS_TYPE_ENUM, BORDER_SOLID);
+ props.set (CSS_PROPERTY_BORDER_BOTTOM_STYLE, CSS_TYPE_ENUM, BORDER_SOLID);
+ props.set (CSS_PROPERTY_BORDER_LEFT_STYLE, CSS_TYPE_ENUM, BORDER_SOLID);
+ props.set (CSS_PROPERTY_BORDER_RIGHT_STYLE, CSS_TYPE_ENUM, BORDER_SOLID);
if (size <= 0)
size = 1;
@@ -2644,10 +2653,14 @@ static void Html_tag_open_hr(DilloHtml *html, const char *tag, int tagsize)
if (size > 0) {
CssLength size_top = CSS_CREATE_LENGTH ((size+1)/2, CSS_LENGTH_TYPE_PX);
CssLength size_bottom = CSS_CREATE_LENGTH (size / 2, CSS_LENGTH_TYPE_PX);
- props.set (CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH, size_top);
- props.set (CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH, size_top);
- props.set (CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH, size_bottom);
- props.set (CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH, size_bottom);
+ props.set (CSS_PROPERTY_BORDER_TOP_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ size_top);
+ props.set (CSS_PROPERTY_BORDER_LEFT_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ size_top);
+ props.set (CSS_PROPERTY_BORDER_BOTTOM_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ size_bottom);
+ props.set (CSS_PROPERTY_BORDER_RIGHT_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ size_bottom);
}
DW2TB(html->dw)->addParbreak (5, html->styleEngine->wordStyle ());
diff --git a/src/styleengine.cc b/src/styleengine.cc
index 369058df..a4d5003a 100644
--- a/src/styleengine.cc
+++ b/src/styleengine.cc
@@ -32,7 +32,7 @@ StyleEngine::StyleEngine (dw::core::Layout *layout) {
/* Create a dummy font, attribute, and tag for the bottom of the stack. */
font_attrs.name = prefs.font_sans_serif;
font_attrs.size = (int) (14 * prefs.font_factor + 0.5);
- font_attrs.weight = CssProperty::CSS_FONT_WEIGHT_NORMAL;
+ font_attrs.weight = 400;
font_attrs.style = FONT_STYLE_NORMAL;
style_attrs.initValues ();
@@ -169,7 +169,7 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
CssProperty *p = props->getRef (i);
switch (p->name) {
- case CssProperty::CSS_PROPERTY_FONT_FAMILY:
+ case CSS_PROPERTY_FONT_FAMILY:
// \todo handle comma separated lists of font names
if (strcmp (p->value.strVal, "serif") == 0)
fontAttrs.name = prefs.font_serif;
@@ -184,30 +184,80 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
else
fontAttrs.name = p->value.strVal;
break;
- case CssProperty::CSS_PROPERTY_FONT_SIZE:
+ case CSS_PROPERTY_FONT_SIZE:
parentFont = stack->get (stack->size () - 2).style->font;
- computeValue (&fontAttrs.size, p->value.intVal, parentFont,
- parentFont->size);
+ if (p->type == CSS_TYPE_ENUM) {
+ switch (p->value.intVal) {
+ case CSS_FONT_SIZE_XX_SMALL:
+ fontAttrs.size = (int) (11.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_X_SMALL:
+ fontAttrs.size = (int) (12.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_SMALL:
+ fontAttrs.size = (int) (13.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_MEDIUM:
+ fontAttrs.size = (int) (14.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_LARGE:
+ fontAttrs.size = (int) (15.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_X_LARGE:
+ fontAttrs.size = (int) (16.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_XX_LARGE:
+ fontAttrs.size = (int) (17.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_SMALLER:
+ fontAttrs.size -= (int) (1.0 * prefs.font_factor + 0.5);
+ break;
+ case CSS_FONT_SIZE_LARGER:
+ fontAttrs.size += (int) (1.0 * prefs.font_factor + 0.5);
+ break;
+ default:
+ assert(false); // invalid font-size enum
+ }
+ } else {
+ computeValue (&fontAttrs.size, p->value.intVal, parentFont,
+ parentFont->size);
+ }
break;
- case CssProperty::CSS_PROPERTY_FONT_STYLE:
+ case CSS_PROPERTY_FONT_STYLE:
fontAttrs.style = (FontStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_FONT_WEIGHT:
- switch (p->value.intVal) {
- case CssProperty::CSS_FONT_WEIGHT_LIGHTER:
- fontAttrs.weight -= CssProperty::CSS_FONT_WEIGHT_STEP;
- break;
- case CssProperty::CSS_FONT_WEIGHT_BOLDER:
- fontAttrs.weight += CssProperty::CSS_FONT_WEIGHT_STEP;
- break;
- default:
- fontAttrs.weight = p->value.intVal;
- break;
+ case CSS_PROPERTY_FONT_WEIGHT:
+
+ if (p->type == CSS_TYPE_ENUM) {
+ switch (p->value.intVal) {
+ case CSS_FONT_WEIGHT_BOLD:
+ fontAttrs.weight = 700;
+ break;
+ case CSS_FONT_WEIGHT_BOLDER:
+ fontAttrs.weight += 300;
+ break;
+ case CSS_FONT_WEIGHT_LIGHT:
+ fontAttrs.weight = 100;
+ break;
+ case CSS_FONT_WEIGHT_LIGHTER:
+ fontAttrs.weight -= 300;
+ break;
+ case CSS_FONT_WEIGHT_NORMAL:
+ fontAttrs.weight = 400;
+ break;
+ default:
+ assert(false); // invalid font weight value
+ break;
+ }
+ } else {
+ fontAttrs.weight = p->value.intVal;
}
- if (fontAttrs.weight < CssProperty::CSS_FONT_WEIGHT_MIN)
- fontAttrs.weight = CssProperty::CSS_FONT_WEIGHT_MIN;
- if (fontAttrs.weight > CssProperty::CSS_FONT_WEIGHT_MAX)
- fontAttrs.weight = CssProperty::CSS_FONT_WEIGHT_MAX;
+
+ if (fontAttrs.weight < 100)
+ fontAttrs.weight = 100;
+ if (fontAttrs.weight > 900)
+ fontAttrs.weight = 900;
+
break;
default:
break;
@@ -221,109 +271,109 @@ void StyleEngine::apply (StyleAttrs *attrs, CssPropertyList *props) {
switch (p->name) {
/* \todo missing cases */
- case CssProperty::CSS_PROPERTY_BACKGROUND_COLOR:
+ case CSS_PROPERTY_BACKGROUND_COLOR:
attrs->backgroundColor =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_TOP_COLOR:
+ case CSS_PROPERTY_BORDER_TOP_COLOR:
attrs->borderColor.top =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_COLOR:
+ case CSS_PROPERTY_BORDER_BOTTOM_COLOR:
attrs->borderColor.bottom =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_LEFT_COLOR:
+ case CSS_PROPERTY_BORDER_LEFT_COLOR:
attrs->borderColor.left =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_RIGHT_COLOR:
+ case CSS_PROPERTY_BORDER_RIGHT_COLOR:
attrs->borderColor.right =
Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_STYLE:
+ case CSS_PROPERTY_BORDER_BOTTOM_STYLE:
attrs->borderStyle.bottom = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_LEFT_STYLE:
+ case CSS_PROPERTY_BORDER_LEFT_STYLE:
attrs->borderStyle.left = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_RIGHT_STYLE:
+ case CSS_PROPERTY_BORDER_RIGHT_STYLE:
attrs->borderStyle.right = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_TOP_STYLE:
+ case CSS_PROPERTY_BORDER_TOP_STYLE:
attrs->borderStyle.top = (BorderStyle) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
+ case CSS_PROPERTY_BORDER_BOTTOM_WIDTH:
computeValue (&attrs->borderWidth.bottom, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH:
+ case CSS_PROPERTY_BORDER_LEFT_WIDTH:
computeValue (&attrs->borderWidth.left, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH:
+ case CSS_PROPERTY_BORDER_RIGHT_WIDTH:
computeValue (&attrs->borderWidth.right, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH:
+ case CSS_PROPERTY_BORDER_TOP_WIDTH:
computeValue (&attrs->borderWidth.top, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_BORDER_SPACING:
+ case CSS_PROPERTY_BORDER_SPACING:
computeValue (&attrs->hBorderSpacing, p->value.intVal, attrs->font);
computeValue (&attrs->vBorderSpacing, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_COLOR:
+ case CSS_PROPERTY_COLOR:
attrs->color = Color::create (layout, p->value.intVal);
break;
- case CssProperty::CSS_PROPERTY_CURSOR:
+ case CSS_PROPERTY_CURSOR:
attrs->cursor = (Cursor) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_LIST_STYLE_TYPE:
+ case CSS_PROPERTY_LIST_STYLE_TYPE:
attrs->listStyleType = (ListStyleType) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_MARGIN_BOTTOM:
+ case CSS_PROPERTY_MARGIN_BOTTOM:
computeValue (&attrs->margin.bottom, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_MARGIN_LEFT:
+ case CSS_PROPERTY_MARGIN_LEFT:
computeValue (&attrs->margin.left, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_MARGIN_RIGHT:
+ case CSS_PROPERTY_MARGIN_RIGHT:
computeValue (&attrs->margin.right, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_MARGIN_TOP:
+ case CSS_PROPERTY_MARGIN_TOP:
computeValue (&attrs->margin.top, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_TOP:
+ case CSS_PROPERTY_PADDING_TOP:
computeValue (&attrs->padding.top, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_BOTTOM:
+ case CSS_PROPERTY_PADDING_BOTTOM:
computeValue (&attrs->padding.bottom, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_LEFT:
+ case CSS_PROPERTY_PADDING_LEFT:
computeValue (&attrs->padding.left, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_PADDING_RIGHT:
+ case CSS_PROPERTY_PADDING_RIGHT:
computeValue (&attrs->padding.right, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_TEXT_ALIGN:
+ case CSS_PROPERTY_TEXT_ALIGN:
attrs->textAlign = (TextAlignType) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_TEXT_DECORATION:
+ case CSS_PROPERTY_TEXT_DECORATION:
attrs->textDecoration |= p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_VERTICAL_ALIGN:
+ case CSS_PROPERTY_VERTICAL_ALIGN:
attrs->valign = (VAlignType) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_WHITE_SPACE:
+ case CSS_PROPERTY_WHITE_SPACE:
attrs->whiteSpace = (WhiteSpace) p->value.intVal;
break;
- case CssProperty::CSS_PROPERTY_WIDTH:
+ case CSS_PROPERTY_WIDTH:
computeLength (&attrs->width, p->value.intVal, attrs->font);
break;
- case CssProperty::CSS_PROPERTY_HEIGHT:
+ case CSS_PROPERTY_HEIGHT:
computeLength (&attrs->height, p->value.intVal, attrs->font);
break;
- case CssProperty::PROPERTY_X_LINK:
+ case PROPERTY_X_LINK:
attrs->x_link = p->value.intVal;
break;
- case CssProperty::PROPERTY_X_IMG:
+ case PROPERTY_X_IMG:
attrs->x_img = p->value.intVal;
break;
diff --git a/src/table.cc b/src/table.cc
index 1bae2a4b..96a4e0ca 100644
--- a/src/table.cc
+++ b/src/table.cc
@@ -60,28 +60,33 @@ void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize)
if (border != -1) {
cssLength = CSS_CREATE_LENGTH (border, CSS_LENGTH_TYPE_PX);
- props.set (CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH, cssLength);
- props.set (CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH, cssLength);
- props.set (CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH, cssLength);
- props.set (CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH, cssLength);
+ props.set (CSS_PROPERTY_BORDER_TOP_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ cssLength);
+ props.set (CSS_PROPERTY_BORDER_BOTTOM_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ cssLength);
+ props.set (CSS_PROPERTY_BORDER_LEFT_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ cssLength);
+ props.set (CSS_PROPERTY_BORDER_RIGHT_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
+ cssLength);
}
if (cellspacing != -1) {
cssLength = CSS_CREATE_LENGTH (cellspacing, CSS_LENGTH_TYPE_PX);
- props.set (CssProperty::CSS_PROPERTY_BORDER_SPACING, cssLength);
+ props.set (CSS_PROPERTY_BORDER_SPACING, CSS_TYPE_LENGTH_PERCENTAGE,
+ cssLength);
}
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "width")))
- props.set (CssProperty::CSS_PROPERTY_WIDTH,
+ props.set (CSS_PROPERTY_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
a_Html_parse_length (html, attrbuf));
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "align"))) {
if (dStrcasecmp (attrbuf, "left") == 0)
- props.set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, TEXT_ALIGN_LEFT);
+ props.set (CSS_PROPERTY_TEXT_ALIGN, CSS_TYPE_ENUM, TEXT_ALIGN_LEFT);
else if (dStrcasecmp (attrbuf, "right") == 0)
- props.set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, TEXT_ALIGN_RIGHT);
+ props.set (CSS_PROPERTY_TEXT_ALIGN, CSS_TYPE_ENUM, TEXT_ALIGN_RIGHT);
else if (dStrcasecmp (attrbuf, "center") == 0)
- props.set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, TEXT_ALIGN_CENTER);
+ props.set (CSS_PROPERTY_TEXT_ALIGN, CSS_TYPE_ENUM, TEXT_ALIGN_CENTER);
}
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "bgcolor"))) {
@@ -90,7 +95,7 @@ void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize)
if (bgcolor == 0xffffff && !prefs.allow_white_bg)
bgcolor = prefs.bg_color;
S_TOP(html)->current_bg_color = bgcolor;
- props.set (CssProperty::CSS_PROPERTY_BACKGROUND_COLOR, bgcolor);
+ props.set (CSS_PROPERTY_BACKGROUND_COLOR, CSS_TYPE_COLOR, bgcolor);
}
}
@@ -100,18 +105,26 @@ void Html_tag_open_table(DilloHtml *html, const char *tag, int tagsize)
table_cell_props = new CssPropertyList ();
if (border > 0) {
cssLength = CSS_CREATE_LENGTH (1, CSS_LENGTH_TYPE_PX);
- table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_TOP_WIDTH, cssLength);
- table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_BOTTOM_WIDTH, cssLength);
- table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_LEFT_WIDTH, cssLength);
- table_cell_props->set (CssProperty::CSS_PROPERTY_BORDER_RIGHT_WIDTH, cssLength);
+ table_cell_props->set (CSS_PROPERTY_BORDER_TOP_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
+ table_cell_props->set (CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
+ table_cell_props->set (CSS_PROPERTY_BORDER_LEFT_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
+ table_cell_props->set (CSS_PROPERTY_BORDER_RIGHT_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
}
if (cellpadding != -1) {
cssLength = CSS_CREATE_LENGTH (cellpadding, CSS_LENGTH_TYPE_PX);
- table_cell_props->set (CssProperty::CSS_PROPERTY_PADDING_TOP, cssLength);
- table_cell_props->set (CssProperty::CSS_PROPERTY_PADDING_BOTTOM, cssLength);
- table_cell_props->set (CssProperty::CSS_PROPERTY_PADDING_LEFT, cssLength);
- table_cell_props->set (CssProperty::CSS_PROPERTY_PADDING_RIGHT, cssLength);
+ table_cell_props->set (CSS_PROPERTY_PADDING_TOP,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
+ table_cell_props->set (CSS_PROPERTY_PADDING_BOTTOM,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
+ table_cell_props->set (CSS_PROPERTY_PADDING_LEFT,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
+ table_cell_props->set (CSS_PROPERTY_PADDING_RIGHT,
+ CSS_TYPE_LENGTH_PERCENTAGE, cssLength);
}
if (S_TOP(html)->table_cell_props)
@@ -154,7 +167,7 @@ void Html_tag_open_tr(DilloHtml *html, const char *tag, int tagsize)
if (bgcolor != -1) {
if (bgcolor == 0xffffff && !prefs.allow_white_bg)
bgcolor = prefs.bg_color;
- props.set (CssProperty::CSS_PROPERTY_BACKGROUND_COLOR, bgcolor);
+ props.set (CSS_PROPERTY_BACKGROUND_COLOR, CSS_TYPE_COLOR, bgcolor);
S_TOP(html)->current_bg_color = bgcolor;
}
}
@@ -172,7 +185,8 @@ void Html_tag_open_tr(DilloHtml *html, const char *tag, int tagsize)
table_cell_props = new CssPropertyList (*S_TOP(html)->table_cell_props);
if (bgcolor != -1) {
- table_cell_props->set (CssProperty::CSS_PROPERTY_BACKGROUND_COLOR, bgcolor);
+ table_cell_props->set (CSS_PROPERTY_BACKGROUND_COLOR,
+ CSS_TYPE_COLOR, bgcolor);
new_style = true;
}
if (a_Html_tag_set_valign_attr (html, tag, tagsize, table_cell_props))
@@ -261,17 +275,17 @@ static void Html_tag_open_table_cell(DilloHtml *html,
/* text style */
if (!S_TOP(html)->cell_text_align_set) {
- props->set (CssProperty::CSS_PROPERTY_TEXT_ALIGN, text_align);
+ props->set (CSS_PROPERTY_TEXT_ALIGN, CSS_TYPE_ENUM, text_align);
}
if (a_Html_get_attr(html, tag, tagsize, "nowrap"))
- props->set (CssProperty::CSS_PROPERTY_WHITE_SPACE, WHITE_SPACE_NOWRAP);
+ props->set (CSS_PROPERTY_WHITE_SPACE, CSS_TYPE_ENUM, WHITE_SPACE_NOWRAP);
else
- props->set (CssProperty::CSS_PROPERTY_WHITE_SPACE, WHITE_SPACE_NORMAL);
+ props->set (CSS_PROPERTY_WHITE_SPACE, CSS_TYPE_ENUM, WHITE_SPACE_NORMAL);
a_Html_tag_set_align_attr (html, props, tag, tagsize);
if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "width"))) {
- props->set (CssProperty::CSS_PROPERTY_WIDTH,
+ props->set (CSS_PROPERTY_WIDTH, CSS_TYPE_LENGTH_PERCENTAGE,
a_Html_parse_length (html, attrbuf));
}
@@ -284,7 +298,7 @@ static void Html_tag_open_table_cell(DilloHtml *html,
if (bgcolor == 0xffffff && !prefs.allow_white_bg)
bgcolor = prefs.bg_color;
- props->set (CssProperty::CSS_PROPERTY_BACKGROUND_COLOR, bgcolor);
+ props->set (CSS_PROPERTY_BACKGROUND_COLOR, CSS_TYPE_COLOR, bgcolor);
S_TOP(html)->current_bg_color = bgcolor;
}
}