efl.canvas.textblock: allow all white spaces in style string not just space

Summary:
style string can contain any kind of white spaces and it will be fine

For example
```
"font=sans font_size=30 color=red "
```
Is the same as
```
"font=sans\tfont_size=30\n  color=red "
```

Reviewers: woohyun, segfaultxavi, tasn, zmike

Reviewed By: segfaultxavi

Subscribers: bu5hm4n, cedric, #reviewers, #committers

Tags: #efl

Maniphest Tasks: T8532

Differential Revision: https://phab.enlightenment.org/D11303
This commit is contained in:
Ali Alzyod 2020-02-11 12:03:00 +01:00 committed by Xavi Artigas
parent f546a57003
commit 4f99a37aee
2 changed files with 49 additions and 13 deletions

View File

@ -1317,8 +1317,6 @@ static const Escape_Value escape_values_v_common_sorted[] = {
ESCAPE_VALUE(">", "\x3e"),
};
/**
* @internal
* Checks if a char is a whitespace.
@ -3283,6 +3281,22 @@ _format_is_param(const char *item)
return EINA_FALSE;
}
/**
* @internal
* Returns first occurrence of whitespace character
* otherwise return NULL.
*
* @param[in] string to search.
*/
static const char*
_strchr_whitespace(const char* str)
{
if (!str) return NULL;
while (*str && !isspace(*str)) str++;
if(*str) return str;
return NULL;
}
/**
* @internal
* Parse the format item and populate key and val with the stringshares that
@ -3307,7 +3321,7 @@ _format_param_parse(const char *item, const char **key, char **val, Allocator *a
start++; /* Advance after the '=' */
/* If we can find a quote as the first non-space char,
* our new delimiter is a quote, not a space. */
while (*start == ' ')
while (isspace(*start))
start++;
if (*start == '\'')
@ -3319,9 +3333,9 @@ _format_param_parse(const char *item, const char **key, char **val, Allocator *a
}
else
{
end = strchr(start, ' ');
end = _strchr_whitespace(start);
while ((end) && (end > start) && (end[-1] == '\\'))
end = strchr(end + 1, ' ');
end = _strchr_whitespace(end + 1);
}
/* Null terminate before the spaces */
@ -3355,7 +3369,7 @@ end:
* @return the current item parsed from the string.
*/
static const char *
_format_parse(const char **s)
_format_parse(const char **s, Eina_Bool all_whitespaces)
{
const char *p;
const char *s1 = NULL, *s2 = NULL;
@ -3367,7 +3381,13 @@ _format_parse(const char **s)
{
if (!s1)
{
if (*p != ' ') s1 = p;
if (all_whitespaces)
{
if (!isspace(*p))
s1 = p;
}
else if(*p != ' ')
s1 = p;
if (*p == 0) break;
}
else if (!s2)
@ -3379,7 +3399,13 @@ _format_parse(const char **s)
if ((p > *s) && (p[-1] != '\\') && (!quote))
{
if (*p == ' ') s2 = p;
if (all_whitespaces)
{
if (isspace(*p))
s2 = p;
}
else if(*p == ' ')
s2 = p;
}
if (*p == 0) s2 = p;
}
@ -3415,12 +3441,12 @@ _format_fill(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const char
s = str;
/* get rid of any spaces at the start of the string */
while (*s == ' ') s++;
while (isspace(*s)) s++;
Allocator allocator;
_allocator_init(&allocator);
while ((item = _format_parse(&s)))
while ((item = _format_parse(&s, EINA_TRUE)))
{
const char *key = NULL;
char *val = NULL;
@ -5719,7 +5745,7 @@ _layout_do_format(const Evas_Object *obj, Ctxt *c,
{
fmt = _layout_format_pop(c, n->orig_format);
}
while ((item = _format_parse(&s)))
while ((item = _format_parse(&s, EINA_FALSE)))
{
if (_format_is_param(item))
{
@ -10731,7 +10757,7 @@ _evas_textblock_format_is_visible(Evas_Object_Textblock_Node_Format *fnode,
fnode->format_change = EINA_TRUE;
}
while ((item = _format_parse(&s)))
while ((item = _format_parse(&s, EINA_FALSE)))
{
int itlen = s - item;
/* We care about all of the formats even after a - except for
@ -16300,7 +16326,7 @@ _evas_textblock_annotations_insert(Eo *eo_obj, Efl_Text_Cursor_Handle *start, Ef
/* Sanitize the string and reject format items, closing '/' marks. */
buf = eina_strbuf_new();
while ((item = _format_parse(&format)))
while ((item = _format_parse(&format, EINA_FALSE)))
{
int itlen = format - item;
/* We care about all of the formats even after a - except for

View File

@ -4965,6 +4965,7 @@ EFL_END_TEST
EFL_START_TEST(efl_text_style)
{
START_EFL_CANVAS_TEXTBLOCK_TEST();
Eina_Size2D size1, size2;
int changed_emit = 0;
efl_event_callback_add(txt, EFL_CANVAS_TEXTBLOCK_EVENT_CHANGED, _increment_int_changed, &changed_emit);
@ -4983,6 +4984,15 @@ EFL_START_TEST(efl_text_style)
efl_text_markup_set(txt, "");
ck_assert_int_eq(changed_emit, 2);
// Style Applying
efl_text_set(txt,"A");
efl_canvas_textblock_style_apply(txt,"\tfont_size=2\t");
size1 = efl_canvas_textblock_size_native_get(txt);
efl_canvas_textblock_style_apply(txt,"\nfont_size=20\n");
size2 = efl_canvas_textblock_size_native_get(txt);
ck_assert(size1.w < size2.w);
ck_assert(size1.h < size2.h);
END_EFL_CANVAS_TEXTBLOCK_TEST();
}
EFL_END_TEST