bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=41c7e1c908772bd8f4ec266c661faabeea357ec6
commit 41c7e1c908772bd8f4ec266c661faabeea357ec6 Author: Ali Alzyod <[email protected]> Date: Thu Jan 2 07:25:35 2020 +0000 efl.text.cursor: emit events CANVAS_TEXTBLOCK_CHANGED when insert text using efl_text_cursor_markup_insert efl.text.cursor: emit events CANVAS_TEXTBLOCK_CHANGED when insert text using efl_text_cursor_markup_insert Differential Revision: https://phab.enlightenment.org/D10985 --- src/lib/evas/canvas/evas_object_textblock.c | 226 ++++++++++++++-------------- src/tests/evas/evas_test_textblock.c | 9 +- 2 files changed, 119 insertions(+), 116 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 2347961759..817008c889 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -8524,7 +8524,7 @@ static void _evas_object_textblock_text_markup_prepend(Eo *eo_obj, Efl_Text_Cursor_Handle *cur, const char *text) { - if (!cur) return; + if (!cur || !text || !*text) return; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); TB_HEAD(); @@ -8533,140 +8533,138 @@ _evas_object_textblock_text_markup_prepend(Eo *eo_obj, * this should be done once, when markup_prepend finished */ o->pause_change = EINA_TRUE; - if (text) - { - char *s, *p; - char *tag_start, *tag_end, *esc_start, *esc_end; - - tag_start = tag_end = esc_start = esc_end = NULL; - p = (char *)text; - s = p; - /* This loop goes through all of the mark up text until it finds format - * tags, escape sequences or the terminating NULL. When it finds either - * of those, it appends the text found up until that point to the textblock - * proccesses whatever found. It repeats itself until the terminating - * NULL is reached. */ - for (;;) - { - size_t text_len; - /* If we got to the end of string or just finished/started tag - * or escape sequence handling. */ - if ((*p == 0) || - (tag_end) || (esc_end) || - (tag_start) || (esc_start)) + char *s, *p; + char *tag_start, *tag_end, *esc_start, *esc_end; + + tag_start = tag_end = esc_start = esc_end = NULL; + p = (char *)text; + s = p; + /* This loop goes through all of the mark up text until it finds format + * tags, escape sequences or the terminating NULL. When it finds either + * of those, it appends the text found up until that point to the textblock + * proccesses whatever found. It repeats itself until the terminating + * NULL is reached. */ + for (;;) + { + size_t text_len; + /* If we got to the end of string or just finished/started tag + * or escape sequence handling. */ + if ((*p == 0) || + (tag_end) || (esc_end) || + (tag_start) || (esc_start)) + { + if (tag_end) { - if (tag_end) - { - /* If we reached to a tag ending, analyze the tag */ - char *ttag; - size_t ttag_len = tag_end - tag_start; + /* If we reached to a tag ending, analyze the tag */ + char *ttag; + size_t ttag_len = tag_end - tag_start; - ttag = malloc(ttag_len + 1); - if (ttag) - { - memcpy(ttag, tag_start, ttag_len); - ttag[ttag_len] = 0; - evas_textblock_cursor_format_prepend(cur, ttag); - free(ttag); - } - tag_start = tag_end = NULL; - } - else if (esc_end) - { - _prepend_escaped_char(cur, esc_start, esc_end + 1); - esc_start = esc_end = NULL; - } - else if (*p == 0 && esc_start) /* escape start with no end, append it as text */ - { - _prepend_text_run(cur, esc_start, p); - esc_start = esc_end = NULL; - s = NULL; - } - else if (*p == 0) + ttag = malloc(ttag_len + 1); + if (ttag) { - _prepend_text_run(cur, s, p); - s = NULL; + memcpy(ttag, tag_start, ttag_len); + ttag[ttag_len] = 0; + evas_textblock_cursor_format_prepend(cur, ttag); + free(ttag); } - if (*p == 0) - break; + tag_start = tag_end = NULL; } - if (*p == '<') + else if (esc_end) { - if (esc_start) /* escape start with no end, append it as text */ - { - _prepend_text_run(cur, esc_start, p); - esc_start = esc_end = NULL; - s = NULL; - } - if (!esc_start) - { - /* Append the text prior to this to the textblock and mark - * the start of the tag */ - tag_start = p; - tag_end = NULL; - _prepend_text_run(cur, s, p); - s = NULL; - } + _prepend_escaped_char(cur, esc_start, esc_end + 1); + esc_start = esc_end = NULL; } - else if (*p == '>') + else if (*p == 0 && esc_start) /* escape start with no end, append it as text */ { - if (tag_start) - { - tag_end = p + 1; - s = p + 1; - } + _prepend_text_run(cur, esc_start, p); + esc_start = esc_end = NULL; + s = NULL; } - else if (*p == '&') + else if (*p == 0) { - if (esc_start) /* escape start with no end, append it as text */ - { - _prepend_text_run(cur, esc_start, p); - esc_start = esc_end = NULL; - s = NULL; - } - if (!tag_start) - { - /* Append the text prior to this to the textblock and mark - * the start of the escape sequence */ - esc_start = p; - esc_end = NULL; - _prepend_text_run(cur, s, p); - s = NULL; - } + _prepend_text_run(cur, s, p); + s = NULL; } - else if (*p == ';') + if (*p == 0) + break; + } + if (*p == '<') + { + if (esc_start) /* escape start with no end, append it as text */ { - if (esc_start) - { - esc_end = p; - s = p + 1; - } + _prepend_text_run(cur, esc_start, p); + esc_start = esc_end = NULL; + s = NULL; } - /* Unicode object replacement char */ - else if (!strncmp(_REPLACEMENT_CHAR_UTF8, p, - text_len = strlen(_REPLACEMENT_CHAR_UTF8)) || - !strncmp(_NEWLINE_UTF8, p, - text_len = strlen(_NEWLINE_UTF8)) || - !strncmp(_TAB_UTF8, p, - text_len = strlen(_TAB_UTF8)) || - !strncmp(_PARAGRAPH_SEPARATOR_UTF8, p, - text_len = strlen(_PARAGRAPH_SEPARATOR_UTF8))) + if (!esc_start) { - /*FIXME: currently just remove them, maybe do something - * fancier in the future, atm it breaks if this char - * is inside <> */ + /* Append the text prior to this to the textblock and mark + * the start of the tag */ + tag_start = p; + tag_end = NULL; _prepend_text_run(cur, s, p); - /* it's also advanced later in this loop need +text_len - in total*/ - p += text_len - 1; - s = p + 1; /* One after the end of the replacement char */ + s = NULL; } - p++; } + else if (*p == '>') + { + if (tag_start) + { + tag_end = p + 1; + s = p + 1; + } + } + else if (*p == '&') + { + if (esc_start) /* escape start with no end, append it as text */ + { + _prepend_text_run(cur, esc_start, p); + esc_start = esc_end = NULL; + s = NULL; + } + if (!tag_start) + { + /* Append the text prior to this to the textblock and mark + * the start of the escape sequence */ + esc_start = p; + esc_end = NULL; + _prepend_text_run(cur, s, p); + s = NULL; + } + } + else if (*p == ';') + { + if (esc_start) + { + esc_end = p; + s = p + 1; + } + } + /* Unicode object replacement char */ + else if (!strncmp(_REPLACEMENT_CHAR_UTF8, p, + text_len = strlen(_REPLACEMENT_CHAR_UTF8)) || + !strncmp(_NEWLINE_UTF8, p, + text_len = strlen(_NEWLINE_UTF8)) || + !strncmp(_TAB_UTF8, p, + text_len = strlen(_TAB_UTF8)) || + !strncmp(_PARAGRAPH_SEPARATOR_UTF8, p, + text_len = strlen(_PARAGRAPH_SEPARATOR_UTF8))) + { + /*FIXME: currently just remove them, maybe do something + * fancier in the future, atm it breaks if this char + * is inside <> */ + _prepend_text_run(cur, s, p); + /* it's also advanced later in this loop need +text_len + in total*/ + p += text_len - 1; + s = p + 1; /* One after the end of the replacement char */ + } + p++; } o->pause_change = EINA_FALSE; + efl_event_callback_call(cur->obj, EFL_CANVAS_TEXTBLOCK_EVENT_CHANGED, NULL); _evas_textblock_changed(o, eo_obj); } diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index ef830e8507..261c12145c 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4530,7 +4530,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor) efl_text_set(txt, ""); efl_text_set(txt, ""); efl_text_cursor_text_insert(cursor1, "aa"); - ck_assert_int_eq(changed_emit, 3); + ck_assert_int_eq(changed_emit, 4); + + efl_text_markup_set(txt, "Hello<br/>Word"); + efl_text_markup_set(txt, "Hello<br/>Word"); + efl_text_cursor_markup_insert(cursor1, "aa"); + ck_assert_int_eq(changed_emit, 6); efl_text_set(txt, ""); ck_assert(!efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT)); @@ -4549,7 +4554,7 @@ EFL_START_TEST(efl_canvas_textblock_cursor) ck_assert(!efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_LAST)); ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0); - ck_assert_int_eq(changed_emit, 4); + ck_assert_int_eq(changed_emit, 7); efl_text_markup_set(txt, "Hello World<ps/>This is EFL<br/>Enlightenment"); ck_assert(efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT)); --
