woohyun pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=4ad272a8c3183790a65b7f2c0ccfb57b4688219a

commit 4ad272a8c3183790a65b7f2c0ccfb57b4688219a
Author: Ali Alzyod <[email protected]>
Date:   Tue Aug 18 17:34:02 2020 +0900

    evas_object_textblock: utf8_to_markup support all escapse chars
    
    Summary: update evas_textblock_text_utf8_to_markup to support all escape 
characters
    
    Test Plan:
    ```
    #define EFL_EO_API_SUPPORT 1
    #define EFL_BETA_API_SUPPORT 1
    #include<Eina.h>
    #include<Efl.h>
    #include <Elementary.h>
    
    EAPI_MAIN int
    elm_main(int argc, char **argv)
    {
       Evas_Object *win,*textblock;
    
       elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
    
       win = elm_win_util_standard_add("Main", "App");
       elm_win_autodel_set(win, EINA_TRUE);
    
      textblock = evas_object_textblock_add(win);
      char * aaa = 
evas_textblock_text_utf8_to_markup(textblock,"A<<>>\"A\'\tA");
      // aaa ==  "A&lt;&lt;&gt;&gt;&quot;A&apos;<tab/>A";
       
evas_object_size_hint_weight_set(textblock,EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
       evas_object_size_hint_align_set(textblock,EVAS_HINT_FILL,EVAS_HINT_FILL);
       evas_object_show(textblock);
    
       evas_object_move(textblock,0,0);
       evas_object_resize(textblock,320,480);
       evas_object_resize(win,320,480);
    
       evas_object_show(win);
       elm_run();
    
       return 0;
    }
    ELM_MAIN()
    
    ```
    
    Reviewers: lauromoura, CHAN, woohyun, bu5hm4n, bowonryu, tasn, herdsman
    
    Subscribers: zmike, cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D8843
---
 src/lib/evas/canvas/evas_object_textblock.c | 33 ++++++++---------
 src/tests/evas/evas_test_textblock.c        | 55 +++++++++++++++++++++++++++--
 2 files changed, 70 insertions(+), 18 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_textblock.c 
b/src/lib/evas/canvas/evas_object_textblock.c
index e9b89dec98..f8ddf1cee6 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -8570,7 +8570,8 @@ _escaped_char_match(const char *s, int *adv)
    int n_ret = _escaped_value_search(s, list, len);
    if (n_ret != -1)
      {
-        *adv = (int) list[n_ret]->value_len;
+        if (adv)
+          *adv = (int) list[n_ret]->value_len;
         return list[n_ret]->escape;
      }
    else
@@ -8579,7 +8580,8 @@ _escaped_char_match(const char *s, int *adv)
         n_ret = _escaped_value_search(s, list, len);
         if (n_ret != -1)
           {
-             *adv = (int)list[n_ret]->value_len;
+             if (adv)
+               *adv = (int)list[n_ret]->value_len;
              return list[n_ret]->escape;
           }
      }
@@ -8996,6 +8998,7 @@ static void
 _markup_get_text_utf8_append(Eina_Strbuf *sbuf, const char *text)
 {
    int ch, pos = 0, pos2 = 0;
+   const char * replacement;
 
    for (;;)
      {
@@ -9007,23 +9010,21 @@ _markup_get_text_utf8_append(Eina_Strbuf *sbuf, const 
char *text)
            eina_strbuf_append(sbuf, "<br/>");
         else if (ch == _TAB)
            eina_strbuf_append(sbuf, "<tab/>");
-        else if (ch == '<')
-           eina_strbuf_append(sbuf, "&lt;");
-        else if (ch == '>')
-           eina_strbuf_append(sbuf, "&gt;");
-        else if (ch == '&')
-           eina_strbuf_append(sbuf, "&amp;");
-        else if (ch == '"')
-           eina_strbuf_append(sbuf, "&quot;");
-        else if (ch == '\'')
-           eina_strbuf_append(sbuf, "&apos;");
-        else if (ch == _PARAGRAPH_SEPARATOR)
-           eina_strbuf_append(sbuf, "<ps/>");
         else if (ch == _REPLACEMENT_CHAR)
            eina_strbuf_append(sbuf, "&#xfffc;");
-        else if (ch != '\r')
+        else if (ch == _PARAGRAPH_SEPARATOR)
+           eina_strbuf_append(sbuf, "<ps/>");
+        else
           {
-             eina_strbuf_append_length(sbuf, text + pos, pos2 - pos);
+             replacement = _escaped_char_match(text + pos, NULL);
+             if (replacement)
+               {
+                  eina_strbuf_append(sbuf, replacement);
+               }
+             else if (ch != '\r')
+               {
+                  eina_strbuf_append_length(sbuf, text + pos, pos2 - pos);
+               }
           }
      }
 }
