Enlightenment CVS committal

Author  : moom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_textblock2.c 


Log Message:
* [Textblock2] Parse tag parameters/values


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_textblock2.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- etk_textblock2.c    11 Nov 2007 17:55:51 -0000      1.9
+++ etk_textblock2.c    11 Nov 2007 21:42:01 -0000      1.10
@@ -24,6 +24,15 @@
    (color).b = (cb); \
    (color).a = (ca);
 
+#define TAG_NAME_IS(name, l) \
+   (len == (l) && strncmp(tag_start, (name), (l)) == 0)
+
+#define TAG_PARAM_IS(name, l) \
+   (len == (l) && strncmp(param_start, (name), (l)) == 0)
+
+#define TAG_VALUE_IS(name, l) \
+   (len2 == (l) && strncmp(value_start, (name), (l)) == 0)
+
 typedef struct Etk_TB2_Object_SD Etk_TB2_Object_SD;
 typedef struct Etk_TB2_Object_Line Etk_TB2_Object_Line;
 
@@ -79,6 +88,10 @@
 static Etk_Bool                  _etk_tb2_iter_is_valid(Etk_Textblock2_Iter 
*iter);
 static void                      _etk_tb2_iter_reorder(Etk_Textblock2_Iter 
*iter, Etk_Textblock2_Iter *prev);
 static void                      _etk_tb2_escaped_text_to_string(const char 
*text, int length, Etk_String *string);
+static int                       _etk_tb2_int_parse(const char *str, int 
length, int error_value);
+static float                     _etk_tb2_float_parse(const char *str, int 
length, float error_value);
+static void                      _etk_tb2_color_parse(const char *str, int 
length, Etk_Color *color);
+static int                       _etk_tb2_hex_string_get(char ch);
 
 static Etk_TB2_Object_Line      *_etk_tb2_object_line_get(Evas_Object *tbo, 
Etk_Textblock2_Line *line);
 static void                      _etk_tb2_object_line_add(Evas_Object *tbo, 
Etk_Textblock2_Line *line);
@@ -1063,17 +1076,17 @@
             tag_end = &format[i - 1];
             len = tag_end - tag_start + 1;
             
-            if (len == 1 && tag_start[0] == 'b')
+            if (TAG_NAME_IS("b", 1))
                type = ETK_TEXTBLOCK2_TAG_BOLD;
-            else if (len == 1 && tag_start[0] == 'i')
+            else if (TAG_NAME_IS("i", 1))
                type = ETK_TEXTBLOCK2_TAG_ITALIC;
-            else if (len == 1 && tag_start[0] == 'u')
+            else if (TAG_NAME_IS("u", 1))
                type = ETK_TEXTBLOCK2_TAG_UNDERLINE;
-            else if (len == 1 && tag_start[0] == 's')
+            else if (TAG_NAME_IS("s", 1))
                type = ETK_TEXTBLOCK2_TAG_STRIKETHROUGH;
-            else if (len == 5 && strncmp(tag_start, "style", 5) == 0)
+            else if (TAG_NAME_IS("style", 5))
                type = ETK_TEXTBLOCK2_TAG_STYLE;
