Parser: recognize keyword with context.

Uses the autocomplete context parser for recognizing keywords
with the same names in different contexts. For example:
the attributes "min" and "max" for a description context
should be integer values in range from 0 to 1000; but for a
"text" context those attributes should be boolean.

Curently add recognition for a "min" and "max" attributes in the "text" content.

@fix T2712
This commit is contained in:
Mykyta Biliavskyi 2016-02-29 18:03:32 +09:00
parent 5ec2cb8599
commit 01431db641
3 changed files with 71 additions and 2 deletions

View File

@ -922,3 +922,14 @@ autocomp_enabled_get(void)
autocomp_data *ad = g_ad;
return ad->enabled;
}
const char **
autocomp_current_context_get(void)
{
autocomp_data *ad = g_ad;
if (!ad->lexem_ptr || !ad->lexem_ptr->name)
return NULL;
return (const char **)ad->lexem_ptr->name;
}

View File

@ -27,6 +27,7 @@ typedef struct defined_macro_s
typedef struct parser_attr_s
{
Eina_Stringshare *keyword;
const char *context;
attr_value value;
} parser_attr;
@ -633,6 +634,49 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
//FIXME: construct from the configuration file.
//Context depended attributes
Eina_Array *wh = eina_array_new(2);
eina_array_push(wh, eina_stringshare_add("W:"));
eina_array_push(wh, eina_stringshare_add("H:"));
memset(&attr, 0x00, sizeof(parser_attr));
attr.keyword = eina_stringshare_add("min");
attr.value.strs = wh;
attr.value.cnt = 2;
attr.value.min = 0;
attr.value.max = 1;
attr.value.type = ATTR_VALUE_BOOLEAN;
attr.value.prepend_str = ATTR_PREPEND_COLON;
attr.value.append_str = ATTR_APPEND_SEMICOLON;
attr.context = eina_stringshare_add("text");
eina_inarray_push(td->attrs, &attr);
wh = eina_array_new(2);
eina_array_push(wh, eina_stringshare_add("W:"));
eina_array_push(wh, eina_stringshare_add("H:"));
wh = eina_array_new(2);
eina_array_push(wh, eina_stringshare_add("W:"));
eina_array_push(wh, eina_stringshare_add("H:"));
memset(&attr, 0x00, sizeof(parser_attr));
attr.keyword = eina_stringshare_add("max");
attr.value.strs = wh;
attr.value.cnt = 2;
attr.value.min = 0;
attr.value.max = 1;
attr.value.type = ATTR_VALUE_BOOLEAN;
attr.value.prepend_str = ATTR_PREPEND_COLON;
attr.value.append_str = ATTR_APPEND_SEMICOLON;
attr.context = eina_stringshare_add("text");
eina_inarray_push(td->attrs, &attr);
wh = eina_array_new(2);
eina_array_push(wh, eina_stringshare_add("W:"));
eina_array_push(wh, eina_stringshare_add("H:"));
// Context independed attributes
Eina_Array *trans = eina_array_new(11);
eina_array_push(trans, eina_stringshare_add("LINEAR"));
eina_array_push(trans, eina_stringshare_add("ACCELERATE"));
@ -899,7 +943,7 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
attr.value.append_str = ATTR_APPEND_SEMICOLON;
eina_inarray_push(td->attrs, &attr);
Eina_Array *wh = eina_array_new(2);
wh = eina_array_new(2);
eina_array_push(wh, eina_stringshare_add("W:"));
eina_array_push(wh, eina_stringshare_add("H:"));
@ -1510,10 +1554,23 @@ parser_attribute_get(parser_data *pd, const char *text, const char *cur,
}
if (instring) return NULL;
const char **cur_context = autocomp_current_context_get();
int i = 0;
EINA_INARRAY_FOREACH(pd->attrs, attr)
{
if (!strcmp(selected, attr->keyword))
return &attr->value;
{
if (!attr->context)
return &attr->value;
while (cur_context && (cur_context[i] != NULL))
{
if (!strcmp(cur_context[i], attr->context))
return &attr->value;
i++;
}
}
}
return NULL;

View File

@ -109,6 +109,7 @@ Eina_Bool autocomp_enabled_get(void);
Eina_Bool autocomp_event_dispatch(const char *key);
void autocomp_list_show(void);
void autocomp_reset(void);
const char **autocomp_current_context_get(void);
/* syntax color */