Enlightenment CVS committal

Author  : moom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_textblock2.c 


Log Message:
* [Textblock2] More work on formatting


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_textblock2.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- etk_textblock2.c    10 Nov 2007 18:09:18 -0000      1.7
+++ etk_textblock2.c    11 Nov 2007 14:40:55 -0000      1.8
@@ -18,6 +18,12 @@
  * @{
  */
 
+#define SET_COLOR(color, cr, cg, cb, ca) \
+   (color).r = (cr); \
+   (color).g = (cg); \
+   (color).b = (cb); \
+   (color).a = (ca);
+
 typedef struct Etk_TB2_Object_SD Etk_TB2_Object_SD;
 typedef struct Etk_TB2_Object_Line Etk_TB2_Object_Line;
 
@@ -1004,10 +1010,133 @@
  */
 void etk_textblock2_node_format_apply(Etk_Textblock2_Node *node, const char 
*format)
 {
+   Etk_Textblock2_Tag_Type type;
+   const char *tag_start, *tag_end;
+   const char *param_start, *param_end;
+   const char *value_start, *value_end;
+   Etk_Bool close;
+   int len, len2;
+   int i;
+   
    if (!node || !format)
       return;
    
+   if (!node->format)
+      node->format = etk_textblock2_format_new();
    
+   type = ETK_TEXTBLOCK2_TAG_DEFAULT;
+   tag_start = NULL;
+   tag_end = NULL;
+   param_start = NULL;
+   param_end = NULL;
+   value_start = NULL;
+   value_end = NULL;
+   close = ETK_FALSE;
+   
+   for (i = 0; format[i] != '\0'; i++)
+   {
+      /* Read the tag-name */
+      if (!tag_start)
+      {
+         if (format[i] == '<')
+         {
+            if (format[i + 1] == '/')
+            {
+               close = ETK_TRUE;
+               i++;
+            }
+            tag_start = &format[i + 1];
+         }
+      }
+      else if (!tag_end)
+      {
+         if (format[i] == '>' || format[i] == ' ')
+         {
+            tag_end = &format[i - 1];
+            len = tag_end - tag_start + 1;
+            
+            if (len == 1 && tag_start[0] == 'b')
+               type = ETK_TEXTBLOCK2_TAG_BOLD;
+            else if (len == 1 && tag_start[0] == 'i')
+               type = ETK_TEXTBLOCK2_TAG_ITALIC;
+            else if (len == 1 && tag_start[0] == 'u')
+               type = ETK_TEXTBLOCK2_TAG_UNDERLINE;
+            else if (len == 1 && tag_start[0] == 's')
+               type = ETK_TEXTBLOCK2_TAG_STRIKETHROUGH;
+            else if (len == 5 && strncmp(tag_start, "style", 5) == 0)
+               type = ETK_TEXTBLOCK2_TAG_STYLE;
+            else if (len == 4 && strncmp(tag_start, "font", 4) == 0)
+               type = ETK_TEXTBLOCK2_TAG_FONT;
+            else
+            {
+               printf("%d\n", len);
+               ETK_WARNING("The format \"%s\" is not supported by the 
textblock", format);
+               return;
+            }
+            
+            if (close)
+               node->format->type &= ~type;
+            else
+               node->format->type |= type;
+         }
+      }
+      
+      /* Read the parameters */
+      if (tag_start && tag_end)
+      {
+         if (!param_start)
+         {
+            if (format[i] != ' ' && format[i] != '>')
+               param_start = &format[i];
+         }
+         else
+         {
+            if (!value_start)
+            {
+               if (format[i] == '=')
+               {
+                  value_start = &format[i + 1];
+                  param_end = &format[i - 1];
+               }
+            }
+            
+            if (!value_end)
+            {
+               if (format[i] == ' ' && format[i] == '>')
+               {
+                  value_end = &format[i - 1];
+                  if (value_start && value_start[0] == '"');
+                     value_start++;
+                  if (value_end[0] == '"');
+                     value_end--;
+                  
+                  if ((len = param_end - param_start + 1) > 1 && (len2 = 
value_end - value_start + 1) > 1)
+                  {
+                     /* TODO: parse the parameter/value... */
+                  }
+                  
+                  param_start = NULL;
+                  param_end = NULL;
+                  value_start = NULL;
+                  value_end = NULL;
+               }
+            }
+         }
+      }
+      
+      /* The current tag is closed */
+      if (format[i] == '>')
+      {
+         type = ETK_TEXTBLOCK2_TAG_DEFAULT;
+         tag_start = NULL;
+         tag_end = NULL;
+         param_start = NULL;
+         param_end = NULL;
+         value_start = NULL;
+         value_end = NULL;
+         close = ETK_FALSE;
+      }
+   }
 }
 
 /**************************
@@ -1044,7 +1173,25 @@
  */
 void etk_textblock2_format_reset(Etk_Textblock2_Format *format)
 {
-   /* TODO */
+   if (!format)
+      return;
+   
+   format->type = ETK_TEXTBLOCK2_TAG_DEFAULT;
+   
+   format->u.type = ETK_TEXTBLOCK2_UNDERLINE_NONE;
+   SET_COLOR(format->style.color2, -1, -1, -1, -1);
+   SET_COLOR(format->style.color2, -1, -1, -1, -1);
+   
+   SET_COLOR(format->style.color2, -1, -1, -1, -1);
+   
+   format->style.type = ETK_TEXTBLOCK2_STYLE_NONE;
+   SET_COLOR(format->style.color2, -1, -1, -1, -1);
+   SET_COLOR(format->style.color2, -1, -1, -1, -1);
+   
+   free(format->font.face);
+   format->font.face = NULL;
+   format->font.size = -1;
+   SET_COLOR(format->style.color2, -1, -1, -1, -1);
 }
 
 /**
@@ -2201,6 +2348,8 @@
 {
    Etk_Textblock2_Node *n;
    Evas_Textblock_Cursor *cursor;
+   int num_tags;
+   int i;
    
    if (!lo || !line)
       return;
@@ -2209,8 +2358,33 @@
    cursor = evas_object_textblock_cursor_new(lo);
    for (n = line->nodes; n; n = n->next)
    {
-      /* TODO: apply format */
-      evas_textblock_cursor_text_prepend(cursor, etk_string_get(n->text));
+      /* Inserts format nodes */
+      num_tags = 0;
+      if (n->format)
+      {
+         if ((n->format->type & ETK_TEXTBLOCK2_TAG_BOLD) && (n->format->type & 
ETK_TEXTBLOCK2_TAG_ITALIC))
+         {
+            evas_textblock_cursor_format_append(cursor, "+ 
font=Vera-Bold-Italic");
+            num_tags++;
+         }
+         else if (n->format->type & ETK_TEXTBLOCK2_TAG_BOLD)
+         {
+            evas_textblock_cursor_format_append(cursor, "+ font=Vera-Bold");
+            num_tags++;
+         }
+         else if (n->format->type & ETK_TEXTBLOCK2_TAG_ITALIC)
+         {
+            evas_textblock_cursor_format_append(cursor, "+ font=Vera-Italic");
+            num_tags++;
+         }
+      }
+      
+      /* Insert the text */
+      evas_textblock_cursor_text_append(cursor, etk_string_get(n->text));
+      
+      /* Close the format nodes */
+      for (i = 0; i < num_tags; i++)
+         evas_textblock_cursor_format_append(cursor, "-");
    }
    evas_textblock_cursor_free(cursor);
 }



-------------------------------------------------------------------------
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