-            else if (len == 4 && strncmp(tag_start, "font", 4) == 0)
+            else if (TAG_NAME_IS("font", 4))
                type = ETK_TEXTBLOCK2_TAG_FONT;
             else
             {
@@ -1109,17 +1122,90 @@
             
             if (!value_end)
             {
-               if (format[i] == ' ' && format[i] == '>')
+               if (format[i] == ' ' || format[i] == '>')
                {
                   value_end = &format[i - 1];
-                  if (value_start && value_start[0] == '"');
+                  if (value_start && value_start[0] == '"')
                      value_start++;
-                  if (value_end[0] == '"');
+                  if (value_end[0] == '"')
                      value_end--;
                   
-                  if ((len = param_end - param_start + 1) > 1 && (len2 = 
value_end - value_start + 1) > 1)
+                  /* Read the value of the current parameter */
+                  if ((len = param_end - param_start + 1) > 0 && (len2 = 
value_end - value_start + 1) > 0)
                   {
-                     /* TODO: parse the parameter/value... */
+                     switch (type)
+                     {
+                        /* Parameters for format "underline" */
+                        case ETK_TEXTBLOCK2_TAG_UNDERLINE:
+                           if (TAG_PARAM_IS("type", 4))
+                           {
+                              if (TAG_VALUE_IS("none", 4))
+                                 node->format->u.type = 
ETK_TEXTBLOCK2_UNDERLINE_NONE;
+                              else if (TAG_VALUE_IS("single", 6))
+                                 node->format->u.type = 
ETK_TEXTBLOCK2_UNDERLINE_SINGLE;
+                              else if (TAG_VALUE_IS("double", 6))
+                                 node->format->u.type = 
ETK_TEXTBLOCK2_UNDERLINE_DOUBLE;
+                           }
+                           else if (TAG_PARAM_IS("color1", 6))
+                              _etk_tb2_color_parse(value_start, len2, 
&node->format->u.color1);
+                           else if (TAG_PARAM_IS("color2", 6))
+                              _etk_tb2_color_parse(value_start, len2, 
&node->format->u.color2);
+                           break;
+                        
+                        /* Parameters for format "strikethrough" */
+                        case ETK_TEXTBLOCK2_TAG_STRIKETHROUGH:
+                           if (TAG_PARAM_IS("color", 5))
+                              _etk_tb2_color_parse(value_start, len2, 
&node->format->s.color);
+                           break;
+                        
+                        /* Parameters for format "font" */
+                        case ETK_TEXTBLOCK2_TAG_FONT:
+                           if (TAG_PARAM_IS("size", 4))
+                              node->format->font.size = 
_etk_tb2_int_parse(value_start, len2, -1);
+                           else if (TAG_PARAM_IS("color", 5))
+                              _etk_tb2_color_parse(value_start, len2, 
&node->format->font.color);
+                           else if (TAG_PARAM_IS("face", 4))
+                           {
+                              free(node->format->font.face);
+                              node->format->font.face = malloc(len2 + 1);
+                              strncpy(node->format->font.face, value_start, 
len2);
+                              node->format->font.face[len2] = '\0';
+                           }
+                           break;
+                        
+                        /* Parameters for format "style" */
+                        case ETK_TEXTBLOCK2_TAG_STYLE:
+                           if (TAG_PARAM_IS("effect", 6))
+                           {
+                              if (TAG_VALUE_IS("none", 4))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_NONE;
+                              else if (TAG_VALUE_IS("outline", 7))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_OUTLINE;
+                              else if (TAG_VALUE_IS("shadow", 6))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_SHADOW;
+                              else if (TAG_VALUE_IS("soft_outline", 12))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_SOFT_OUTLINE;
+                              else if (TAG_VALUE_IS("glow", 4))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_GLOW;
+                              else if (TAG_VALUE_IS("outline_shadow", 14))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_OUTLINE_SHADOW;
+                              else if (TAG_VALUE_IS("far_shadow", 10))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_FAR_SHADOW;
+                              else if (TAG_VALUE_IS("outline_soft_shadow", 19))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_OUTLINE_SOFT_SHADOW;
+                              else if (TAG_VALUE_IS("soft_shadow", 11))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_SOFT_SHADOW;
+                              else if (TAG_VALUE_IS("far_soft_shadow", 15))
+                                 node->format->style.type = 
ETK_TEXTBLOCK2_STYLE_FAR_SOFT_SHADOW;
+                           }
+                           else if (TAG_PARAM_IS("color1", 6))
+                              _etk_tb2_color_parse(value_start, len2, 
&node->format->style.color1);
+                           else if (TAG_PARAM_IS("color2", 6))
+                              _etk_tb2_color_parse(value_start, len2, 
&node->format->style.color2);
+                           break;
+                        default:
+                           break;
+                     }
                   }
                   
                   param_start = NULL;
@@ -1131,7 +1217,7 @@
          }
       }
       
-      /* The current tag is closed */
+      /* The current tag has been closed... */
       if (format[i] == '>')
       {
          type = ETK_TEXTBLOCK2_TAG_DEFAULT;
@@ -1185,7 +1271,7 @@
    
    format->type = ETK_TEXTBLOCK2_TAG_DEFAULT;
    
-   format->u.type = ETK_TEXTBLOCK2_UNDERLINE_NONE;
+   format->u.type = ETK_TEXTBLOCK2_UNDERLINE_SINGLE;
    SET_COLOR(format->u.color1, -1, -1, -1, -1);
    SET_COLOR(format->u.color2, -1, -1, -1, -1);
    
@@ -2027,6 +2113,7 @@
       
       if (text_start)
       {
+         /* A piece of text has been read: we insert it into the string */
          if (text[i + 1] == '\0' || text[i + 1] == '&' || (length >= 0 && (i + 
1) >= length))
          {
             text_end = &text[i];
@@ -2037,6 +2124,7 @@
       }
       else if (escape_start)
       {
+         /* An escape-sequence has been read: we convert it and insert the 
corresponding char into the string */
          if (text[i + 1] == '\0' || text[i] == ';' || (length >= 0 && (i + 1) 
>= length))
          {
             converted = NULL;
@@ -2062,6 +2150,109 @@
    }
 }
 
+/* Read an integer string and return its value, or "error_value" on failure */
+static int _etk_tb2_int_parse(const char *str, int length, int error_value)
+{
+   char buffer[32];
+   int value;
+   int len;
+   
+   if (!str)
+      return error_value;
+   
+   len = ETK_MIN(length, 31);
+   strncpy(buffer, str, len);
+   buffer[len] = '\0';
+   
+   if (sscanf(buffer, "%d", &value) == 1)
+      return value;
+   else
+      return error_value;
+}
+
+/* Read a float string and return its value, or "error_value" on failure */
+static float _etk_tb2_float_parse(const char *str, int length, float 
error_value)
+{
+   char buffer[32];
+   float value;
+   int len;
+   
+   if (!str)
+      return error_value;
+   
+   len = ETK_MIN(length, 31);
+   strncpy(buffer, str, len);
+   buffer[len] = '\0';
+   
+   if (sscanf(buffer, "%f", &value) == 1)
+      return value;
+   else
+      return error_value;
+}
+
+/* Reads a color string and stores the result into 'color' */
+/* TODO: Add support for common color names ("red", "blue", ...) */
+static void _etk_tb2_color_parse(const char *str, int length, Etk_Color *color)
+{
+   if (!str || !color)
+      return;
+
+   /* #RRGGBB */
+   if (length == 7)
+   {
+      color->r = (_etk_tb2_hex_string_get(str[1]) << 4) | 
(_etk_tb2_hex_string_get(str[2]));
+      color->g = (_etk_tb2_hex_string_get(str[3]) << 4) | 
(_etk_tb2_hex_string_get(str[4]));
+      color->b = (_etk_tb2_hex_string_get(str[5]) << 4) | 
(_etk_tb2_hex_string_get(str[6]));
+      color->a = 255;
+   }
+   /* #RRGGBBAA */
+   else if (length == 9)
+   {
+      color->r = (_etk_tb2_hex_string_get(str[1]) << 4) | 
(_etk_tb2_hex_string_get(str[2]));
+      color->g = (_etk_tb2_hex_string_get(str[3]) << 4) | 
(_etk_tb2_hex_string_get(str[4]));
+      color->b = (_etk_tb2_hex_string_get(str[5]) << 4) | 
(_etk_tb2_hex_string_get(str[6]));
+      color->a = (_etk_tb2_hex_string_get(str[7]) << 4) | 
(_etk_tb2_hex_string_get(str[8]));
+   }
+   /* #RGB */
+   else if (length == 4)
+   {
+      color->r = _etk_tb2_hex_string_get(str[1]);
+      color->r = (color->r << 4) | color->r;
+      color->g = _etk_tb2_hex_string_get(str[2]);
+      color->g = (color->g << 4) | color->g;
+      color->b = _etk_tb2_hex_string_get(str[3]);
+      color->b = (color->b << 4) | color->b;
+      color->a = 255;
+   }
+   /* #RGBA */
+   else if (length == 5)
+   {
+      color->r = _etk_tb2_hex_string_get(str[1]);
+      color->r = (color->r << 4) | color->r;
+      color->g = _etk_tb2_hex_string_get(str[2]);
+      color->g = (color->g << 4) | color->g;
+      color->b = _etk_tb2_hex_string_get(str[3]);
+      color->b = (color->b << 4) | color->b;
+      color->a = _etk_tb2_hex_string_get(str[4]);
+      color->a = (color->a << 4) | color->a;
+   }
+   else
+      color->r = -1;
+}
+
+/* Gets the decimal value of the hexadecimal figure */
+static int _etk_tb2_hex_string_get(char ch)
+{
+   if ((ch >= '0') && (ch <= '9'))
+      return (ch - '0');
+   else if ((ch >= 'A') && (ch <= 'F'))
+      return (ch - 'A' + 10);
+   else if ((ch >= 'a') && (ch <= 'f'))
+      return (ch - 'a' + 10);
+   else
+      return 0;
+}
+
 /**************************
  *
  * Textblock-Object's private functions
@@ -2429,12 +2620,12 @@
          {
             if (n->format->u.type == ETK_TEXTBLOCK2_UNDERLINE_SINGLE)
             {
-               evas_textblock_cursor_format_append(cursor, "+ 
underline=single");
+               evas_textblock_cursor_format_append(cursor, "+ underline=on");
                num_tags++;
             }
             else if (n->format->u.type == ETK_TEXTBLOCK2_UNDERLINE_DOUBLE)
             {
-               evas_textblock_cursor_format_append(cursor, "+ 
underline=single");
+               evas_textblock_cursor_format_append(cursor, "+ 
underline=double");
                num_tags++;
             }
             
@@ -2461,7 +2652,7 @@
                   color = n->format->font.color;
                else
                   color = default_color;
-               sprintf(format, "+ underline_color2=#%.2X%.2X%.2X%.2X", 
color.r, color.g, color.b, color.a);
+               sprintf(format, "+ underline2_color=#%.2X%.2X%.2X%.2X", 
color.r, color.g, color.b, color.a);
                evas_textblock_cursor_format_append(cursor, format);
                num_tags++;
             }



-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to