nikawhite pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=01431db641179b9dbc2954ae5f8d379b45b45bed

commit 01431db641179b9dbc2954ae5f8d379b45b45bed
Author: Mykyta Biliavskyi <m.biliavs...@samsung.com>
Date:   Mon Feb 29 18:03:32 2016 +0900

    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
---
 src/lib/auto_comp.c        | 11 +++++++++
 src/lib/edc_parser.c       | 61 ++++++++++++++++++++++++++++++++++++++++++++--
 src/lib/enventor_private.h |  1 +
 3 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/src/lib/auto_comp.c b/src/lib/auto_comp.c
index 12d0654..664db9e 100644
--- a/src/lib/auto_comp.c
+++ b/src/lib/auto_comp.c
@@ -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;
+}
diff --git a/src/lib/edc_parser.c b/src/lib/edc_parser.c
index a38998e..868ccb3 100644
--- a/src/lib/edc_parser.c
+++ b/src/lib/edc_parser.c
@@ -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;
diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h
index a4898ca..c16e5e9 100644
--- a/src/lib/enventor_private.h
+++ b/src/lib/enventor_private.h
@@ -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 */

-- 


Reply via email to