diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/css.cc | 27 | ||||
-rw-r--r-- | src/css.hh | 275 | ||||
-rw-r--r-- | src/cssparser.cc | 536 | ||||
-rw-r--r-- | src/cssparser.hh | 32 | ||||
-rw-r--r-- | src/html.cc | 89 | ||||
-rw-r--r-- | src/styleengine.cc | 158 | ||||
-rw-r--r-- | src/table.cc | 64 |
7 files changed, 648 insertions, 533 deletions
@@ -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 () { @@ -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; } } |