1 #include "edje_private.h"
4 _edje_font_is_embedded(Edje_File *edf, char *font)
6 if (!eina_hash_find(edf->fonts, font)) return 0;
11 _edje_format_param_parse(char *item, char **key, char **val)
15 p = strchr(item, '=');
16 k = malloc(p - item + 1);
17 strncpy(k, item, p - item);
26 _edje_format_parse(const char **s)
30 const char *s1 = NULL;
31 const char *s2 = NULL;
34 if ((!p) || (*p == 0)) return NULL;
39 if (*p != ' ') s1 = p;
44 if ((p > *s) && (p[-1] != '\\'))
46 if (*p == ' ') s2 = p;
53 item = malloc(s2 - s1 + 1);
56 for (ds = item, ss = s1; ss < s2; ss++, ds++)
58 if ((*ss == '\\') && (ss < (s2 - 1))) ss++;
72 _edje_format_is_param(char *item)
74 if (strchr(item, '=')) return 1;
79 _edje_format_reparse(Edje_File *edf, const char *str, Edje_Style_Tag **tag_ret)
81 Eina_Strbuf *txt, *tmp = NULL;
82 char *s2, *item, *ret;
85 txt = eina_strbuf_new();
87 while ((item = _edje_format_parse(&s)))
89 if (_edje_format_is_param(item))
91 char *key = NULL, *val = NULL;
93 _edje_format_param_parse(item, &key, &val);
94 if (!strcmp(key, "font_source"))
96 /* dont allow font sources */
98 else if (!strcmp(key, "text_class"))
101 (*tag_ret)->text_class = eina_stringshare_add(val);
103 else if (!strcmp(key, "font_size"))
106 (*tag_ret)->font_size = atof(val);
108 else if (!strcmp(key, "font")) /* Fix fonts */
112 if (_edje_font_is_embedded(edf, val))
115 tmp = eina_strbuf_new();
116 eina_strbuf_append(tmp, "edje/fonts/");
117 eina_strbuf_append(tmp, val);
118 (*tag_ret)->font = eina_stringshare_add(eina_strbuf_string_get(tmp));
119 eina_strbuf_reset(tmp);
123 (*tag_ret)->font = eina_stringshare_add(val);
127 else /* Otherwise add to tag buffer */
129 s2 = eina_str_escape(item);
132 if (eina_strbuf_length_get(txt)) eina_strbuf_append(txt, " ");
133 eina_strbuf_append(txt, s2);
142 if (eina_strbuf_length_get(txt)) eina_strbuf_append(txt, " ");
143 eina_strbuf_append(txt, item);
148 eina_strbuf_free(tmp);
149 ret = eina_strbuf_string_steal(txt);
150 eina_strbuf_free(txt);
154 /* Update all evas_styles which are in an edje
156 * @param ed The edje containing styles which need to be updated
159 _edje_textblock_style_all_update(Edje *ed)
163 Eina_Strbuf *txt = NULL;
165 if (!ed->file) return;
167 EINA_LIST_FOREACH(ed->file->styles, l, stl)
172 char *fontset = NULL, *fontsource = NULL;
174 /* Make sure the style is already defined */
175 if (!stl->style) break;
177 /* Make sure the style contains a text_class */
178 EINA_LIST_FOREACH(stl->tags, ll, tag)
187 /* No text classes , goto next style */
188 if (!found) continue;
191 txt = eina_strbuf_new();
193 if (_edje_fontset_append)
194 fontset = eina_str_escape(_edje_fontset_append);
195 fontsource = eina_str_escape(ed->file->path);
197 /* Build the style from each tag */
198 EINA_LIST_FOREACH(stl->tags, ll, tag)
200 if (!tag->key) continue;
203 eina_strbuf_append(txt, tag->key);
204 eina_strbuf_append(txt, "='");
206 /* Configure fonts from text class if it exists */
207 tc = _edje_text_class_find(ed, tag->text_class);
209 /* Add and Ha`ndle tag parsed data */
210 eina_strbuf_append(txt, tag->value);
212 if (!strcmp(tag->key, "DEFAULT"))
216 eina_strbuf_append(txt, " ");
217 eina_strbuf_append(txt, "font_fallbacks=");
218 eina_strbuf_append(txt, fontset);
220 eina_strbuf_append(txt, " ");
221 eina_strbuf_append(txt, "font_source=");
222 eina_strbuf_append(txt, fontsource);
224 if (tag->font_size != 0)
229 snprintf(font_size, sizeof(font_size), "%f", (double) _edje_text_size_calc(tag->font_size, tc));
231 snprintf(font_size, sizeof(font_size), "%f", tag->font_size);
233 eina_strbuf_append(txt, " ");
234 eina_strbuf_append(txt, "font_size=");
235 eina_strbuf_append(txt, font_size);
237 /* Add font name last to save evas from multiple loads */
242 eina_strbuf_append(txt, " ");
243 eina_strbuf_append(txt, "font=");
245 f = (tc && tc->font) ? tc->font : tag->font;
246 eina_strbuf_append_escaped(txt, f);
249 eina_strbuf_append(txt, "'");
251 if (fontset) free(fontset);
252 if (fontsource) free(fontsource);
254 /* Configure the style */
255 evas_textblock_style_set(stl->style, eina_strbuf_string_get(txt));
256 eina_strbuf_reset(txt);
259 eina_strbuf_free(txt);
263 _edje_textblock_styles_add(Edje *ed)
268 if (!ed->file) return;
270 EINA_LIST_FOREACH(ed->file->styles, l, stl)
274 /* Make sure the style contains the text_class */
275 EINA_LIST_FOREACH(stl->tags, ll, tag)
277 if (!tag->text_class) continue;
278 _edje_text_class_member_add(ed, tag->text_class);
284 _edje_textblock_styles_del(Edje *ed)
289 if (!ed->file) return;
291 EINA_LIST_FOREACH(ed->file->styles, l, stl)
295 /* Make sure the style contains the text_class */
296 EINA_LIST_FOREACH(stl->tags, ll, tag)
298 if (!tag->text_class) continue;
299 _edje_text_class_member_del(ed, tag->text_class);
304 /* When we get to here the edje file had been read into memory
305 * the name of the style is established as well as the name and
306 * data for the tags. This function will create the Evas_Style
307 * object for each style. The style is composed of a base style
308 * followed by a list of tags.
311 _edje_textblock_style_parse_and_fix(Edje_File *edf)
313 Eina_Strbuf *txt = NULL;
317 EINA_LIST_FOREACH(edf->styles, l, stl)
320 char *fontset = NULL, *fontsource = NULL, *ts;
322 if (stl->style) break;
325 txt = eina_strbuf_new();
327 stl->style = evas_textblock_style_new();
328 evas_textblock_style_set(stl->style, NULL);
330 if (_edje_fontset_append)
331 fontset = eina_str_escape(_edje_fontset_append);
332 fontsource = eina_str_escape(edf->path);
334 /* Build the style from each tag */
335 EINA_LIST_FOREACH(stl->tags, ll, tag)
337 if (!tag->key) continue;
340 eina_strbuf_append(txt, tag->key);
341 eina_strbuf_append(txt, "='");
343 ts = _edje_format_reparse(edf, tag->value, &(tag));
345 /* Add and Handle tag parsed data */
348 if (eet_dictionary_string_check(eet_dictionary_get(edf->ef), tag->value) == 0)
349 eina_stringshare_del(tag->value);
350 tag->value = eina_stringshare_add(ts);
351 eina_strbuf_append(txt, tag->value);
355 if (!strcmp(tag->key, "DEFAULT"))
359 eina_strbuf_append(txt, " ");
360 eina_strbuf_append(txt, "font_fallbacks=");
361 eina_strbuf_append(txt, fontset);
363 eina_strbuf_append(txt, " ");
364 eina_strbuf_append(txt, "font_source=");
365 eina_strbuf_append(txt, fontsource);
367 if (tag->font_size > 0)
371 snprintf(font_size, sizeof(font_size), "%f", tag->font_size);
372 eina_strbuf_append(txt, " ");
373 eina_strbuf_append(txt, "font_size=");
374 eina_strbuf_append(txt, font_size);
376 /* Add font name last to save evas from multiple loads */
379 eina_strbuf_append(txt, " ");
380 eina_strbuf_append(txt, "font=");
381 eina_strbuf_append_escaped(txt, tag->font);
383 eina_strbuf_append(txt, "'");
385 if (fontset) free(fontset);
386 if (fontsource) free(fontsource);
388 /* Configure the style */
389 evas_textblock_style_set(stl->style, eina_strbuf_string_get(txt));
390 eina_strbuf_reset(txt);
393 eina_strbuf_free(txt);
397 _edje_textblock_style_cleanup(Edje_File *edf)
403 stl = edf->styles->data;
404 edf->styles = eina_list_remove_list(edf->styles, edf->styles);
409 tag = stl->tags->data;
410 stl->tags = eina_list_remove_list(stl->tags, stl->tags);
411 if (edf->free_strings)
413 if (tag->key) eina_stringshare_del(tag->key);
414 /* FIXME: Find a proper way to handle it. */
415 if (tag->value) eina_stringshare_del(tag->value);
416 if (tag->text_class) eina_stringshare_del(tag->text_class);
417 if (tag->font) eina_stringshare_del(tag->font);
421 if (edf->free_strings && stl->name) eina_stringshare_del(stl->name);
422 if (stl->style) evas_textblock_style_free(stl->style);