better escaping!
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 22 Oct 2008 04:44:22 +0000 (04:44 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 22 Oct 2008 04:44:22 +0000 (04:44 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@36954 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Evas.h
src/lib/canvas/evas_object_textblock.c

index 5723feb..a4c1f2b 100644 (file)
@@ -624,6 +624,9 @@ extern "C" {
      } Evas_Textblock_Text_Type;
    
    EAPI Evas_Object                 *evas_object_textblock_add(Evas *e);
+
+   EAPI const char                  *evas_textblock_escape_string_get(const char *escape);
+   EAPI const char                  *evas_textblock_string_escape_get(const char *string, int *len_ret);
    
    EAPI Evas_Textblock_Style        *evas_textblock_style_new(void);
    EAPI void                         evas_textblock_style_free(Evas_Textblock_Style *ts);
index fae1966..a3217dc 100644 (file)
@@ -530,184 +530,153 @@ _nodes_adjacent_merge(const Evas_Object *obj, Evas_Object_Textblock_Node *n1)
  */
 static const char escape_strings[] =
        /* most common escaped stuff */
-       "&lt;\0\x3c\0"
-       "&gt;\0\x3e\0"
-       "&amp;\0\x26\0"
-       " \0\x20\0" /* NOTE: this here to avoid escaping to &nbsp */
-       "&nbsp;\0\x20\0" /* NOTE: we allow nsbp's to break as we map early - maybe map to ascii 0x01 and then make the rendering code think 0x01 -> 0x20 */
-       "&quot;\0\x22\0"
+       " \0"          "\x20\0" /* NOTE: this here to avoid escaping to &nbsp */
+       "&nbsp;\0"     "\x20\0" /* NOTE: we allow nsbp's to break as we map early - maybe map to ascii 0x01 and then make the rendering code think 0x01 -> 0x20 */
+       "&quot;\0"     "\x22\0"
+       "&amp;\0"      "\x26\0"
+       "&lt;\0"       "\x3c\0"
+       "&gt;\0"       "\x3e\0"
        /* all the rest */
-       "&copy;\0\xc2\xa9\0"
-       "&reg;\0\xc2\xae\0"
-       "&hellip;\0\xe2\x80\xa6\0"
-       "&Ntilde;\0\xc3\x91\0"
-       "&ntilde;\0\xc3\xb1\0"
-       "&Ccedil;\0\xc3\x87\0"
-       "&ccedil;\0\xc3\xa7\0"
-       "&szlig;\0\xc3\x9f\0"
-       "&THORN;\0\xc3\x9e\0"
-       "&thorn;\0\xc3\xbe\0"
-       "&ETH;\0\xc3\x90\0"
-       "&eth;\0\xc3\xb0\0"
-       "&acute;\0\xc2\xb4\0"
-       "&cedil;\0\xc2\xb8\0"
-       "&deg;\0\xc2\xb0\0"
-       "&uml;\0\xc2\xa8\0"
-       "&cent;\0\xc2\xa2\0"
-       "&pound;\0\xc2\xa3\0"
-       "&curren;\0\xc2\xa4\0"
-       "&yen;\0\xc2\xa5\0"
-       "&euro;\0\xe2\x82\xac\0"
-       "&sect;\0\xc2\xa7\0"
-       "&para;\0\xc2\xb6\0"
-       "&laquo;\0\xc2\xab\0"
-       "&raquo;\0\xc2\xbb\0"
-       "&iexcl;\0\xc2\xa1\0"
-       "&iquest;\0\xc2\xbf\0"
-       "&brvbar;\0\xc2\xa6\0"
-       "&ordf;\0\xc2\xaa\0"
-       "&ordm;\0\xc2\xba\0"
-       "&micro;\0\xc2\xb5\0"
-       "&macr;\0\xc2\xaf\0"
-       "&oplus;\0\xe2\x8a\x95\0"
-       "&int;\0\xe2\x88\xab\0"
-       "&sum;\0\xe2\x88\x91\0"
-       "&prod;\0\xe2\x88\x8f\0"
-       "&perp;\0\xe2\x8a\xa5\0"
-       "&or;\0\xe2\x88\xa8\0"
-       "&and;\0\xe2\x88\xa7\0"
-       "&equiv;\0\xe2\x89\xa1\0"
-       "&ne;\0\xe2\x89\xa0\0"
-       "&forall;\0\xe2\x88\x80\0"
-       "&exist;\0\xe2\x88\x83\0"
-       "&nabla;\0\xe2\x88\x87\0"
-       "&larr;\0\xe2\x86\x90\0"
-       "&rarr;\0\xe2\x86\x92\0"
-       "&uarr;\0\xe2\x86\x91\0"
-       "&darr;\0\xe2\x86\x93\0"
-       "&harr;\0\xe2\x86\x94\0"
-       "&lArr;\0\xe2\x87\x90\0"
-       "&rArr;\0\xe2\x87\x92\0"
-       "&plusmn;\0\xc2\xb1\0"
-       "&middot;\0\xc2\xb7\0"
-       "&times;\0\xc3\x97\0"
-       "&divide;\0\xc3\xb7\0"
-       "&sup1;\0\xc2\xb9\0"
-       "&sup2;\0\xc2\xb2\0"
-       "&sup3;\0\xc2\xb3\0"
-       "&frac14;\0\xc2\xbc\0"
-       "&frac12;\0\xc2\xbd\0"
-       "&frac34;\0\xc2\xbe\0"
-       "&not;\0\xc2\xac\0"
-       "&Aacute;\0\xc3\x81\0"
-       "&Eacute;\0\xc3\x89\0"
-       "&Iacute;\0\xc3\x8d\0"
-       "&Oacute;\0\xc3\x93\0"
-       "&Uacute;\0\xc3\x9a\0"
-       "&Yacute;\0\xc3\x9d\0"
-       "&aacute;\0\xc3\xa1\0"
-       "&eacute;\0\xc3\xa9\0"
-       "&iacute;\0\xc3\xad\0"
-       "&oacute;\0\xc3\xb3\0"
-       "&uacute;\0\xc3\xba\0"
-       "&yacute;\0\xc3\xbd\0"
-       "&Acirc;\0\xc3\x82\0"
-       "&Ecirc;\0\xc3\x8a\0"
-       "&Icirc;\0\xc3\x8e\0"
-       "&Ocirc;\0\xc3\x94\0"
-       "&Ucirc;\0\xc3\x9b\0"
-       "&acirc;\0\xc3\xa2\0"
-       "&ecirc;\0\xc3\xaa\0"
-       "&icirc;\0\xc3\xae\0"
-       "&ocirc;\0\xc3\xb4\0"
-       "&ucirc;\0\xc3\xbb\0"
-       "&Agrave;\0\xc3\x80\0"
-       "&Egrave;\0\xc3\x88\0"
-       "&Igrave;\0\xc3\x8c\0"
-       "&Ograve;\0\xc3\x92\0"
-       "&Ugrave;\0\xc3\x99\0"
-       "&agrave;\0\xc3\xa0\0"
-       "&egrave;\0\xc3\xa8\0"
-       "&igrave;\0\xc3\xac\0"
-       "&ograve;\0\xc3\xb2\0"
-       "&ugrave;\0\xc3\xb9\0"
-       "&Auml;\0\xc3\x84\0"
-       "&Euml;\0\xc3\x8b\0"
-       "&Iuml;\0\xc3\x8f\0"
-       "&Ouml;\0\xc3\x96\0"
-       "&auml;\0\xc3\xa4\0"
-       "&euml;\0\xc3\xab\0"
-       "&iuml;\0\xc3\xaf\0"
-       "&ouml;\0\xc3\xb6\0"
-       "&uuml;\0\xc3\xbc\0"
-       "&yuml;\0\xc3\xbf\0"
-       "&Atilde;\0\xc3\x83\0"
-       "&atilde;\0\xc3\xa3\0"
-       "&Otilde;\0\xc3\x95\0"
-       "&otilde;\0\xc3\xb5\0"
-       "&aring;\0\xc3\xa5\0"
-       "&Aring;\0\xc3\x85\0"
-       "&Oslash;\0\xc3\x98\0"
-       "&oslash;\0\xc3\xb8\0"
-       "&AElig;\0\xc3\x86\0"
-       "&aelig;\0\xc3\xa6\0"
-       "&Ntilde;\0\xc3\x91\0"
-       "&ntilde;\0\xc3\xb1\0"
-       "&Ccedil;\0\xc3\x87\0"
-       "&ccedil;\0\xc3\xa7\0"
-       "&szlig;\0\xc3\x9f\0"
-       "&THORN;\0\xc3\x9e\0"
-       "&thorn;\0\xc3\xbe\0"
-       "&ETH;\0\xc3\x90\0"
-       "&eth;\0\xc3\xb0\0"
-       "&alpha;\0\xce\xb1\0"
-       "&beta;\0\xce\xb2\0"
-       "&gamma;\0\xce\xb3\0"
-       "&delta;\0\xce\xb4\0"
-       "&epsilon;\0\xce\xb5\0"
-       "&zeta;\0\xce\xb6\0"
-       "&eta;\0\xce\xb7\0"
-       "&theta;\0\xce\xb8\0"
-       "&iota;\0\xce\xb9\0"
-       "&kappa;\0\xce\xba\0"
-       "&lambda;\0\xce\xbb\0"
-       "&mu;\0\xce\xbc\0"
-       "&nu;\0\xce\xbd\0"
-       "&omicron;\0\xce\xbf\0"
-       "&xi;\0\xce\xbe\0"
-       "&pi;\0\xcf\x80\0"
-       "&rho;\0\xcf\x81\0"
-       "&sigma;\0\xcf\x83\0"
-       "&tau;\0\xcf\x84\0"
-       "&upsilon;\0\xcf\x85\0"
-       "&phi;\0\xcf\x86\0"
-       "&chi;\0\xcf\x87\0"
-       "&psi;\0\xcf\x88\0"
-       "&omega;\0\xcf\x89\0"
-       "&Alpha;\0\xce\x91\0"
-       "&Beta;\0\xce\x92\0"
-       "&Gamma;\0\xce\x93\0"
-       "&Delta;\0\xce\x94\0"
-       "&Epsilon;\0\xce\x95\0"
-       "&Zeta;\0\xce\x96\0"
-       "&Eta;\0\xce\x97\0"
-       "&Theta;\0\xce\x98\0"
-       "&Iota;\0\xce\x99\0"
-       "&Kappa;\0\xce\x9a\0"
-       "&Lambda;\0\xce\x9b\0"
-       "&Mu;\0\xce\x9c\0"
-       "&Nu;\0\xce\x9d\0"
-       "&Omicron;\0\xce\x9f\0"
-       "&Xi;\0\xce\x9e\0"
-       "&Pi;\0\xce\xa0\0"
-       "&Rho;\0\xce\xa1\0"
-       "&Sigma;\0\xce\xa3\0"
-       "&Tau;\0\xce\xa4\0"
-       "&Upsilon;\0\xce\xa5\0"
-       "&Phi;\0\xce\xa6\0"
-       "&Chi;\0\xce\xa7\0"
-       "&Psi;\0\xce\xa8\0"
-       "&Omega;\0\xce\xa9\0"
+       "&iexcl;\0"    "\xc2\xa1\0"
+       "&cent;\0"     "\xc2\xa2\0"
+       "&pound;\0"    "\xc2\xa3\0"
+       "&curren;\0"   "\xc2\xa4\0"
+       "&yen;\0"      "\xc2\xa5\0"
+       "&brvbar;\0"   "\xc2\xa6\0"
+       "&sect;\0"     "\xc2\xa7\0"
+       "&uml;\0"      "\xc2\xa8\0"
+       "&copy;\0"     "\xc2\xa9\0"
+       "&ordf;\0"     "\xc2\xaa\0"
+       "&laquo;\0"    "\xc2\xab\0"
+       "&not;\0"      "\xc2\xac\0"
+       "&reg;\0"      "\xc2\xae\0"
+       "&macr;\0"     "\xc2\xaf\0"
+       "&deg;\0"      "\xc2\xb0\0"
+       "&plusmn;\0"   "\xc2\xb1\0"
+       "&sup2;\0"     "\xc2\xb2\0"
+       "&sup3;\0"     "\xc2\xb3\0"
+       "&acute;\0"    "\xc2\xb4\0"
+       "&micro;\0"    "\xc2\xb5\0"
+       "&para;\0"     "\xc2\xb6\0"
+       "&middot;\0"   "\xc2\xb7\0"
+       "&cedil;\0"    "\xc2\xb8\0"
+       "&sup1;\0"     "\xc2\xb9\0"
+       "&ordm;\0"     "\xc2\xba\0"
+       "&raquo;\0"    "\xc2\xbb\0"
+       "&frac14;\0"   "\xc2\xbc\0"
+       "&frac12;\0"   "\xc2\xbd\0"
+       "&frac34;\0"   "\xc2\xbe\0"
+       "&iquest;\0"   "\xc2\xbf\0"
+       "&agrave;\0"   "\xc3\x80\0"
+       "&aacute;\0"   "\xc3\x81\0"
+       "&acirc;\0"    "\xc3\x82\0"
+       "&atilde;\0"   "\xc3\x83\0"
+       "&auml;\0"     "\xc3\x84\0"
+       "&aring;\0"    "\xc3\x85\0"
+       "&aelig;\0"    "\xc3\x86\0"
+       "&ccedil;\0"   "\xc3\x87\0"
+       "&ccedil;\0"   "\xc3\x87\0"
+       "&egrave;\0"   "\xc3\x88\0"
+       "&eacute;\0"   "\xc3\x89\0"
+       "&ecirc;\0"    "\xc3\x8a\0"
+       "&euml;\0"     "\xc3\x8b\0"
+       "&igrave;\0"   "\xc3\x8c\0"
+       "&iacute;\0"   "\xc3\x8d\0"
+       "&icirc;\0"    "\xc3\x8e\0"
+       "&iuml;\0"     "\xc3\x8f\0"
+       "&eth;\0"      "\xc3\x90\0"
+       "&ntilde;\0"   "\xc3\x91\0"
+       "&ntilde;\0"   "\xc3\x91\0"
+       "&ograve;\0"   "\xc3\x92\0"
+       "&oacute;\0"   "\xc3\x93\0"
+       "&ocirc;\0"    "\xc3\x94\0"
+       "&otilde;\0"   "\xc3\x95\0"
+       "&ouml;\0"     "\xc3\x96\0"
+       "&times;\0"    "\xc3\x97\0"
+       "&oslash;\0"   "\xc3\x98\0"
+       "&ugrave;\0"   "\xc3\x99\0"
+       "&uacute;\0"   "\xc3\x9a\0"
+       "&ucirc;\0"    "\xc3\x9b\0"
+       "&yacute;\0"   "\xc3\x9d\0"
+       "&thorn;\0"    "\xc3\x9e\0"
+       "&szlig;\0"    "\xc3\x9f\0"
+       "&agrave;\0"   "\xc3\xa0\0"
+       "&aacute;\0"   "\xc3\xa1\0"
+       "&acirc;\0"    "\xc3\xa2\0"
+       "&atilde;\0"   "\xc3\xa3\0"
+       "&auml;\0"     "\xc3\xa4\0"
+       "&aring;\0"    "\xc3\xa5\0"
+       "&aelig;\0"    "\xc3\xa6\0"
+       "&ccedil;\0"   "\xc3\xa7\0"
+       "&egrave;\0"   "\xc3\xa8\0"
+       "&eacute;\0"   "\xc3\xa9\0"
+       "&ecirc;\0"    "\xc3\xaa\0"
+       "&euml;\0"     "\xc3\xab\0"
+       "&igrave;\0"   "\xc3\xac\0"
+       "&iacute;\0"   "\xc3\xad\0"
+       "&icirc;\0"    "\xc3\xae\0"
+       "&iuml;\0"     "\xc3\xaf\0"
+       "&eth;\0"      "\xc3\xb0\0"
+       "&ntilde;\0"   "\xc3\xb1\0"
+       "&ograve;\0"   "\xc3\xb2\0"
+       "&oacute;\0"   "\xc3\xb3\0"
+       "&ocirc;\0"    "\xc3\xb4\0"
+       "&otilde;\0"   "\xc3\xb5\0"
+       "&ouml;\0"     "\xc3\xb6\0"
+       "&divide;\0"   "\xc3\xb7\0"
+       "&oslash;\0"   "\xc3\xb8\0"
+       "&ugrave;\0"   "\xc3\xb9\0"
+       "&uacute;\0"   "\xc3\xba\0"
+       "&ucirc;\0"    "\xc3\xbb\0"
+       "&uuml;\0"     "\xc3\xbc\0"
+       "&yacute;\0"   "\xc3\xbd\0"
+       "&thorn;\0"    "\xc3\xbe\0"
+       "&yuml;\0"     "\xc3\xbf\0"
+       "&alpha;\0"    "\xce\x91\0"
+       "&beta;\0"     "\xce\x92\0"
+       "&gamma;\0"    "\xce\x93\0"
+       "&delta;\0"    "\xce\x94\0"
+       "&epsilon;\0"  "\xce\x95\0"
+       "&zeta;\0"     "\xce\x96\0"
+       "&eta;\0"      "\xce\x97\0"
+       "&theta;\0"    "\xce\x98\0"
+       "&iota;\0"     "\xce\x99\0"
+       "&kappa;\0"    "\xce\x9a\0"
+       "&lambda;\0"   "\xce\x9b\0"
+       "&mu;\0"       "\xce\x9c\0"
+       "&nu;\0"       "\xce\x9d\0"
+       "&xi;\0"       "\xce\x9e\0"
+       "&omicron;\0"  "\xce\x9f\0"
+       "&pi;\0"       "\xce\xa0\0"
+       "&rho;\0"      "\xce\xa1\0"
+       "&sigma;\0"    "\xce\xa3\0"
+       "&tau;\0"      "\xce\xa4\0"
+       "&upsilon;\0"  "\xce\xa5\0"
+       "&phi;\0"      "\xce\xa6\0"
+       "&chi;\0"      "\xce\xa7\0"
+       "&psi;\0"      "\xce\xa8\0"
+       "&omega;\0"    "\xce\xa9\0"
+       "&hellip;\0"   "\xe2\x80\xa6\0"
+       "&euro;\0"     "\xe2\x82\xac\0"
+       "&larr;\0"     "\xe2\x86\x90\0"
+       "&uarr;\0"     "\xe2\x86\x91\0"
+       "&rarr;\0"     "\xe2\x86\x92\0"
+       "&darr;\0"     "\xe2\x86\x93\0"
+       "&harr;\0"     "\xe2\x86\x94\0"
+       "&larr;\0"     "\xe2\x87\x90\0"
+       "&rarr;\0"     "\xe2\x87\x92\0"
+       "&forall;\0"   "\xe2\x88\x80\0"
+       "&exist;\0"    "\xe2\x88\x83\0"
+       "&nabla;\0"    "\xe2\x88\x87\0"
+       "&prod;\0"     "\xe2\x88\x8f\0"
+       "&sum;\0"      "\xe2\x88\x91\0"
+       "&and;\0"      "\xe2\x88\xa7\0"
+       "&or;\0"       "\xe2\x88\xa8\0"
+       "&int;\0"      "\xe2\x88\xab\0"
+       "&ne;\0"       "\xe2\x89\xa0\0"
+       "&equiv;\0"    "\xe2\x89\xa1\0"
+       "&oplus;\0"    "\xe2\x8a\x95\0"
+       "&perp;\0"     "\xe2\x8a\xa5\0"
 ;
 
 
@@ -2615,6 +2584,7 @@ _escaped_char_match(const char *s, int *adv)
        match = 1;
        while ((*mc) && (*sc))
          {
+            if ((unsigned char)*sc < (unsigned char)*mc) return NULL;
             if (*sc != *mc) match = 0;
             mc++;
             sc++;
@@ -2629,9 +2599,8 @@ _escaped_char_match(const char *s, int *adv)
    return NULL;
 }
 
-static inline void
-_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s,
-                    const char *s_end)
+static inline const char *
+_escaped_char_get(const char *s, const char *s_end)
 {
    const char *map_itr, *map_end;
 
@@ -2641,14 +2610,36 @@ _append_escaped_char(Evas_Textblock_Cursor *cur, const char *s,
    while (map_itr < map_end)
      {
        if (_is_eq_and_advance(s, s_end, &map_itr, map_end))
-         {
-            evas_textblock_cursor_text_append(cur, map_itr);
-            return;
-         }
-       
+         return map_itr;
        if (map_itr < map_itr)
          _advance_after_end_of_string(&map_itr);
      }
+   return NULL;
+}
+
+EAPI const char *
+evas_textblock_escape_string_get(const char *escape)
+{
+   /* &amp; -> & */
+   return _escaped_char_get(escape, escape + strlen(escape));
+}
+
+EAPI const char *
+evas_textblock_string_escape_get(const char *string, int *len_ret)
+{
+   /* & -> &amp; */
+   return _escaped_char_match(string, len_ret);
+}
+
+static inline void
+_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s,
+                    const char *s_end)
+{
+   const char *escape;
+   
+   escape = _escaped_char_get(s, s_end);
+   if (escape)
+     evas_textblock_cursor_text_append(cur, escape);
 }
 
 static inline void
@@ -3521,6 +3512,7 @@ evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *text)
        free(o->markup_text);
        o->markup_text = NULL;
      }
+   _nodes_adjacent_merge(cur->obj, n);
    evas_object_change(cur->obj);
 }
 
@@ -3595,6 +3587,7 @@ evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text)
        free(o->markup_text);
        o->markup_text = NULL;
      }
+   _nodes_adjacent_merge(cur->obj, n);
    evas_object_change(cur->obj);
 }
 
@@ -3611,6 +3604,7 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form
    Evas_Object_Textblock_Node *n, *nc, *n2;
    
    if (!cur) return;
+   if ((!format) || (format[0] == 0)) return;
    o = (Evas_Object_Textblock *)(cur->obj->object_data);
    nc = cur->node;
    n = calloc(1, sizeof(Evas_Object_Textblock_Node));
@@ -3688,6 +3682,7 @@ evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *for
    Evas_Object_Textblock_Node *n, *nc, *n2;
    
    if (!cur) return;
+   if ((!format) || (format[0] == 0)) return;
    o = (Evas_Object_Textblock *)(cur->obj->object_data);
    nc = cur->node;
    n = calloc(1, sizeof(Evas_Object_Textblock_Node));