mirror of
https://github.com/lexborisov/Modest
synced 2024-11-22 13:51:39 +03:00
1168 lines
38 KiB
C
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;
|
|
}
|
|
|
|
|