2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "xconverter.h"
20 static char *html_to_entry(AppData *ad, int type_index, const char *str);
21 static char *efl_to_entry(AppData *ad, int type_index, const char *str);
22 static char *text_to_entry(AppData *ad, int type_index, const char *str);
23 static char *image_path_to_entry(AppData *ad, int type_index, const char *str);
25 static char *make_close_tag(Eina_List* nodes);
26 static char *do_not_convert(AppData *ad, int type_index, const char *str);
27 static char *html_to_efl(AppData *ad, int type_index, const char *str);
28 static char *efl_to_html(AppData *ad, int type_index, const char *str);
29 static char *text_to_html(AppData *ad, int type_index, const char *str);
30 static char *text_to_efl(AppData *ad, int type_index, const char *str);
31 static char *to_text(AppData *ad, int type_index, const char *str);
32 static char *image_path_to_html(AppData *ad, int type_index, const char *str);
33 static char *image_path_to_efl(AppData *ad, int type_index, const char *str);
34 static char *image_path_to_text(AppData *ad, int type_index, const char *str);
35 //static char *efl_to_efl(AppData *ad, int type_index, const char *str);
36 //static char *html_to_html(AppData *ad, int type_index, const char *str);
37 static char *image_path_to_image_path(AppData *ad, int type_index, const char *str);
39 int atom_type_index_get(AppData *ad, Ecore_X_Atom atom)
42 for (i = 0; i < ATOM_INDEX_MAX; i++)
44 for (j = 0; j < ad->targetAtoms[i].atom_cnt; j++)
45 if (ad->targetAtoms[i].atom[j] == atom)
51 void init_target_atoms(AppData *ad)
53 int atom_cnt[ATOM_INDEX_MAX] = {
56 char *targetAtomNames[][5] = {
58 { "UTF8-STRING", "STRING", "TEXT", "text/plain;charset=utf-8", "text/plain" },
59 { "text/html;charset=utf-8", "text/html" },
60 { "application/x-elementary-markup" },
61 { "text/uri", "text/uri-list" }
63 text_converter_func converts_for_entry[ATOM_INDEX_MAX] = {
64 NULL, text_to_entry, html_to_entry, efl_to_entry, image_path_to_entry
67 text_converter_func converts[ATOM_INDEX_MAX][ATOM_INDEX_MAX] = {
68 {NULL, NULL, NULL, NULL, NULL},
69 {NULL, do_not_convert, text_to_html, text_to_efl, NULL},
70 {NULL, to_text, do_not_convert, html_to_efl, NULL},
71 {NULL, to_text, efl_to_html, do_not_convert, NULL},
72 {NULL, image_path_to_text, image_path_to_html, image_path_to_efl, image_path_to_image_path}
76 for (i = 0; i < ATOM_INDEX_MAX; i++)
78 ad->targetAtoms[i].atom_cnt = atom_cnt[i];
79 ad->targetAtoms[i].name = MALLOC(sizeof(char *) * atom_cnt[i]);
80 ad->targetAtoms[i].atom = MALLOC(sizeof(Ecore_X_Atom) * atom_cnt[i]);
81 for (j = 0; j < atom_cnt[i]; j++)
83 DMSG("atomName: %s\n", targetAtomNames[i][j]);
84 ad->targetAtoms[i].name[j] = strdup(targetAtomNames[i][j]);
85 ad->targetAtoms[i].atom[j] = ecore_x_atom_get(targetAtomNames[i][j]);
87 ad->targetAtoms[i].convert_for_entry = converts_for_entry[i];
89 for (j = 0; j < ATOM_INDEX_MAX; j++)
90 ad->targetAtoms[i].convert_to_target[j] = converts[i][j];
91 //ecore_x_selection_converter_atom_add(ad->targetAtoms[i].atom, target_converters[i]);
92 //ecore_x_selection_converter_atom_add(ad->targetAtoms[i].atom, generic_converter);
96 void depose_target_atoms(AppData *ad)
99 for (i = 0; i < ATOM_INDEX_MAX; i++)
101 for (j = 0; j < ad->targetAtoms[i].atom_cnt; j++)
103 if (ad->targetAtoms[i].name[j])
104 FREE(ad->targetAtoms[i].name[j]);
106 if (ad->targetAtoms[i].name)
107 FREE(ad->targetAtoms[i].name);
108 if (ad->targetAtoms[i].atom)
109 FREE(ad->targetAtoms[i].atom);
113 static Eina_Bool targets_converter(AppData *ad, Ecore_X_Atom reqAtom, CNP_ITEM *item, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *tsize)
120 for (i = 0, count = 0; i < ATOM_INDEX_MAX; i++)
122 if (ad->targetAtoms[item->type_index].convert_to_target[i])
123 count += ad->targetAtoms[i].atom_cnt;
126 *data_ret = MALLOC(sizeof(Ecore_X_Atom) * count);
127 DMSG("item_type: %d, target Atom cnt: %d\n", item->type_index, count);
131 for (i = 0, count = 0; i < ATOM_INDEX_MAX; i++)
133 if (ad->targetAtoms[item->type_index].convert_to_target[i])
135 for(j = 0; j < ad->targetAtoms[i].atom_cnt; j++)
137 ((Ecore_X_Atom *)*data_ret)[count++] = ad->targetAtoms[i].atom[j];
138 DMSG("send target atom: %s\n", ad->targetAtoms[i].name[j]);
143 if (size_ret) *size_ret = count;
144 if (ttype) *ttype = ECORE_X_ATOM_ATOM;
145 if (tsize) *tsize = 32;
149 Eina_Bool generic_converter(AppData *ad, Ecore_X_Atom reqAtom, CNP_ITEM *item, void **data_ret, int *size_ret, Ecore_X_Atom *ttype, int *tsize)
153 if (ad->targetAtoms[ATOM_INDEX_TARGET].atom[0] == reqAtom)
154 return targets_converter(ad, reqAtom, item, data_ret, size_ret, ttype, tsize);
156 int req_index = atom_type_index_get(ad, reqAtom);
157 int type_index = item->type_index;
159 if (ad->targetAtoms[type_index].convert_to_target[req_index])
161 *data_ret = ad->targetAtoms[type_index].convert_to_target[req_index](ad, type_index, item->data);
164 if (size_ret) *size_ret = strlen(*data_ret);
165 if (ttype) *ttype = ad->targetAtoms[item->type_index].atom[0];
166 if (tsize) *tsize = 8;
173 /* For convert EFL to HTML */
175 #define TAGPOS_START 0x00000001
176 #define TAGPOS_END 0x00000002
177 #define TAGPOS_ALONE 0x00000003
179 /* TEXTBLOCK tag using stack but close tag word has no mean maybe bug...
180 * TEXTBLOCK <b>bold<font>font</b>bold</font>
181 * HTML <b>bold<font>font bold</b>font</font> */
183 typedef struct _TagTable {
188 TagTable _EFLtoHTMLConvertTable[] = {
190 {"underline", "del"},
191 {"strikethrough", "ins"},
198 TagTable _HTMLtoEFLConvertTable[] = {
200 {"del", "underline"},
202 {"ins", "strikethrough"},
203 {"s", "strikethrough"},
211 typedef struct _TagNode TagNode, *PTagNode;
213 char *tag; //EINA_STRINGSHARE if NULL just str
216 const char *pos_in_ori_str;
219 unsigned char tagPosType;
222 typedef struct _FontTagData FontTagData, *PFontTagData;
223 struct _FontTagData {
231 typedef struct _ItemTagData ItemTagData, *PItemTagData;
232 struct _ItemTagData {
238 #define SAFEFREE(ptr) \
246 #define freeAndAssign(dst, value) \
256 static PTagNode _new_tag_node(char *tag, char *tag_str, char* str, const char *pos_in_ori_str);
257 static PTagNode _get_start_node(const char *str);
258 static PTagNode _get_next_node(PTagNode prev);
259 static void _delete_node(PTagNode node);
260 static void _link_match_tags(Eina_List *nodes);
261 static char *_get_tag_value(const char *tag_str, const char *tag_name);
262 static char *_convert_to_html(Eina_List* nodes);
263 static void _set_EFL_tag_data(Eina_List* nodes);
264 static char *_convert_to_edje(Eina_List* nodes);
265 static void _set_HTML_tag_data(Eina_List* nodes);
266 static void cleanup_tag_list(Eina_List *nodeList);
267 static PFontTagData _set_EFL_font_data(PFontTagData data, const char *tag_str);
268 static PItemTagData _set_EFL_item_data(PItemTagData data, const char *tag_str);
269 static PFontTagData _set_HTML_font_data(PFontTagData data, const char *tag_str);
270 static PItemTagData _set_HTML_img_data(PItemTagData data, const char *tag_str);
273 static void _dumpNode(Eina_List* nodes);
277 _new_tag_node(char *tag, char *tag_str, char* str, const char *pos_in_ori_str)
279 PTagNode newNode = CALLOC(1, sizeof(TagNode));
281 eina_str_tolower(&tag);
284 eina_str_tolower(&tag_str);
285 newNode->tag_str = tag_str;
287 newNode->pos_in_ori_str = pos_in_ori_str;
292 _get_start_node(const char *str)
294 char *startStr = NULL;
295 if (!str || str[0] == '\0')
300 char *tagStart = strchr(str, '<');
302 startStr = strdup(str);
305 int strLength = tagStart - str;
306 startStr = MALLOC(sizeof(char) * (strLength + 1));
307 strncpy(startStr, str, strLength);
308 startStr[strLength] = '\0';
312 return _new_tag_node(NULL, NULL, startStr, str);
316 _get_next_node(PTagNode prev)
318 PTagNode retTag = NULL;
321 char *tagNameEnd = NULL;
324 if (prev->tag == NULL)
325 tagStart = strchr(prev->pos_in_ori_str, '<');
327 tagStart = strchr(prev->pos_in_ori_str + 1, '<');
332 tagEnd = strchr(tagStart, '>');
333 nextTagStart = strchr(tagStart + 1, '<');
335 if (!tagEnd || (nextTagStart && (nextTagStart < tagEnd)))
336 return _get_start_node(tagStart + 1);
339 char *spArray[spCnt];
340 spArray[0] = strchr(tagStart, '=');
341 spArray[1] = strchr(tagStart, '_');
342 spArray[2] = strchr(tagStart, ' ');
343 spArray[3] = strchr(tagStart, '\t');
344 spArray[4] = strchr(tagStart, '\n');
348 for (i = 0; i < spCnt; i++)
350 if (spArray[i] && spArray[i] < tagNameEnd)
351 tagNameEnd = spArray[i];
354 int tagLength = tagNameEnd - tagStart - 1;
355 char *tagName = NULL;
356 if (!strncmp(&tagStart[1], "/item", tagLength))
357 tagName = strdup("");
359 tagName = strndup(&tagStart[1], tagLength);
361 int tagStrLength = 0;
365 tagStrLength = tagEnd - tagStart + 1;
366 tagStr = strndup(tagStart, tagStrLength);
369 unsigned int strLength = nextTagStart ? (unsigned int)(nextTagStart - tagEnd - 1) : strlen(&tagEnd[1]);
370 char *str = strndup(&tagEnd[1], strLength);
372 retTag = _new_tag_node(tagName, tagStr, str, tagStart);
378 _delete_node(PTagNode node)
382 SAFEFREE(node->tag_str);
389 if (!strcmp("font", node->tag))
391 PFontTagData data = node->tagData;
392 SAFEFREE(data->name);
393 SAFEFREE(data->color);
394 SAFEFREE(data->size);
395 SAFEFREE(data->bg_color);
397 if (!strcmp("item", node->tag))
399 PItemTagData data = node->tagData;
400 SAFEFREE(data->href);
401 SAFEFREE(data->width);
402 SAFEFREE(data->height);
406 SAFEFREE(node->tagData);
414 _link_match_tags(Eina_List *nodes)
416 Eina_List *stack = NULL;
418 PTagNode trail, popData;
421 EINA_LIST_FOREACH(nodes, l, trail)
423 if (!trail->tag || trail->tag[0] == '\0')
425 if (!strcmp("br/", trail->tag))
427 trail->tagPosType = TAGPOS_ALONE;
430 else if (!strcmp("item", trail->tag) || !strcmp("img", trail->tag))
432 trail->tagPosType = TAGPOS_ALONE;
436 if (trail->tag[0] != '/') // PUSH
438 stack = eina_list_append(stack, trail);
439 /* eina_array_push(stack, trail);
440 DMSG("stack: %d, tag %s\n", eina_array_count_get(stack), trail->tag);*/
441 DMSG("stack: %d, tag %s\n", eina_list_count(stack), trail->tag);
445 if (!eina_list_count(stack))
447 DMSG("tag not matched %s\n", trail->tag);
451 EINA_LIST_REVERSE_FOREACH(stack, r, popData)
453 if (popData->tag && !strcmp(popData->tag, &trail->tag[1]))
455 popData->tagPosType = TAGPOS_START;
456 trail->tagPosType = TAGPOS_END;
457 popData->matchTag = trail;
458 trail->matchTag = popData;
459 stack = eina_list_remove_list(stack, r);
463 /* popData = eina_array_pop(stack);
465 popData->tagPosType = TAGPOS_START;
466 trail->tagPosType = TAGPOS_END;
467 popData->matchTag = trail;
468 trail->matchTag = popData;
469 DMSG("pop stack: %d, tag %s\n", eina_array_count_get(stack), trail->tag);
474 /* if (eina_array_count_get(stack))
475 DMSG("stack state: %d, tag %s\n", eina_array_count_get(stack), trail->tag);*/
477 /* Make Dummy close tag */
478 /* while ((popData = eina_array_pop(stack))) */
480 EINA_LIST_REVERSE_FOREACH(stack, r, popData)
483 int tagLength = strlen(popData->tag);
484 char *tagName = MALLOC(sizeof(char) * (tagLength + 2));
488 strcat(tagName, popData->tag);
490 newData = _new_tag_node(tagName, NULL, NULL, NULL);
491 popData->tagPosType = TAGPOS_START;
492 newData->tagPosType = TAGPOS_END;
493 popData->matchTag = newData;
494 newData->matchTag = popData;
495 nodes = eina_list_append(nodes, newData);
496 /* DMSG("stack: %d, tag %s\n", eina_array_count_get(stack), popData->tag);*/
498 /* DMSG("stack_top: %d\n", eina_array_count_get(stack));
499 eina_array_free(stack);*/
500 eina_list_free(stack);
504 _get_tag_value(const char *tag_str, const char *tag_name)
506 if (!tag_name || !tag_str)
510 if ((tag = strstr(tag_str, tag_name)))
512 if (tag[strlen(tag_name)] == '_')
514 char *value = strchr(tag, '=');
520 } while (!isalnum(*value) && *value != '#');
523 char *spArray[spCnt];
524 spArray[0] = strchr(value, ' ');
525 spArray[1] = strchr(value, '>');
526 spArray[2] = strchr(value, '\"');
527 spArray[3] = strchr(value, '\'');
528 spArray[4] = strchr(value, '\t');
529 spArray[5] = strchr(value, '\n');
530 char *valueEnd = strchr(value, '\0');
534 if ((!strncmp(tag_str, "<item", 5) && !strcmp(tag_name, "href")) // EFL img tag
535 || (!strncmp(tag_str, "<img", 4) && !strcmp(tag_name, "src"))) // HTML img tag
538 for (i = start; i < spCnt; i++)
540 if (spArray[i] && spArray[i] < valueEnd)
541 valueEnd = spArray[i];
544 int valueLength = valueEnd - value;
545 return strndup(value, valueLength);
552 _set_EFL_font_data(PFontTagData data, const char *tag_str)
557 data = CALLOC(1, sizeof(FontTagData));
558 value = _get_tag_value(tag_str, "font_size");
559 freeAndAssign(data->size, value);
560 value = _get_tag_value(tag_str, "color");
561 freeAndAssign(data->color, value);
562 value = _get_tag_value(tag_str, "bgcolor");
563 freeAndAssign(data->bg_color, value);
564 value = _get_tag_value(tag_str, "font");
565 freeAndAssign(data->name, value);
571 _set_EFL_item_data(PItemTagData data, const char *tag_str)
576 data = CALLOC(1, sizeof(ItemTagData));
577 value = _get_tag_value(tag_str, "href");
580 char *path = strstr(value, "file://");
583 char *modify = MALLOC(sizeof(char) * (strlen(value) + 1));
584 strncpy(modify, "file://", 8);
586 while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
590 strcat(modify, path);
592 DMSG("image href ---%s---\n", data->href);
596 freeAndAssign(data->href, value);
599 value = _get_tag_value(tag_str, "absize");
602 char *xpos = strchr(value, 'x');
605 int absizeLen = strlen(value);
606 freeAndAssign(data->width, strndup(value, xpos - value));
607 freeAndAssign(data->height, strndup(xpos + 1, absizeLen - (xpos - value) - 1));
608 DMSG("image width: -%s-, height: -%s-\n", data->width, data->height);
616 _set_EFL_tag_data(Eina_List* nodes)
621 EINA_LIST_FOREACH(nodes, l, trail)
625 if (!strcmp("font", trail->tag) || !strcmp("color", trail->tag))
626 trail->tagData = _set_EFL_font_data(trail->tagData, trail->tag_str);
627 else if (!strcmp("item", trail->tag))
628 trail->tagData = _set_EFL_item_data(trail->tagData, trail->tag_str);
633 _set_HTML_font_data(PFontTagData data, const char *tag_str)
638 data = CALLOC(1, sizeof(FontTagData));
639 value = _get_tag_value(tag_str, "size");
640 freeAndAssign(data->size, value);
641 value = _get_tag_value(tag_str, "color");
642 freeAndAssign(data->color, value);
643 value = _get_tag_value(tag_str, "bgcolor");
644 freeAndAssign(data->bg_color, value);
645 value = _get_tag_value(tag_str, "face");
646 freeAndAssign(data->name, value);
652 _set_HTML_img_data(PItemTagData data, const char *tag_str)
657 data = CALLOC(1, sizeof(ItemTagData));
658 value = _get_tag_value(tag_str, "src");
661 char *path = strstr(value, "file://");
664 char *modify = MALLOC(sizeof(char) * (strlen(value) + 1));
665 strncpy(modify, "file://", 8);
667 while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
671 strcat(modify, path);
673 DMSG("image src ---%s---\n", data->href);
677 freeAndAssign(data->href, value);
680 value = _get_tag_value(tag_str, "width");
681 freeAndAssign(data->width, value);
682 value = _get_tag_value(tag_str, "height");
683 freeAndAssign(data->height, value);
688 _set_HTML_tag_data(Eina_List* nodes)
693 EINA_LIST_FOREACH(nodes, l, trail)
697 if (!strcmp("font", trail->tag) || !strcmp("color", trail->tag))
698 trail->tagData = _set_HTML_font_data(trail->tagData, trail->tag_str);
699 else if (!strcmp("img", trail->tag))
700 trail->tagData = _set_HTML_img_data(trail->tagData, trail->tag_str);
706 _dumpNode(Eina_List* nodes)
711 EINA_LIST_FOREACH(nodes, l, trail)
713 DMSG("tag: %s, tag_str: %s, str: %s, tagPosType: %d\n",
714 trail->tag, trail->tag_str, trail->str, trail->tagPosType);
715 DMSG("matchTag: %x ", (unsigned int)trail->matchTag);
717 DMSG("matchTag->tag_str: %s", trail->matchTag->tag_str);
720 if (!strcmp(trail->tag, "font"))
722 PFontTagData data = trail->tagData;
723 DMSG(" tagData->name: %s, tagData->color: %s, tagData->size: %s, tagData->bg_color: %s",
724 data->name, data->color, data->size, data->bg_color);
726 else if (!strcmp(trail->tag, "item") || !strcmp(trail->tag, "img"))
728 PItemTagData data = trail->tagData;
729 DMSG(" tagData->href: %s, tagData->width: %s, tagData->height: %s",
730 data->href, data->width, data->height);
733 DMSG("\nERROR!!!! not need tagData");
741 _convert_to_html(Eina_List* nodes)
746 Eina_Strbuf *html = eina_strbuf_new();
748 int tableCnt = sizeof(_EFLtoHTMLConvertTable) / sizeof(TagTable);
750 EINA_LIST_FOREACH(nodes, l, trail)
754 char *tagName = trail->tagPosType == TAGPOS_END ?
755 trail->matchTag->tag : trail->tag;
757 for(j = 0; j < tableCnt; j++)
759 if (!strcmp(_EFLtoHTMLConvertTable[j].src, tagName))
761 switch(trail->tagPosType)
764 eina_strbuf_append(html, "</");
767 eina_strbuf_append(html, "<");
771 eina_strbuf_append(html, _EFLtoHTMLConvertTable[j].dst);
772 if (trail->tagPosType != TAGPOS_END)
774 if (!strcmp(_EFLtoHTMLConvertTable[j].src, "font"))
776 PFontTagData data = trail->tagData;
782 char *color = strdup(data->color);
783 if (color && color[0] == '#' && strlen(color) == 9)
786 eina_strbuf_append_printf(html, " color=\"%s\"", color);
790 eina_strbuf_append_printf(html, " color=\"%s\"", data->color);
793 eina_strbuf_append_printf(html, " size=\"%s\"", data->size);
798 else if (!strcmp(_EFLtoHTMLConvertTable[j].src, "item"))
800 PItemTagData data = trail->tagData;
802 eina_strbuf_append_printf(html, " src=\"%s\"", data->href);
804 eina_strbuf_append_printf(html, " width=\"%s\"", data->width);
806 eina_strbuf_append_printf(html, " height=\"%s\"", data->height);
809 switch(trail->tagPosType)
811 /* closed tag does not need in HTML
813 eina_strbuf_append(html, " />");
816 eina_strbuf_append(html, ">");
824 eina_strbuf_append(html, trail->str);
827 eina_strbuf_replace_all(html, " ", " ");
828 char *ret = eina_strbuf_string_steal(html);
829 eina_strbuf_free(html);
833 #define IMAGE_DEFAULT_WIDTH "240"
834 #define IMAGE_DEFAULT_HEIGHT "180"
838 _convert_to_edje(Eina_List* nodes)
843 Eina_Strbuf *edje = eina_strbuf_new();
845 int tableCnt = sizeof(_HTMLtoEFLConvertTable) / sizeof(TagTable);
847 EINA_LIST_FOREACH(nodes, l, trail)
851 char *tagName = trail->tagPosType == TAGPOS_END ?
852 trail->matchTag->tag : trail->tag;
854 for(j = 0; j < tableCnt; j++)
856 if (!strcmp(_HTMLtoEFLConvertTable[j].src, tagName))
858 if (_HTMLtoEFLConvertTable[j].dst[0] != '\0')
860 switch(trail->tagPosType)
863 eina_strbuf_append(edje, "</");
866 eina_strbuf_append(edje, "<");
870 eina_strbuf_append(edje, _HTMLtoEFLConvertTable[j].dst);
872 if (trail->tagPosType != TAGPOS_END)
874 if (!strcmp(_HTMLtoEFLConvertTable[j].src, "font"))
876 PFontTagData data = trail->tagData;
882 if (data->color[0] == '#' && strlen(data->color) == 7)
883 eina_strbuf_append_printf(edje, "<color=%sff>", data->color);
885 eina_strbuf_append_printf(edje, "<color=%s>", data->color);
889 eina_strbuf_append_printf(edje, "<font_size=%s>", data->size);
895 else if (!strcmp(_HTMLtoEFLConvertTable[j].src, "img"))
897 PItemTagData data = trail->tagData;
898 char *width = IMAGE_DEFAULT_WIDTH, *height = IMAGE_DEFAULT_HEIGHT;
902 height = data->height;
903 eina_strbuf_append_printf(edje, " absize=%sx%s", width, height);
905 eina_strbuf_append_printf(edje, " href=%s></item>", data->href);
911 if (_HTMLtoEFLConvertTable[j].dst[0] == '\0')
913 if (!strcmp(_HTMLtoEFLConvertTable[j].src, "font"))
915 if (trail->matchTag->tagData)
917 PFontTagData data = trail->matchTag->tagData;
922 eina_strbuf_append_printf(edje, "</color>");
924 eina_strbuf_append_printf(edje, "</font>");
933 switch(trail->tagPosType)
935 /* not support in efl
937 eina_strbuf_append(edje, " />");
941 eina_strbuf_append(edje, ">");
946 }/* for(j = 0; j < tableCnt; j++) end */
949 eina_strbuf_append(edje, trail->str);
952 eina_strbuf_replace_all(edje, " ", " ");
953 char *ret = eina_strbuf_string_steal(edje);
954 eina_strbuf_free(edje);
958 char *string_for_entry_get(AppData *ad, int type_index, const char *str)
960 DMSG("type_index: %d ", type_index);
961 DMSG("str: %s\n", str);
962 if (ad->targetAtoms[type_index].convert_for_entry)
963 return ad->targetAtoms[type_index].convert_for_entry(ad, type_index, str);
967 static char *make_close_tag(Eina_List* nodes)
973 Eina_Strbuf *tag_str = eina_strbuf_new();
975 EINA_LIST_FOREACH(nodes, l, trail)
980 eina_strbuf_append(tag_str, trail->tag_str);
983 eina_strbuf_append(tag_str, "<");
984 eina_strbuf_append(tag_str, trail->tag);
985 eina_strbuf_append(tag_str, ">");
989 eina_strbuf_append(tag_str, trail->str);
992 char *ret = eina_strbuf_string_steal(tag_str);
993 eina_strbuf_free(tag_str);
997 static char *do_not_convert(AppData *ad, int type_index, const char *str)
999 DMSG("str: %s\n", str);
1000 if (type_index != ATOM_INDEX_TEXT)
1002 Eina_List *nodeList = NULL;
1005 nodeData = _get_start_node(str);
1009 nodeList = eina_list_append(nodeList, nodeData);
1010 nodeData = _get_next_node(nodeData);
1013 _link_match_tags(nodeList);
1016 _dumpNode(nodeList);
1018 char *ret = make_close_tag(nodeList);
1019 cleanup_tag_list(nodeList);
1020 DMSG("convert str: %s\n", ret);
1026 static char *efl_to_efl(AppData *ad, int type_index, const char *str)
1032 static char *html_to_html(AppData *ad, int type_index, const char *str)
1039 #define IMAGE_DEFAULT_WIDTH "240"
1040 #define IMAGE_DEFAULT_HEIGHT "180"
1041 static char *make_image_path_tag(int type_index, const char *str)
1043 char *img_tag_str = "file://%s";
1044 char *efl_img_tag = "<item absize="IMAGE_DEFAULT_WIDTH"x"IMAGE_DEFAULT_HEIGHT" href=file://%s>";
1045 char *html_img_tag = "<img src=\"file://%s\">";
1049 case ATOM_INDEX_HTML:
1050 img_tag_str = html_img_tag;
1052 case ATOM_INDEX_EFL:
1053 img_tag_str = efl_img_tag;
1055 case ATOM_INDEX_TEXT:
1056 case ATOM_INDEX_IMAGE:
1059 DMSG("ERROR: wrong type_index: %d\n", type_index);
1063 size_t len = snprintf(NULL, 0, img_tag_str, str) + 1;
1064 char *ret = MALLOC(sizeof(char) * len);
1066 snprintf(ret, len, img_tag_str, str);
1070 static char *image_path_to_text(AppData *ad, int type_index, const char *str)
1072 DMSG("str: %s\n", str);
1073 return make_image_path_tag(ATOM_INDEX_TEXT, str);
1076 static char *image_path_to_html(AppData *ad, int type_index, const char *str)
1078 DMSG("str: %s\n", str);
1079 return make_image_path_tag(ATOM_INDEX_HTML, str);
1082 static char *image_path_to_efl(AppData *ad, int type_index, const char *str)
1084 DMSG("str: %s\n", str);
1085 return make_image_path_tag(ATOM_INDEX_EFL, str);
1088 static char *image_path_to_image_path(AppData *ad, int type_index, const char *str)
1090 DMSG("str: %s\n", str);
1091 return make_image_path_tag(ATOM_INDEX_IMAGE, str);;
1093 static char *markup_to_entry(AppData *ad, int type_index, const char *str)
1099 Eina_Strbuf *strbuf = eina_strbuf_new();
1102 eina_strbuf_prepend(strbuf, "<font_size=18><color=#000000FF>");
1104 const char *trail = str;
1105 char *image_tag_str = NULL;
1106 char *html_img_tag = "img";
1107 char *efl_img_tag = "item";
1108 if (type_index == ATOM_INDEX_HTML) /* HTML */
1109 image_tag_str = html_img_tag;
1110 else if (type_index == ATOM_INDEX_EFL) /* EFL */
1111 image_tag_str = efl_img_tag;
1113 while (trail && *trail)
1115 const char *pretrail = trail;
1116 unsigned long length;
1120 trail = strchr(trail, '<');
1123 eina_strbuf_append(strbuf, pretrail);
1126 endtag = strchr(trail, '>');
1130 length = trail - pretrail;
1132 temp = strndup(pretrail, length);
1139 eina_strbuf_append(strbuf, temp);
1143 if (trail[0] == '/')
1149 if (strncmp(trail, "br", 2) == 0)
1151 eina_strbuf_append(strbuf, "<br>");
1156 if (image_tag_str && strncmp(trail, image_tag_str, strlen(image_tag_str)) == 0)
1158 char *src = strstr(trail, "file://");
1159 char *src_endtag = strchr(trail, '>');
1160 if (!src || !src_endtag || src_endtag < src)
1163 length = src_endtag - src;
1165 src = strndup(src, length);
1174 if (*temp == '\"' || *temp == '>')
1180 eina_strbuf_append_printf(strbuf, "<item absize=66x62 href=%s></item>", src);
1181 DTRACE("src str: %s \n", src);
1187 if (type_index == ATOM_INDEX_HTML)
1188 eina_strbuf_replace_all(strbuf, " ", " ");
1190 char *entry_str = eina_strbuf_string_steal(strbuf);
1191 eina_strbuf_free(strbuf);
1195 static char *html_to_entry(AppData *ad, int type_index, const char *str)
1197 DMSG("str: %s\n", str);
1198 return markup_to_entry(ad, type_index, str);
1201 static char *efl_to_entry(AppData *ad, int type_index, const char *str)
1203 DMSG("str: %s\n", str);
1204 return markup_to_entry(ad, type_index, str);
1207 static char *image_path_to_entry(AppData *ad, int type_index, const char *str)
1213 static char *text_to_entry(AppData *ad, int type_index, const char *str)
1215 DMSG("str: %s\n", str);
1216 char *markup = NULL;
1217 markup = _elm_util_text_to_mkup(str);
1218 char *for_entry = markup_to_entry(ad, type_index, markup);
1223 static Eina_List *make_tag_list(int type_index, const char *str)
1225 Eina_List *nodeList = NULL;
1228 nodeData = _get_start_node(str);
1232 nodeList = eina_list_append(nodeList, nodeData);
1233 nodeData = _get_next_node(nodeData);
1236 _link_match_tags(nodeList);
1240 case ATOM_INDEX_EFL:
1241 _set_EFL_tag_data(nodeList);
1243 case ATOM_INDEX_HTML:
1244 _set_HTML_tag_data(nodeList);
1247 DMSG("wrong index: %d\n");
1251 _dumpNode(nodeList);
1256 static void cleanup_tag_list(Eina_List *nodeList)
1261 EINA_LIST_FOREACH(nodeList, trail, nodeData)
1262 _delete_node(nodeData);
1263 eina_list_free(nodeList);
1266 static char *html_to_efl(AppData *ad, int type_index, const char *str)
1269 Eina_List *nodeList = NULL;
1270 nodeList = make_tag_list(type_index, str);
1271 char *ret = _convert_to_edje(nodeList);
1272 DMSG("efl: %s\n", ret);
1273 cleanup_tag_list(nodeList);
1278 static char *efl_to_html(AppData *ad, int type_index, const char *str)
1281 Eina_List *nodeList = NULL;
1282 nodeList = make_tag_list(type_index, str);
1283 char *ret = _convert_to_html(nodeList);
1284 DMSG("html: %s\n", ret);
1285 cleanup_tag_list(nodeList);
1290 static char *text_to_html(AppData *ad, int type_index, const char *str)
1292 DMSG("str: %s\n", str);
1293 char *markup = NULL;
1294 markup = _elm_util_text_to_mkup(str);
1295 char *html = efl_to_html(ad, ATOM_INDEX_EFL, markup);
1300 static char *text_to_efl(AppData *ad, int type_index, const char *str)
1302 DMSG("str: %s\n", str);
1304 ret = _elm_util_text_to_mkup(str);
1308 static char *to_text(AppData *ad, int type_index, const char *str)
1310 DMSG("str: %s\n", str);
1312 if (type_index == ATOM_INDEX_HTML)
1314 Eina_Strbuf *buf = eina_strbuf_new();
1318 eina_strbuf_append(buf, str);
1319 eina_strbuf_replace_all(buf, " ", " ");
1320 html = eina_strbuf_string_steal(buf);
1321 eina_strbuf_free(buf);
1322 text = _elm_util_mkup_to_text(html);
1328 text = _elm_util_mkup_to_text(str);