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
This commit is contained in:
Ali Alzyod 2020-08-18 17:34:02 +09:00 committed by WooHyun Jung
parent 463291548d
commit 4ad272a8c3
2 changed files with 70 additions and 18 deletions

View File

@ -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);
}
}
}
}

View File

@ -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);