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<<>>"A'<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, "<"); - else if (ch == '>') - eina_strbuf_append(sbuf, ">"); - else if (ch == '&') - eina_strbuf_append(sbuf, "&"); - else if (ch == '"') - eina_strbuf_append(sbuf, """); - else if (ch == '\'') - eina_strbuf_append(sbuf, "'"); - else if (ch == _PARAGRAPH_SEPARATOR) - eina_strbuf_append(sbuf, "<ps/>"); else if (ch == _REPLACEMENT_CHAR) eina_strbuf_append(sbuf, ""); - 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("Á", "\xc3\x81"), + ESCAPE_VALUE("Â", "\xc3\x82"), + ESCAPE_VALUE("&Aelig;", "\xc3\x86"), + ESCAPE_VALUE("Õ", "\xc3\x95"), + ESCAPE_VALUE("Ö", "\xc3\x96"), + ESCAPE_VALUE("&Thorn;", "\xc3\x9e"), + ESCAPE_VALUE("Ú", "\xc3\x9a"), + ESCAPE_VALUE("Û", "\xc3\x9b"), + ESCAPE_VALUE("⇒", "\xe2\x87\x92"), + ESCAPE_VALUE("®", "\xc2\xae"), + ESCAPE_VALUE("ρ", "\xce\xa1"), + ESCAPE_VALUE("σ", "\xce\xa3"), + ESCAPE_VALUE("∑", "\xe2\x88\x91"), + ESCAPE_VALUE("¹", "\xc2\xb9"), + ESCAPE_VALUE("û", "\xc3\xbb"), + ESCAPE_VALUE("ù", "\xc3\xb9"), + ESCAPE_VALUE("¨", "\xc2\xa8"), + ESCAPE_VALUE("¥", "\xc2\xa5"), + ESCAPE_VALUE("ÿ", "\xc3\xbf"), + ESCAPE_VALUE("<tab/>", "\t"), + ESCAPE_VALUE("<br/>", "\n"), + ESCAPE_VALUE("<ps/>", "\xe2\x80\xa9"), //0x2029 + ESCAPE_VALUE("", "\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 "); 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 ")); free(tmp2); free(tmp); @@ -3238,7 +3275,7 @@ EFL_START_TEST(evas_textblock_text_getters) tmp = evas_textblock_text_markup_to_utf8(NULL, "a "); 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 ")); 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); --
