Modest/source/mycss/property/shared.c
2017-03-14 23:44:48 +03:00

1168 lines
38 KiB
C

/*
Copyright (C) 2016-2017 Alexander Borisov
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Author: lex.borisov@gmail.com (Alexander Borisov)
*/
#include "mycss/property/shared.h"
bool mycss_property_shared_switch_to_find_important(mycss_entry_t* entry)
{
entry->parser = mycss_declaration_state_colon_before_important;
return true;
}
bool mycss_property_shared_switch_to_parse_error(mycss_entry_t* entry)
{
entry->parser = mycss_declaration_state_parse_error;
return false;
}
bool mycss_property_shared_check_declaration_end(mycss_entry_t* entry, mycss_token_t* token)
{
if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) {
entry->parser = mycss_declaration_state_data;
return true;
}
else if(token->type == MyCSS_TOKEN_TYPE_DELIM && *token->data == '!') {
entry->parser = mycss_declaration_state_colon_important;
return true;
}
else if(token->type == entry->declaration->ending_token) {
mycss_entry_parser_list_pop(entry);
mycss_declaration_parser_end(entry, token);
return true;
}
return false;
}
bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_NUMBER)
return false;
mycss_values_length_t *length = mycss_values_create(entry, sizeof(mycss_values_length_t));
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
double return_num;
mycss_convert_data_to_double(str->data, str->length, &return_num, &length->is_float);
if(length->is_float)
length->value.f = (float)return_num;
else
length->value.i = (int)return_num;
*value = length;
*value_type = MyCSS_PROPERTY_VALUE__NUMBER;
return true;
}
bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_DIMENSION && token->type != MyCSS_TOKEN_TYPE_NUMBER)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
double return_num; bool is_float;
size_t consume_length = mycss_convert_data_to_double(str->data, str->length, &return_num, &is_float);
mycss_units_type_t type = mycss_units_type_by_name(&str->data[consume_length], (str->length - consume_length));
if(type == MyCSS_UNIT_TYPE_UNDEF)
if(is_float == true || (long)return_num != 0)
return false;
mycss_values_length_t *length = mycss_values_create(entry, sizeof(mycss_values_length_t));
if(is_float)
length->value.f = (float)return_num;
else
length->value.i = (int)return_num;
length->is_float = is_float;
length->type = type;
*value = length;
*value_type = MyCSS_PROPERTY_VALUE__LENGTH;
return true;
}
bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_DIMENSION)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
double return_num; bool is_float;
size_t consume_length = mycss_convert_data_to_double(str->data, str->length, &return_num, &is_float);
mycss_units_type_t type = mycss_units_type_by_name(&str->data[consume_length], (str->length - consume_length));
switch (type) {
case MyCSS_UNIT_TYPE_DPI:
case MyCSS_UNIT_TYPE_DPCM:
case MyCSS_UNIT_TYPE_DPPX:
break;
default:
return false;
}
mycss_values_resolution_t *resolution = mycss_values_create(entry, sizeof(mycss_values_resolution_t));
if(is_float)
resolution->value.f = (float)return_num;
else
resolution->value.i = (int)return_num;
resolution->is_float = is_float;
resolution->type = type;
*value = resolution;
*value_type = MyCSS_PROPERTY_VALUE__RESOLUTION;
return true;
}
bool mycss_property_shared_custom_ident(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(*value) {
mycss_values_custom_ident_t *custom_ident = *value;
mycss_token_data_to_string(entry, token, &custom_ident->str, true, false);
if(value_type)
*value_type = MyCSS_PROPERTY_VALUE__CUSTOM_IDENT;
}
else {
mycss_values_custom_ident_t *custom_ident = mycss_values_create(entry, sizeof(mycss_values_custom_ident_t));
mycss_token_data_to_string(entry, token, &custom_ident->str, true, false);
*value = custom_ident;
if(value_type)
*value_type = MyCSS_PROPERTY_VALUE__CUSTOM_IDENT;
}
return true;
}
bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_PERCENTAGE)
return false;
mycss_values_percentage_t *length = mycss_values_create(entry, sizeof(mycss_values_length_t));
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
double return_num;
mycss_convert_data_to_double(str->data, str->length, &return_num, &length->is_float);
if(length->is_float)
length->value.f = (float)return_num;
else
length->value.i = (int)return_num;
*value = length;
*value_type = MyCSS_PROPERTY_VALUE__PERCENTAGE;
return true;
}
bool mycss_property_shared_length_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
return mycss_property_shared_length(entry, token, value, value_type, str) ||
mycss_property_shared_percentage(entry, token, value, value_type, str);
}
bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed)
{
switch (token->type) {
case MyCSS_TOKEN_TYPE_FUNCTION:
{
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
const mycss_values_color_function_index_static_entry_t *color_entry =
mycss_values_color_function_index_entry_by_name(str->data, str->length);
if(color_entry) {
*value = mycss_values_create(entry, sizeof(mycss_values_color_t));
*value_type = MyCSS_PROPERTY_VALUE__COLOR;
*parser_changed = true;
entry->parser = color_entry->parser;
return true;
}
break;
}
case MyCSS_TOKEN_TYPE_IDENT:
{
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
const mycss_values_color_index_static_entry_t *color_entry =
mycss_values_color_index_entry_by_name(str->data, str->length);
if(color_entry) {
mycss_values_color_t *color = mycss_values_create(entry, sizeof(mycss_values_color_t));
color->value.name_id = color_entry->type;
color->type = MyCSS_VALUES_COLOR_TYPE_NAMED;
*value = color;
*value_type = MyCSS_PROPERTY_VALUE__COLOR;
return true;
}
break;
}
case MyCSS_TOKEN_TYPE_HASH: {
return mycss_values_color_parser_hex(entry, token, value, value_type, str);
}
default:
break;
}
return false;
}
bool mycss_property_shared_text_decoration_skip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value,
unsigned int* value_type, mycore_string_t* str, bool with_global)
{
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
unsigned int text_dec_type = mycss_property_value_type_by_name(str->data, str->length);
switch (text_dec_type) {
case MyCSS_PROPERTY_TEXT_DECORATION_SKIP_OBJECTS:
if(*value & MyCSS_VALUES_TEXT_DECORATION_SKIP_OBJECTS)
return false;
*value |= MyCSS_VALUES_TEXT_DECORATION_SKIP_OBJECTS;
entry->parser = mycss_property_parser_text_decoration_skip_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_SKIP_SPACES:
if(*value & MyCSS_VALUES_TEXT_DECORATION_SKIP_SPACES)
return false;
*value |= MyCSS_VALUES_TEXT_DECORATION_SKIP_SPACES;
entry->parser = mycss_property_parser_text_decoration_skip_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_SKIP_INK:
if(*value & MyCSS_VALUES_TEXT_DECORATION_SKIP_INK)
return false;
*value |= MyCSS_VALUES_TEXT_DECORATION_SKIP_INK;
entry->parser = mycss_property_parser_text_decoration_skip_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_SKIP_EDGES:
if(*value & MyCSS_VALUES_TEXT_DECORATION_SKIP_EDGES)
return false;
*value |= MyCSS_VALUES_TEXT_DECORATION_SKIP_EDGES;
entry->parser = mycss_property_parser_text_decoration_skip_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_SKIP_BOX_DECORATION:
if(*value & MyCSS_VALUES_TEXT_DECORATION_SKIP_BOX_DECORATION)
return false;
*value |= MyCSS_VALUES_TEXT_DECORATION_SKIP_BOX_DECORATION;
entry->parser = mycss_property_parser_text_decoration_skip_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_LINE_NONE:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
if(with_global) {
*value_type = text_dec_type;
return true;
}
break;
default:
break;
}
return false;
}
bool mycss_property_shared_text_decoration_line(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value,
unsigned int* value_type, mycore_string_t* str, bool with_global)
{
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
unsigned int text_dec_type = mycss_property_value_type_by_name(str->data, str->length);
switch (text_dec_type) {
case MyCSS_PROPERTY_TEXT_DECORATION_LINE_UNDERLINE:
*value |= MyCSS_VALUES_TEXT_DECORATION_LINE_UNDERLINE;
entry->parser = mycss_property_parser_text_decoration_line_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_LINE_OVERLINE:
*value |= MyCSS_VALUES_TEXT_DECORATION_LINE_OVERLINE;
entry->parser = mycss_property_parser_text_decoration_line_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_LINE_LINE_THROUGH:
*value |= MyCSS_VALUES_TEXT_DECORATION_LINE_LINE_THROUGH;
entry->parser = mycss_property_parser_text_decoration_line_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_LINE_BLINK:
*value |= MyCSS_VALUES_TEXT_DECORATION_LINE_BLINK;
entry->parser = mycss_property_parser_text_decoration_line_not_none;
return true;
case MyCSS_PROPERTY_TEXT_DECORATION_LINE_NONE:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
if(with_global) {
*value_type = text_dec_type;
return true;
}
/* fall through */
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
unsigned int valye_type = mycss_property_value_type_by_name(str->data, str->length);
switch (valye_type) {
case MyCSS_PROPERTY_TEXT_DECORATION_STYLE_SOLID:
case MyCSS_PROPERTY_TEXT_DECORATION_STYLE_DOUBLE:
case MyCSS_PROPERTY_TEXT_DECORATION_STYLE_DOTTED:
case MyCSS_PROPERTY_TEXT_DECORATION_STYLE_DASHED:
case MyCSS_PROPERTY_TEXT_DECORATION_STYLE_WAVY:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
*value_type = valye_type;
return true;
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
break;
default:
*value_type = MyCSS_PROPERTY_TYPE_UNDEF;
return false;
}
return true;
}
unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return MyCSS_PROPERTY_TYPE_UNDEF;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
return mycss_property_value_type_by_name(str->data, str->length);
}
bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, unsigned int check_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
if(check_type == mycss_property_value_type_by_name(str->data, str->length)) {
*value_type = check_type;
return true;
}
return false;
}
bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(mycss_property_shared_length_percentage(entry, token, value, value_type, str))
return true;
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_WIDTH_AUTO:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
break;
default:
*value_type = MyCSS_PROPERTY_TYPE_UNDEF;
return false;
}
return true;
}
bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(mycss_property_shared_length_percentage(entry, token, value, value_type, str))
return true;
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_HEIGHT_AUTO:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
break;
default:
*value_type = MyCSS_PROPERTY_TYPE_UNDEF;
return false;
}
return true;
}
bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(mycss_property_shared_length(entry, token, value, value_type, str))
return true;
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BORDER_WIDTH_THIN:
case MyCSS_PROPERTY_BORDER_WIDTH_MEDIUM:
case MyCSS_PROPERTY_BORDER_WIDTH_THICK:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
break;
default:
*value_type = MyCSS_PROPERTY_TYPE_UNDEF;
return false;
}
return true;
}
bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(mycss_property_shared_length_percentage(entry, token, value, value_type, str) ||
mycss_property_shared_number(entry, token, value, value_type, str))
{
return true;
}
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_LINE_HEIGHT_NORMAL:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
return true;
default:
break;
}
return false;
}
bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BORDER_STYLE_NONE:
case MyCSS_PROPERTY_BORDER_STYLE_HIDDEN:
case MyCSS_PROPERTY_BORDER_STYLE_DOTTED:
case MyCSS_PROPERTY_BORDER_STYLE_DASHED:
case MyCSS_PROPERTY_BORDER_STYLE_SOLID:
case MyCSS_PROPERTY_BORDER_STYLE_DOUBLE:
case MyCSS_PROPERTY_BORDER_STYLE_GROOVE:
case MyCSS_PROPERTY_BORDER_STYLE_RIDGE:
case MyCSS_PROPERTY_BORDER_STYLE_INSET:
case MyCSS_PROPERTY_BORDER_STYLE_OUTSET:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
break;
default:
*value_type = MyCSS_PROPERTY_TYPE_UNDEF;
return false;
}
return true;
}
void mycss_property_shared_destroy_string(mycore_string_t* str)
{
mycore_string_destroy(str, false);
}
bool mycss_property_shared_font_ends(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_FONT_CAPTION:
case MyCSS_PROPERTY_FONT_ICON:
case MyCSS_PROPERTY_FONT_MENU:
case MyCSS_PROPERTY_FONT_MESSAGE_BOX:
case MyCSS_PROPERTY_FONT_SMALL_CAPTION:
case MyCSS_PROPERTY_FONT_STATUS_BAR:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
return true;
default:
break;
}
return false;
}
static mycss_values_font_family_entry_t * mycss_property_shared_font_family_check(mycss_entry_t* entry, void** value)
{
if(*value == NULL)
*value = mycss_values_create(entry, sizeof(mycss_values_font_family_t));
mycss_values_font_family_t *font_family = *value;
if(font_family->entries) {
font_family->entries = mycss_values_realloc(entry, font_family->entries,
(sizeof(mycss_values_font_family_entry_t) * font_family->entries_length),
sizeof(mycss_values_font_family_entry_t));
}
else
font_family->entries = mycss_values_create(entry, sizeof(mycss_values_font_family_entry_t));
mycss_values_font_family_entry_t *ff_entry = &font_family->entries[font_family->entries_length];
font_family->entries_length++;
return ff_entry;
}
bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, bool* dont_destroy_str, mycore_string_t* str)
{
*dont_destroy_str = false;
if(token->type != MyCSS_TOKEN_TYPE_IDENT && token->type != MyCSS_TOKEN_TYPE_STRING)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
unsigned int family_type = mycss_property_value_type_by_name(str->data, str->length);
switch (family_type) {
case MyCSS_PROPERTY_FONT_FAMILY_SERIF:
case MyCSS_PROPERTY_FONT_FAMILY_SANS_SERIF:
case MyCSS_PROPERTY_FONT_FAMILY_CURSIVE:
case MyCSS_PROPERTY_FONT_FAMILY_FANTASY:
case MyCSS_PROPERTY_FONT_FAMILY_MONOSPACE: {
mycss_values_font_family_entry_t *ff_entry = mycss_property_shared_font_family_check(entry, value);
ff_entry->type = MyCSS_VALUES_FONT_FAMILY_TYPE_GENERIC;
ff_entry->value.prop_type = family_type;
return true;
}
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET: {
if(*value)
return false;
switch (*value_type) {
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
return false;
default:
*value_type = family_type;
return true;
}
}
default: {
mycss_values_font_family_entry_t *ff_entry = mycss_property_shared_font_family_check(entry, value);
ff_entry->type = MyCSS_VALUES_FONT_FAMILY_TYPE_NAME;
ff_entry->value.str = *str;
*dont_destroy_str = true;
return true;
}
}
}
bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT && token->type != MyCSS_TOKEN_TYPE_NUMBER)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_FONT_WEIGHT_NORMAL:
case MyCSS_PROPERTY_FONT_WEIGHT_BOLD:
case MyCSS_PROPERTY_FONT_WEIGHT_BOLDER:
case MyCSS_PROPERTY_FONT_WEIGHT_LIGHTER:
case MyCSS_PROPERTY_FONT_WEIGHT_100:
case MyCSS_PROPERTY_FONT_WEIGHT_200:
case MyCSS_PROPERTY_FONT_WEIGHT_300:
case MyCSS_PROPERTY_FONT_WEIGHT_400:
case MyCSS_PROPERTY_FONT_WEIGHT_500:
case MyCSS_PROPERTY_FONT_WEIGHT_600:
case MyCSS_PROPERTY_FONT_WEIGHT_700:
case MyCSS_PROPERTY_FONT_WEIGHT_800:
case MyCSS_PROPERTY_FONT_WEIGHT_900:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
return true;
default:
break;
}
return false;
}
bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(mycss_property_shared_length_percentage(entry, token, value, value_type, str))
return true;
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_FONT_SIZE_XX_SMALL:
case MyCSS_PROPERTY_FONT_SIZE_X_SMALL:
case MyCSS_PROPERTY_FONT_SIZE_SMALL:
case MyCSS_PROPERTY_FONT_SIZE_MEDIUM:
case MyCSS_PROPERTY_FONT_SIZE_LARGE:
case MyCSS_PROPERTY_FONT_SIZE_X_LARGE:
case MyCSS_PROPERTY_FONT_SIZE_XX_LARGE:
case MyCSS_PROPERTY_FONT_SIZE_LARGER:
case MyCSS_PROPERTY_FONT_SIZE_SMALLER:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
return true;
default:
break;
}
return false;
}
bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_FONT_STRETCH_NORMAL:
case MyCSS_PROPERTY_FONT_STRETCH_ULTRA_CONDENSED:
case MyCSS_PROPERTY_FONT_STRETCH_EXTRA_CONDENSED:
case MyCSS_PROPERTY_FONT_STRETCH_CONDENSED:
case MyCSS_PROPERTY_FONT_STRETCH_SEMI_CONDENSED:
case MyCSS_PROPERTY_FONT_STRETCH_SEMI_EXPANDED:
case MyCSS_PROPERTY_FONT_STRETCH_EXPANDED:
case MyCSS_PROPERTY_FONT_STRETCH_EXTRA_EXPANDED:
case MyCSS_PROPERTY_FONT_STRETCH_ULTRA_EXPANDED:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
return true;
default:
break;
}
return false;
}
bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_FONT_STYLE_NORMAL:
case MyCSS_PROPERTY_FONT_STYLE_ITALIC:
case MyCSS_PROPERTY_FONT_STYLE_OBLIQUE:
/* default values */
case MyCSS_PROPERTY_VALUE_INHERIT:
case MyCSS_PROPERTY_VALUE_INITIAL:
case MyCSS_PROPERTY_VALUE_UNSET:
return true;
default:
break;
}
return false;
}
bool mycss_property_shared_url(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type == MyCSS_TOKEN_TYPE_URL)
{
mycore_string_t *new_str = mycss_values_create(entry, sizeof(mycore_string_t));
mycss_token_data_to_string(entry, token, new_str, true, false);
*value = new_str;
*value_type = MyCSS_PROPERTY_VALUE__URL;
return true;
}
if(token->type != MyCSS_TOKEN_TYPE_FUNCTION)
return false;
if(str->length != 3)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
if(mycore_strcasecmp(str->data, "url"))
return false;
entry->parser = mycss_property_parser_url_string;
*value_type = MyCSS_PROPERTY_VALUE__URL;
return true;
}
bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed)
{
if(token->type == MyCSS_TOKEN_TYPE_URL)
{
mycss_values_image_t *image;
if(*value)
image = *value;
else
*value = image = mycss_values_create(entry, sizeof(mycss_values_image_t));
image->type = MyCSS_PROPERTY_VALUE__URL;
mycss_values_url_t *url = mycss_values_image_creator_url(entry, image);
*value_type = MyCSS_PROPERTY_VALUE__IMAGE;
mycss_token_data_to_string(entry, token, &url->str, true, false);
return true;
}
if(token->type != MyCSS_TOKEN_TYPE_FUNCTION)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
const mycss_values_image_function_index_static_entry_t *func_entry = mycss_values_image_index_entry_by_name(str->data, str->length);
if(func_entry == NULL || func_entry->type == MyCSS_PROPERTY_VALUE_UNDEF)
return false;
mycss_values_image_t *image;
if(*value)
image = *value;
else
*value = image = mycss_values_create(entry, sizeof(mycss_values_image_t));
image->type = func_entry->type;
*value_type = MyCSS_PROPERTY_VALUE__IMAGE;
func_entry->obj_creator(entry, image);
*parser_changed = true;
entry->parser = func_entry->parser;
return true;
}
bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BACKGROUND_REPEAT_X:
case MyCSS_PROPERTY_BACKGROUND_REPEAT_Y:
return true;
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BACKGROUND_REPEAT:
case MyCSS_PROPERTY_BACKGROUND_SPACE:
case MyCSS_PROPERTY_BACKGROUND_ROUND:
case MyCSS_PROPERTY_BACKGROUND_NO_REPEAT:
return true;
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BACKGROUND_ATTACHMENT_FIXED:
case MyCSS_PROPERTY_BACKGROUND_ATTACHMENT_LOCAL:
case MyCSS_PROPERTY_BACKGROUND_ATTACHMENT_SCROLL:
return true;
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str)
{
if(mycss_property_shared_length_percentage(entry, token, value, value_type, str))
return true;
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BACKGROUND_POSITION_LEFT:
case MyCSS_PROPERTY_BACKGROUND_POSITION_CENTER:
case MyCSS_PROPERTY_BACKGROUND_POSITION_RIGHT:
case MyCSS_PROPERTY_BACKGROUND_POSITION_TOP:
case MyCSS_PROPERTY_BACKGROUND_POSITION_BOTTOM:
return true;
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BACKGROUND_CLIP_BORDER_BOX:
case MyCSS_PROPERTY_BACKGROUND_CLIP_PADDING_BOX:
case MyCSS_PROPERTY_BACKGROUND_CLIP_CONTENT_BOX:
return true;
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str)
{
if(mycss_property_shared_length_percentage(entry, token, value, value_type, str))
return true;
if(token->type != MyCSS_TOKEN_TYPE_IDENT)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
*value_type = mycss_property_value_type_by_name(str->data, str->length);
switch (*value_type) {
case MyCSS_PROPERTY_BACKGROUND_SIZE_AUTO:
case MyCSS_PROPERTY_BACKGROUND_SIZE_COVER:
case MyCSS_PROPERTY_BACKGROUND_SIZE_CONTAIN:
return true;
default:
*value_type = MyCSS_PROPERTY_VALUE_UNDEF;
break;
}
return false;
}
bool mycss_property_shared_function_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_FUNCTION)
return false;
if(str->length != 5)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
if(mycore_strcasecmp(str->data, "image"))
return false;
entry->parser = NULL;
*value_type = MyCSS_PROPERTY_VALUE__URL;
return true;
}
bool mycss_property_shared_function_image_set(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_FUNCTION)
return false;
if(str->length != 9)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
if(mycore_strcasecmp(str->data, "image-set"))
return false;
entry->parser = NULL;
*value_type = MyCSS_PROPERTY_VALUE__URL;
return true;
}
bool mycss_property_shared_element(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str)
{
if(token->type != MyCSS_TOKEN_TYPE_FUNCTION)
return false;
if(str->length != 10)
return false;
if(str->data == NULL)
mycss_token_data_to_string(entry, token, str, true, false);
if(mycore_strcasecmp(str->data, "cross-fade"))
return false;
entry->parser = NULL;
*value_type = MyCSS_PROPERTY_VALUE__URL;
return true;
}