diff --git a/src/tests/evas/evas_test_textblock.c 
b/src/tests/evas/evas_test_textblock.c
index 6bdf25a19d..2b44e3fdff 100644
--- a/src/tests/evas/evas_test_textblock.c
+++ b/src/tests/evas/evas_test_textblock.c
@@ -70,6 +70,43 @@ do \
 } \
 while (0)
 
+
+typedef struct _Escape_Value Escape_Value;
+
+struct _Escape_Value
+{
+   char *escape;
+   char *value;
+};
+
+#define ESCAPE_VALUE(e,v) {e,v}
+
+static const Escape_Value escape_strings[] = {
+   ESCAPE_VALUE("&Aacute;", "\xc3\x81"),
+   ESCAPE_VALUE("&Acirc;", "\xc3\x82"),
+   ESCAPE_VALUE("&Aelig;", "\xc3\x86"),
+   ESCAPE_VALUE("&Otilde;", "\xc3\x95"),
+   ESCAPE_VALUE("&Ouml;", "\xc3\x96"),
+   ESCAPE_VALUE("&Thorn;", "\xc3\x9e"),
+   ESCAPE_VALUE("&Uacute;", "\xc3\x9a"),
+   ESCAPE_VALUE("&Ucirc;", "\xc3\x9b"),
+   ESCAPE_VALUE("&rArr;", "\xe2\x87\x92"),
+   ESCAPE_VALUE("&reg;", "\xc2\xae"),
+   ESCAPE_VALUE("&rho;", "\xce\xa1"),
+   ESCAPE_VALUE("&sigma;", "\xce\xa3"),
+   ESCAPE_VALUE("&sum;", "\xe2\x88\x91"),
+   ESCAPE_VALUE("&sup1;", "\xc2\xb9"),
+   ESCAPE_VALUE("&ucirc;", "\xc3\xbb"),
+   ESCAPE_VALUE("&ugrave;", "\xc3\xb9"),
+   ESCAPE_VALUE("&uml;", "\xc2\xa8"),
+   ESCAPE_VALUE("&yen;", "\xc2\xa5"),
+   ESCAPE_VALUE("&yuml;", "\xc3\xbf"),
+   ESCAPE_VALUE("<tab/>", "\t"),
+   ESCAPE_VALUE("<br/>", "\n"),
+   ESCAPE_VALUE("<ps/>", "\xe2\x80\xa9"),    //0x2029
+   ESCAPE_VALUE("&#xfffc;", "\xef\xbf\xbc"), //0xFFFC
+};
+
 EFL_START_TEST(evas_textblock_simple)
 {
    START_TB_TEST();
@@ -3195,7 +3232,7 @@ EFL_START_TEST(evas_textblock_text_getters)
         tmp = evas_textblock_text_markup_to_utf8(tb, "a&nbsp;");
         fail_if(strcmp(tmp, "a\xC2\xA0"));
         tmp2 = evas_textblock_text_utf8_to_markup(tb, tmp);
-        fail_if(strcmp(tmp2, "a\xC2\xA0"));
+        fail_if(strcmp(tmp2, "a&nbsp;"));
         free(tmp2);
         free(tmp);
 
@@ -3238,7 +3275,7 @@ EFL_START_TEST(evas_textblock_text_getters)
         tmp = evas_textblock_text_markup_to_utf8(NULL, "a&nbsp;");
         fail_if(strcmp(tmp, "a\xC2\xA0"));
         tmp2 = evas_textblock_text_utf8_to_markup(NULL, tmp);
-        fail_if(strcmp(tmp2, "a\xC2\xA0"));
+        fail_if(strcmp(tmp2, "a&nbsp;"));
         free(tmp2);
         free(tmp);
 
@@ -4469,6 +4506,19 @@ do \
 } \
 while (0)
 
+EFL_START_TEST(evas_textblock_utf8_to_markup)
+{
+   size_t len = sizeof(escape_strings) / sizeof(Escape_Value);
+   char * mkup_txt;
+   for(size_t i = 0 ; i < len ; i++)
+     {
+       mkup_txt = evas_textblock_text_utf8_to_markup(NULL, 
escape_strings[i].value);
+       fail_if(strcmp(escape_strings[i].escape, mkup_txt));
+       free(mkup_txt);
+     }
+}
+EFL_END_TEST
+
 EFL_START_TEST(efl_canvas_textblock_simple)
 {
    START_EFL_CANVAS_TEXTBLOCK_TEST();
@@ -5160,6 +5210,7 @@ void evas_test_textblock(TCase *tc)
 #endif
    tcase_add_test(tc, evas_textblock_text_iface);
    tcase_add_test(tc, evas_textblock_annotation);
+   tcase_add_test(tc, evas_textblock_utf8_to_markup);
    tcase_add_test(tc, efl_canvas_textblock_simple);
    tcase_add_test(tc, efl_text);
    tcase_add_test(tc, efl_canvas_textblock_cursor);

-- 


Reply via email to