2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
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, NULL, 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 int item_type_index = ATOM_INDEX_TEXT;
122 item_type_index = item->type_index;
124 for (i = 0, count = 0; i < ATOM_INDEX_MAX; i++)
126 if (ad->targetAtoms[item_type_index].convert_to_target[i])
127 count += ad->targetAtoms[i].atom_cnt;
130 *data_ret = MALLOC(sizeof(Ecore_X_Atom) * count);
131 DMSG("item_type: %d, target Atom cnt: %d\n", item_type_index, count);
135 for (i = 0, count = 0; i < ATOM_INDEX_MAX; i++)
137 if (ad->targetAtoms[item_type_index].convert_to_target[i])
139 for(j = 0; j < ad->targetAtoms[i].atom_cnt; j++)
141 ((Ecore_X_Atom *)*data_ret)[count++] = ad->targetAtoms[i].atom[j];
142 DMSG("send target atom: %s\n", ad->targetAtoms[i].name[j]);
147 if (size_ret) *size_ret = count;
148 if (ttype) *ttype = ECORE_X_ATOM_ATOM;
149 if (tsize) *tsize = 32;
153 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)
157 if (ad->targetAtoms[ATOM_INDEX_TARGET].atom[0] == reqAtom)
158 return targets_converter(ad, reqAtom, item, data_ret, size_ret, ttype, tsize);
160 int req_index = atom_type_index_get(ad, reqAtom);
161 int item_type_index = ATOM_INDEX_TEXT;
162 void *item_data = "";
165 item_type_index = item->type_index;
166 item_data = item->data;
169 if (ad->targetAtoms[item_type_index].convert_to_target[req_index])
171 *data_ret = ad->targetAtoms[item_type_index].convert_to_target[req_index](ad, item_type_index, item_data);
174 if (size_ret) *size_ret = strlen(*data_ret);
175 if (ttype) *ttype = ad->targetAtoms[item_type_index].atom[0];
176 if (tsize) *tsize = 8;
183 /* For convert EFL to HTML */
185 #define TAGPOS_START 0x00000001
186 #define TAGPOS_END 0x00000002
187 #define TAGPOS_ALONE 0x00000003
189 /* TEXTBLOCK tag using stack but close tag word has no mean maybe bug...
190 * TEXTBLOCK <b>bold<font>font</b>bold</font>
191 * HTML <b>bold<font>font bold</b>font</font> */
193 typedef struct _TagTable {
198 TagTable _EFLtoHTMLConvertTable[] = {
200 {"underline", "del"},
201 {"strikethrough", "ins"},
209 TagTable _HTMLtoEFLConvertTable[] = {
211 {"del", "underline"},
213 {"ins", "strikethrough"},
214 {"s", "strikethrough"},
222 typedef struct _TagNode TagNode, *PTagNode;
224 char *tag; //EINA_STRINGSHARE if NULL just str
227 const char *pos_in_ori_str;
230 unsigned char tagPosType;
233 typedef struct _FontTagData FontTagData, *PFontTagData;
234 struct _FontTagData {
242 typedef struct _ItemTagData ItemTagData, *PItemTagData;
243 struct _ItemTagData {
249 #define SAFEFREE(ptr) \
257 #define freeAndAssign(dst, value) \
267 static PTagNode _new_tag_node(char *tag, char *tag_str, char* str, const char *pos_in_ori_str);
268 static PTagNode _get_start_node(const char *str);
269 static PTagNode _get_next_node(PTagNode prev);
270 static void _delete_node(PTagNode node);
271 static void _link_match_tags(Eina_List *nodes);
272 static char *_get_tag_value(const char *tag_str, const char *tag_name);
273 static char *_convert_to_html(Eina_List* nodes);
274 static void _set_EFL_tag_data(Eina_List* nodes);
275 static char *_convert_to_edje(Eina_List* nodes);
276 static void _set_HTML_tag_data(Eina_List* nodes);
277 static void cleanup_tag_list(Eina_List *nodeList);
278 static PFontTagData _set_EFL_font_data(PFontTagData data, const char *tag_str);
279 static PItemTagData _set_EFL_item_data(PItemTagData data, const char *tag_str);
280 static PFontTagData _set_HTML_font_data(PFontTagData data, const char *tag_str);
281 static PItemTagData _set_HTML_img_data(PItemTagData data, const char *tag_str);
284 static void _dumpNode(Eina_List* nodes);
288 _new_tag_node(char *tag, char *tag_str, char* str, const char *pos_in_ori_str)
290 PTagNode newNode = CALLOC(1, sizeof(TagNode));
292 eina_str_tolower(&tag);
295 eina_str_tolower(&tag_str);
296 newNode->tag_str = tag_str;
298 newNode->pos_in_ori_str = pos_in_ori_str;
303 _get_start_node(const char *str)
305 char *startStr = NULL;
306 if (!str || str[0] == '\0')
311 char *tagStart = strchr(str, '<');
313 startStr = strdup(str);
316 int strLength = tagStart - str;
317 startStr = MALLOC(sizeof(char) * (strLength + 1));
318 strncpy(startStr, str, strLength);
319 startStr[strLength] = '\0';
323 return _new_tag_node(NULL, NULL, startStr, str);
327 _get_next_node(PTagNode prev)
329 PTagNode retTag = NULL;
332 char *tagNameEnd = NULL;
335 if (prev->tag == NULL)
336 tagStart = strchr(prev->pos_in_ori_str, '<');
338 tagStart = strchr(prev->pos_in_ori_str + 1, '<');
343 tagEnd = strchr(tagStart, '>');
344 nextTagStart = strchr(tagStart + 1, '<');
346 if (!tagEnd || (nextTagStart && (nextTagStart < tagEnd)))
347 return _get_start_node(tagStart + 1);
350 char *spArray[spCnt];
351 spArray[0] = strchr(tagStart, '=');
352 spArray[1] = strchr(tagStart, '_');
353 spArray[2] = strchr(tagStart, ' ');
354 spArray[3] = strchr(tagStart, '\t');
355 spArray[4] = strchr(tagStart, '\n');
359 for (i = 0; i < spCnt; i++)
361 if (spArray[i] && spArray[i] < tagNameEnd)
362 tagNameEnd = spArray[i];
365 int tagLength = tagNameEnd - tagStart - 1;
366 char *tagName = NULL;
367 if (!strncmp(&tagStart[1], "/item", tagLength))
368 tagName = strdup("");
370 tagName = strndup(&tagStart[1], tagLength);
372 int tagStrLength = 0;
376 tagStrLength = tagEnd - tagStart + 1;
377 tagStr = strndup(tagStart, tagStrLength);
380 unsigned int strLength = nextTagStart ? (unsigned int)(nextTagStart - tagEnd - 1) : strlen(&tagEnd[1]);
381 char *str = strndup(&tagEnd[1], strLength);
383 retTag = _new_tag_node(tagName, tagStr, str, tagStart);
389 _delete_node(PTagNode node)
393 SAFEFREE(node->tag_str);
400 if (!strcmp("font", node->tag))
402 PFontTagData data = node->tagData;
403 SAFEFREE(data->name);
404 SAFEFREE(data->color);
405 SAFEFREE(data->size);
406 SAFEFREE(data->bg_color);
408 if (!strcmp("item", node->tag))
410 PItemTagData data = node->tagData;
411 SAFEFREE(data->href);
412 SAFEFREE(data->width);
413 SAFEFREE(data->height);
417 SAFEFREE(node->tagData);
425 _link_match_tags(Eina_List *nodes)
427 Eina_List *stack = NULL;
429 PTagNode trail, popData;
432 EINA_LIST_FOREACH(nodes, l, trail)
434 if (!trail->tag || trail->tag[0] == '\0')
436 if (!strcmp("br/", trail->tag))
438 trail->tagPosType = TAGPOS_ALONE;
441 else if (!strcmp("item", trail->tag) || !strcmp("img", trail->tag))
443 trail->tagPosType = TAGPOS_ALONE;
447 if (trail->tag[0] != '/') // PUSH
449 stack = eina_list_append(stack, trail);
450 /* eina_array_push(stack, trail);
451 DMSG("stack: %d, tag %s\n", eina_array_count_get(stack), trail->tag);*/
452 DMSG("stack: %d, tag %s\n", eina_list_count(stack), trail->tag);
456 if (!eina_list_count(stack))
458 DMSG("tag not matched %s\n", trail->tag);
462 EINA_LIST_REVERSE_FOREACH(stack, r, popData)
464 if (popData->tag && !strcmp(popData->tag, &trail->tag[1]))
466 popData->tagPosType = TAGPOS_START;
467 trail->tagPosType = TAGPOS_END;
468 popData->matchTag = trail;
469 trail->matchTag = popData;
470 stack = eina_list_remove_list(stack, r);
474 /* popData = eina_array_pop(stack);
476 popData->tagPosType = TAGPOS_START;
477 trail->tagPosType = TAGPOS_END;
478 popData->matchTag = trail;
479 trail->matchTag = popData;
480 DMSG("pop stack: %d, tag %s\n", eina_array_count_get(stack), trail->tag);
485 /* if (eina_array_count_get(stack))
486 DMSG("stack state: %d, tag %s\n", eina_array_count_get(stack), trail->tag);*/
488 /* Make Dummy close tag */
489 /* while ((popData = eina_array_pop(stack))) */
491 EINA_LIST_REVERSE_FOREACH(stack, r, popData)
494 int tagLength = strlen(popData->tag);
495 char *tagName = MALLOC(sizeof(char) * (tagLength + 2));
499 strcat(tagName, popData->tag);
501 newData = _new_tag_node(tagName, NULL, NULL, NULL);
502 popData->tagPosType = TAGPOS_START;
503 newData->tagPosType = TAGPOS_END;
504 popData->matchTag = newData;
505 newData->matchTag = popData;
506 nodes = eina_list_append(nodes, newData);
507 /* DMSG("stack: %d, tag %s\n", eina_array_count_get(stack), popData->tag);*/
509 /* DMSG("stack_top: %d\n", eina_array_count_get(stack));
510 eina_array_free(stack);*/
511 eina_list_free(stack);
515 _get_tag_value(const char *tag_str, const char *tag_name)
517 if (!tag_name || !tag_str)
521 if ((tag = strstr(tag_str, tag_name)))
523 if (tag[strlen(tag_name)] == '_')
525 char *value = strchr(tag, '=');
531 } while (!isalnum(*value) && *value != '#');
534 char *spArray[spCnt];
535 spArray[0] = strchr(value, ' ');
536 spArray[1] = strchr(value, '>');
537 spArray[2] = strchr(value, '\"');
538 spArray[3] = strchr(value, '\'');
539 spArray[4] = strchr(value, '\t');
540 spArray[5] = strchr(value, '\n');
541 char *valueEnd = strchr(value, '\0');
545 if ((!strncmp(tag_str, "<item", 5) && !strcmp(tag_name, "href")) // EFL img tag
546 || (!strncmp(tag_str, "<img", 4) && !strcmp(tag_name, "src"))) // HTML img tag
549 for (i = start; i < spCnt; i++)
551 if (spArray[i] && spArray[i] < valueEnd)
552 valueEnd = spArray[i];
555 int valueLength = valueEnd - value;
556 return strndup(value, valueLength);
563 _set_EFL_font_data(PFontTagData data, const char *tag_str)
568 data = CALLOC(1, sizeof(FontTagData));
569 value = _get_tag_value(tag_str, "font_size");
570 freeAndAssign(data->size, value);
571 value = _get_tag_value(tag_str, "color");
572 freeAndAssign(data->color, value);
573 value = _get_tag_value(tag_str, "bgcolor");
574 freeAndAssign(data->bg_color, value);
575 value = _get_tag_value(tag_str, "font");
576 freeAndAssign(data->name, value);
582 _set_EFL_item_data(PItemTagData data, const char *tag_str)
587 data = CALLOC(1, sizeof(ItemTagData));
588 value = _get_tag_value(tag_str, "href");
591 char *path = strstr(value, "file://");
594 char *modify = MALLOC(sizeof(char) * (strlen(value) + 1));
595 strncpy(modify, "file://", 8);
597 while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
601 strcat(modify, path);
603 DMSG("image href ---%s---\n", data->href);
607 freeAndAssign(data->href, value);
610 value = _get_tag_value(tag_str, "absize");
613 char *xpos = strchr(value, 'x');
616 int absizeLen = strlen(value);
617 freeAndAssign(data->width, strndup(value, xpos - value));
618 freeAndAssign(data->height, strndup(xpos + 1, absizeLen - (xpos - value) - 1));
619 DMSG("image width: -%s-, height: -%s-\n", data->width, data->height);
627 _set_EFL_tag_data(Eina_List* nodes)
632 EINA_LIST_FOREACH(nodes, l, trail)
636 if (!strcmp("font", trail->tag) || !strcmp("color", trail->tag))
637 trail->tagData = _set_EFL_font_data(trail->tagData, trail->tag_str);
638 else if (!strcmp("item", trail->tag))
639 trail->tagData = _set_EFL_item_data(trail->tagData, trail->tag_str);
644 _set_HTML_font_data(PFontTagData data, const char *tag_str)
649 data = CALLOC(1, sizeof(FontTagData));
650 value = _get_tag_value(tag_str, "size");
651 freeAndAssign(data->size, value);
652 value = _get_tag_value(tag_str, "color");
653 freeAndAssign(data->color, value);
654 value = _get_tag_value(tag_str, "bgcolor");
655 freeAndAssign(data->bg_color, value);
656 value = _get_tag_value(tag_str, "face");
657 freeAndAssign(data->name, value);
663 _set_HTML_img_data(PItemTagData data, const char *tag_str)
668 data = CALLOC(1, sizeof(ItemTagData));
669 value = _get_tag_value(tag_str, "src");
672 char *path = strstr(value, "file://");
675 char *modify = MALLOC(sizeof(char) * (strlen(value) + 1));
676 strncpy(modify, "file://", 8);
678 while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
682 strcat(modify, path);
684 DMSG("image src ---%s---\n", data->href);
688 freeAndAssign(data->href, value);
691 value = _get_tag_value(tag_str, "width");
692 freeAndAssign(data->width, value);
693 value = _get_tag_value(tag_str, "height");
694 freeAndAssign(data->height, value);
699 _set_HTML_tag_data(Eina_List* nodes)
704 EINA_LIST_FOREACH(nodes, l, trail)
708 if (!strcmp("font", trail->tag) || !strcmp("color", trail->tag))
709 trail->tagData = _set_HTML_font_data(trail->tagData, trail->tag_str);
710 else if (!strcmp("img", trail->tag))
711 trail->tagData = _set_HTML_img_data(trail->tagData, trail->tag_str);
717 _dumpNode(Eina_List* nodes)
722 EINA_LIST_FOREACH(nodes, l, trail)
724 DMSG("tag: %s, tag_str: %s, str: %s, tagPosType: %d\n",
725 trail->tag, trail->tag_str, trail->str, trail->tagPosType);
726 DMSG("matchTag: %x ", (unsigned int)trail->matchTag);
728 DMSG("matchTag->tag_str: %s", trail->matchTag->tag_str);
731 if (!strcmp(trail->tag, "font"))
733 PFontTagData data = trail->tagData;
734 DMSG(" tagData->name: %s, tagData->color: %s, tagData->size: %s, tagData->bg_color: %s",
735 data->name, data->color, data->size, data->bg_color);
737 else if (!strcmp(trail->tag, "item") || !strcmp(trail->tag, "img"))
739 PItemTagData data = trail->tagData;
740 DMSG(" tagData->href: %s, tagData->width: %s, tagData->height: %s",
741 data->href, data->width, data->height);
744 DMSG("\nERROR!!!! not need tagData");
752 _convert_to_html(Eina_List* nodes)
757 Eina_Strbuf *html = eina_strbuf_new();
759 int tableCnt = sizeof(_EFLtoHTMLConvertTable) / sizeof(TagTable);
761 EINA_LIST_FOREACH(nodes, l, trail)
765 char *tagName = trail->tagPosType == TAGPOS_END ?
766 trail->matchTag->tag : trail->tag;
768 for(j = 0; j < tableCnt; j++)
770 if (!strcmp(_EFLtoHTMLConvertTable[j].src, tagName))
772 switch(trail->tagPosType)
775 eina_strbuf_append(html, "</");
778 eina_strbuf_append(html, "<");
782 eina_strbuf_append(html, _EFLtoHTMLConvertTable[j].dst);
783 if (trail->tagPosType != TAGPOS_END)
785 if (!strcmp(_EFLtoHTMLConvertTable[j].src, "font"))
787 PFontTagData data = trail->tagData;
793 char *color = strdup(data->color);
794 if (color && color[0] == '#' && strlen(color) == 9)
797 eina_strbuf_append_printf(html, " color=\"%s\"", color);
801 eina_strbuf_append_printf(html, " color=\"%s\"", data->color);
804 eina_strbuf_append_printf(html, " size=\"%s\"", data->size);
809 else if (!strcmp(_EFLtoHTMLConvertTable[j].src, "item"))
811 PItemTagData data = trail->tagData;
813 eina_strbuf_append_printf(html, " src=\"%s\"", data->href);
815 eina_strbuf_append_printf(html, " width=\"%s\"", data->width);
817 eina_strbuf_append_printf(html, " height=\"%s\"", data->height);
820 switch(trail->tagPosType)
822 /* closed tag does not need in HTML
824 eina_strbuf_append(html, " />");
827 eina_strbuf_append(html, ">");
835 eina_strbuf_append(html, trail->str);
838 eina_strbuf_replace_all(html, " ", " ");
839 char *ret = eina_strbuf_string_steal(html);
840 eina_strbuf_free(html);
844 #define IMAGE_DEFAULT_WIDTH "240"
845 #define IMAGE_DEFAULT_HEIGHT "180"
849 _convert_to_edje(Eina_List* nodes)
854 Eina_Strbuf *edje = eina_strbuf_new();
856 int tableCnt = sizeof(_HTMLtoEFLConvertTable) / sizeof(TagTable);
858 EINA_LIST_FOREACH(nodes, l, trail)
862 char *tagName = trail->tagPosType == TAGPOS_END ?
863 trail->matchTag->tag : trail->tag;
865 for(j = 0; j < tableCnt; j++)
867 if (!strcmp(_HTMLtoEFLConvertTable[j].src, tagName))
869 if (_HTMLtoEFLConvertTable[j].dst[0] != '\0')
871 switch(trail->tagPosType)
874 eina_strbuf_append(edje, "</");
877 eina_strbuf_append(edje, "<");
881 eina_strbuf_append(edje, _HTMLtoEFLConvertTable[j].dst);
883 if (trail->tagPosType != TAGPOS_END)
885 if (!strcmp(_HTMLtoEFLConvertTable[j].src, "font"))
887 PFontTagData data = trail->tagData;
893 if (data->color[0] == '#' && strlen(data->color) == 7)
894 eina_strbuf_append_printf(edje, "<color=%sff>", data->color);
896 eina_strbuf_append_printf(edje, "<color=%s>", data->color);
900 eina_strbuf_append_printf(edje, "<font_size=%s>", data->size);
906 else if (!strcmp(_HTMLtoEFLConvertTable[j].src, "img"))
908 PItemTagData data = trail->tagData;
909 char *width = IMAGE_DEFAULT_WIDTH, *height = IMAGE_DEFAULT_HEIGHT;
913 height = data->height;
914 eina_strbuf_append_printf(edje, " absize=%sx%s", width, height);
916 eina_strbuf_append_printf(edje, " href=%s></item>", data->href);
922 if (_HTMLtoEFLConvertTable[j].dst[0] == '\0')
924 if (!strcmp(_HTMLtoEFLConvertTable[j].src, "font"))
926 if (trail->matchTag->tagData)
928 PFontTagData data = trail->matchTag->tagData;
933 eina_strbuf_append_printf(edje, "</color>");
935 eina_strbuf_append_printf(edje, "</font>");
944 switch(trail->tagPosType)
946 /* not support in efl
948 eina_strbuf_append(edje, " />");
952 eina_strbuf_append(edje, ">");
957 }/* for(j = 0; j < tableCnt; j++) end */
960 eina_strbuf_append(edje, trail->str);
963 eina_strbuf_replace_all(edje, " ", " ");
964 char *ret = eina_strbuf_string_steal(edje);
965 eina_strbuf_free(edje);
969 char *string_for_entry_get(AppData *ad, int type_index, const char *str)
971 DMSG("type_index: %d ", type_index);
972 DMSG("str: %s\n", str);
973 if (ad->targetAtoms[type_index].convert_for_entry)
974 return ad->targetAtoms[type_index].convert_for_entry(ad, type_index, str);
978 static char *make_close_tag(Eina_List* nodes)
984 Eina_Strbuf *tag_str = eina_strbuf_new();
986 EINA_LIST_FOREACH(nodes, l, trail)
991 eina_strbuf_append(tag_str, trail->tag_str);
994 eina_strbuf_append(tag_str, "<");
995 eina_strbuf_append(tag_str, trail->tag);
996 eina_strbuf_append(tag_str, ">");
1000 eina_strbuf_append(tag_str, trail->str);
1003 char *ret = eina_strbuf_string_steal(tag_str);
1004 eina_strbuf_free(tag_str);
1008 static char *do_not_convert(AppData *ad, int type_index, const char *str)
1010 DMSG("str: %s\n", str);
1011 if (type_index != ATOM_INDEX_TEXT)
1013 Eina_List *nodeList = NULL;
1016 nodeData = _get_start_node(str);
1020 nodeList = eina_list_append(nodeList, nodeData);
1021 nodeData = _get_next_node(nodeData);
1024 _link_match_tags(nodeList);
1027 _dumpNode(nodeList);
1029 char *ret = make_close_tag(nodeList);
1030 cleanup_tag_list(nodeList);
1031 DMSG("convert str: %s\n", ret);
1037 static char *efl_to_efl(AppData *ad, int type_index, const char *str)
1043 static char *html_to_html(AppData *ad, int type_index, const char *str)
1050 #define IMAGE_DEFAULT_WIDTH "240"
1051 #define IMAGE_DEFAULT_HEIGHT "180"
1052 static char *make_image_path_tag(int type_index, const char *str)
1054 char *img_tag_str = "file://%s";
1055 char *efl_img_tag = "<item absize="IMAGE_DEFAULT_WIDTH"x"IMAGE_DEFAULT_HEIGHT" href=file://%s>";
1056 char *html_img_tag = "<img src=\"file://%s\">";
1060 case ATOM_INDEX_HTML:
1061 img_tag_str = html_img_tag;
1063 case ATOM_INDEX_EFL:
1064 img_tag_str = efl_img_tag;
1066 case ATOM_INDEX_TEXT:
1067 case ATOM_INDEX_IMAGE:
1070 DMSG("ERROR: wrong type_index: %d\n", type_index);
1074 size_t len = snprintf(NULL, 0, img_tag_str, str) + 1;
1075 char *ret = MALLOC(sizeof(char) * len);
1077 snprintf(ret, len, img_tag_str, str);
1082 static char *image_path_to_text(AppData *ad, int type_index, const char *str)
1084 DMSG("str: %s\n", str);
1085 return make_image_path_tag(ATOM_INDEX_TEXT, str);
1089 static char *image_path_to_html(AppData *ad, int type_index, const char *str)
1091 DMSG("str: %s\n", str);
1092 return make_image_path_tag(ATOM_INDEX_HTML, str);
1095 static char *image_path_to_efl(AppData *ad, int type_index, const char *str)
1097 DMSG("str: %s\n", str);
1098 return make_image_path_tag(ATOM_INDEX_EFL, str);
1101 static char *image_path_to_image_path(AppData *ad, int type_index, const char *str)
1103 DMSG("str: %s\n", str);
1104 return make_image_path_tag(ATOM_INDEX_IMAGE, str);;
1106 static char *markup_to_entry(AppData *ad, int type_index, const char *str)
1112 Eina_Strbuf *strbuf = eina_strbuf_new();
1115 eina_strbuf_prepend(strbuf, "<font_size=18><color=#000000FF>");
1117 const char *trail = str;
1118 char *image_tag_str = NULL;
1119 char *html_img_tag = "img";
1120 char *efl_img_tag = "item";
1121 if (type_index == ATOM_INDEX_HTML) /* HTML */
1122 image_tag_str = html_img_tag;
1123 else if (type_index == ATOM_INDEX_EFL) /* EFL */
1124 image_tag_str = efl_img_tag;
1126 while (trail && *trail)
1128 const char *pretrail = trail;
1129 unsigned long length;
1133 trail = strchr(trail, '<');
1136 eina_strbuf_append(strbuf, pretrail);
1139 endtag = strchr(trail, '>');
1143 length = trail - pretrail;
1145 temp = strndup(pretrail, length);
1152 eina_strbuf_append(strbuf, temp);
1156 if (trail[0] == '/')
1162 if (strncmp(trail, "br", 2) == 0)
1164 eina_strbuf_append(strbuf, "<br>");
1169 if (image_tag_str && strncmp(trail, image_tag_str, strlen(image_tag_str)) == 0)
1171 char *src = strstr(trail, "file://");
1172 char *src_endtag = strchr(trail, '>');
1173 if (!src || !src_endtag || src_endtag < src)
1176 length = src_endtag - src;
1178 src = strndup(src, length);
1187 if (*temp == '\"' || *temp == '>')
1193 eina_strbuf_append_printf(strbuf, "<item absize=66x62 href=%s></item>", src);
1194 DTRACE("src str: %s \n", src);
1200 if (type_index == ATOM_INDEX_HTML)
1201 eina_strbuf_replace_all(strbuf, " ", " ");
1203 char *entry_str = eina_strbuf_string_steal(strbuf);
1204 eina_strbuf_free(strbuf);
1208 static char *html_to_entry(AppData *ad, int type_index, const char *str)
1210 DMSG("str: %s\n", str);
1211 return markup_to_entry(ad, type_index, str);
1214 static char *efl_to_entry(AppData *ad, int type_index, const char *str)
1216 DMSG("str: %s\n", str);
1217 return markup_to_entry(ad, type_index, str);
1220 static char *image_path_to_entry(AppData *ad, int type_index, const char *str)
1226 static char *text_to_entry(AppData *ad, int type_index, const char *str)
1228 DMSG("str: %s\n", str);
1229 char *markup = NULL;
1230 markup = (char*)_elm_util_text_to_mkup(str);
1231 char *for_entry = markup_to_entry(ad, type_index, markup);
1236 static Eina_List *make_tag_list(int type_index, const char *str)
1238 Eina_List *nodeList = NULL;
1241 nodeData = _get_start_node(str);
1245 nodeList = eina_list_append(nodeList, nodeData);
1246 nodeData = _get_next_node(nodeData);
1249 _link_match_tags(nodeList);
1253 case ATOM_INDEX_EFL:
1254 _set_EFL_tag_data(nodeList);
1256 case ATOM_INDEX_HTML:
1257 _set_HTML_tag_data(nodeList);
1260 DMSG("wrong index: %d\n");
1264 _dumpNode(nodeList);
1269 static void cleanup_tag_list(Eina_List *nodeList)
1274 EINA_LIST_FOREACH(nodeList, trail, nodeData)
1275 _delete_node(nodeData);
1276 eina_list_free(nodeList);
1279 static char *html_to_efl(AppData *ad, int type_index, const char *str)
1282 Eina_List *nodeList = NULL;
1283 nodeList = make_tag_list(type_index, str);
1284 char *ret = _convert_to_edje(nodeList);
1285 DMSG("efl: %s\n", ret);
1286 cleanup_tag_list(nodeList);
1291 static char *efl_to_html(AppData *ad, int type_index, const char *str)
1294 Eina_List *nodeList = NULL;
1295 nodeList = make_tag_list(type_index, str);
1296 char *ret = _convert_to_html(nodeList);
1297 DMSG("html: %s\n", ret);
1298 cleanup_tag_list(nodeList);
1303 static char *text_to_html(AppData *ad, int type_index, const char *str)
1305 DMSG("str: %s\n", str);
1306 char *markup = NULL;
1307 markup = (char*)_elm_util_text_to_mkup(str);
1308 char *html = efl_to_html(ad, ATOM_INDEX_EFL, markup);
1313 static char *text_to_efl(AppData *ad, int type_index, const char *str)
1315 DMSG("str: %s\n", str);
1317 ret = (char*)_elm_util_text_to_mkup(str);
1321 static char *to_text(AppData *ad, int type_index, const char *str)
1323 DMSG("str: %s\n", str);
1325 if (type_index == ATOM_INDEX_HTML)
1327 Eina_Strbuf *buf = eina_strbuf_new();
1331 eina_strbuf_append(buf, str);
1332 eina_strbuf_replace_all(buf, " ", " ");
1333 html = eina_strbuf_string_steal(buf);
1334 eina_strbuf_free(buf);
1335 text = (char*)_elm_util_mkup_to_text(html);
1341 text = (char*)_elm_util_mkup_to_text(str);