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);
24 static char *polaris_to_entry(AppData *ad, int type_index, const char *str);
26 //static char *make_close_tag(Eina_List* nodes);
27 static char *do_not_convert(AppData *ad, int type_index, const char *str);
28 static char *html_to_efl(AppData *ad, int type_index, const char *str);
29 static char *efl_to_html(AppData *ad, int type_index, const char *str);
30 static char *text_to_html(AppData *ad, int type_index, const char *str);
31 static char *text_to_efl(AppData *ad, int type_index, const char *str);
32 static char *to_text(AppData *ad, int type_index, const char *str);
33 static char *image_path_to_html(AppData *ad, int type_index, const char *str);
34 static char *image_path_to_efl(AppData *ad, int type_index, const char *str);
35 //static char *image_path_to_text(AppData *ad, int type_index, const char *str);
36 //static char *efl_to_efl(AppData *ad, int type_index, const char *str);
37 //static char *html_to_html(AppData *ad, int type_index, const char *str);
38 static char *image_path_to_image_path(AppData *ad, int type_index, const char *str);
39 static char *html_to_image_path(AppData *ad, int type_index, const char *str);
40 static char *efl_to_image_path(AppData *ad, int type_index, const char *str);
42 ENTRY_EMOTICON_S emotion_name_table[ENTRY_EMOTICON_MAX] = {
43 [ENTRY_EMOTICON_HAPPY] = {"emoticon/happy", ":-)"},
44 [ENTRY_EMOTICON_SORRY] = {"emoticon/sorry", ":-("},
45 [ENTRY_EMOTICON_WINK] = {"emoticon/wink", ";-)"},
46 [ENTRY_EMOTICON_TONGUE_DANGLING] = {"emoticon/tongue-dangling", ":-P"},
47 [ENTRY_EMOTICON_SUPRISED] = {"emoticon/surprised", "=-O"},
48 [ENTRY_EMOTICON_KISS] = {"emoticon/kiss", ":-*"},
49 [ENTRY_EMOTICON_ANGRY_SHOUT] = {"emoticon/angry-shout", ":O"},
50 [ENTRY_EMOTICON_SMILE] = {"emoticon/smile", "B-)"},
51 [ENTRY_EMOTICON_OMG] = {"emoticon/omg", ":-["},
52 [ENTRY_EMOTICON_LITTLE_BIT_SORRY] = {"emoticon/little-bit-sorry", ":-\\"},
53 [ENTRY_EMOTICON_VERY_SORRY] = {"emoticon/very-sorry", ":'("},
54 [ENTRY_EMOTICON_GUILTY] = {"emoticon/guilty", ":-X"},
55 [ENTRY_EMOTICON_HAHA] = {"emoticon/haha", ":-D"},
56 [ENTRY_EMOTICON_WORRIED] = {"emoticon/worried", "o_O"},
57 [ENTRY_EMOTICON_LOVE] = {"emoticon/love", "<3"}, //<3
58 [ENTRY_EMOTICON_EVIL] = {"emoticon/evil", "x-("},
59 [ENTRY_EMOTICON_HALF_SMILE] = {"emoticon/half-smile", ":-/"},
60 [ENTRY_EMOTICON_MINIMAL_SMILE] = {"emoticon/minimal-smile", ":-|"},
63 int atom_type_index_get(AppData *ad, Ecore_X_Atom atom)
66 for (i = 0; i < ATOM_INDEX_MAX; i++)
68 for (j = 0; j < ad->targetAtoms[i].atom_cnt; j++)
69 if (ad->targetAtoms[i].atom[j] == atom)
75 void init_target_atoms(AppData *ad)
77 int atom_cnt[ATOM_INDEX_MAX] = {
80 char *targetAtomNames[][5] = {
82 { "UTF8_STRING", "STRING", "TEXT", "text/plain;charset=utf-8", "text/plain" },
83 { "text/html;charset=utf-8", "text/html" },
84 { "application/x-elementary-markup" },
85 { "text/uri", "text/uri-list" },
88 text_converter_func converts_to_entry[ATOM_INDEX_MAX] = {
89 NULL, text_to_entry, html_to_entry, efl_to_entry, image_path_to_entry, polaris_to_entry
92 text_converter_func converts[ATOM_INDEX_MAX][ATOM_INDEX_MAX] = {
93 {NULL, NULL, NULL, NULL, NULL, NULL},
94 {NULL, do_not_convert, text_to_html, text_to_efl, NULL, NULL},
95 {NULL, to_text, do_not_convert, html_to_efl, html_to_image_path, NULL},
96 {NULL, to_text, efl_to_html, do_not_convert, do_not_convert, NULL},
97 {NULL, NULL, image_path_to_html, image_path_to_efl, image_path_to_image_path, NULL},
98 {NULL, to_text, NULL, NULL, NULL, do_not_convert}
102 for (i = 0; i < ATOM_INDEX_MAX; i++)
104 ad->targetAtoms[i].atom_cnt = atom_cnt[i];
105 ad->targetAtoms[i].name = MALLOC(sizeof(char *) * atom_cnt[i]);
106 ad->targetAtoms[i].atom = MALLOC(sizeof(Ecore_X_Atom) * atom_cnt[i]);
107 for (j = 0; j < atom_cnt[i]; j++)
109 DBG("atomName: %s", targetAtomNames[i][j]);
110 ad->targetAtoms[i].name[j] = SAFE_STRDUP(targetAtomNames[i][j]);
111 ad->targetAtoms[i].atom[j] = ecore_x_atom_get(targetAtomNames[i][j]);
113 ad->targetAtoms[i].convert_to_entry = converts_to_entry[i];
115 for (j = 0; j < ATOM_INDEX_MAX; j++)
116 ad->targetAtoms[i].convert_to_target[j] = converts[i][j];
117 //ecore_x_selection_converter_atom_add(ad->targetAtoms[i].atom, target_converters[i]);
118 //ecore_x_selection_converter_atom_add(ad->targetAtoms[i].atom, generic_converter);
122 void depose_target_atoms(AppData *ad)
125 for (i = 0; i < ATOM_INDEX_MAX; i++)
127 for (j = 0; j < ad->targetAtoms[i].atom_cnt; j++)
129 if (ad->targetAtoms[i].name[j])
130 FREE(ad->targetAtoms[i].name[j]);
132 if (ad->targetAtoms[i].name)
133 FREE(ad->targetAtoms[i].name);
134 if (ad->targetAtoms[i].atom)
135 FREE(ad->targetAtoms[i].atom);
139 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)
145 int item_type_index = ATOM_INDEX_TEXT;
150 item_type_index = item->type_index;
154 if (!file || item->img_from_web)
156 if (item_type_index == ATOM_INDEX_HTML)
157 ad->targetAtoms[item_type_index].convert_to_target[ATOM_INDEX_IMAGE] = NULL;
158 else if (item_type_index == ATOM_INDEX_EFL)
159 ad->targetAtoms[item_type_index].convert_to_target[ATOM_INDEX_IMAGE] = NULL;
162 for (i = 0, count = 0; i < ATOM_INDEX_MAX; i++)
164 if (ad->targetAtoms[item_type_index].convert_to_target[i])
165 count += ad->targetAtoms[i].atom_cnt;
168 *data_ret = MALLOC(sizeof(Ecore_X_Atom) * count);
169 DBG("item_type: %d, target Atom cnt: %d", item_type_index, count);
173 for (i = 0, count = 0; i < ATOM_INDEX_MAX; i++)
175 if (ad->targetAtoms[item_type_index].convert_to_target[i])
177 for(j = 0; j < ad->targetAtoms[i].atom_cnt; j++)
179 ((Ecore_X_Atom *)*data_ret)[count++] = ad->targetAtoms[i].atom[j];
180 DBG("send target atom: %s", ad->targetAtoms[i].name[j]);
187 if (item_type_index == ATOM_INDEX_HTML)
188 ad->targetAtoms[item_type_index].convert_to_target[ATOM_INDEX_IMAGE] = html_to_image_path;
189 else if (item_type_index == ATOM_INDEX_EFL)
190 ad->targetAtoms[item_type_index].convert_to_target[ATOM_INDEX_IMAGE] = efl_to_image_path;
193 if (size_ret) *size_ret = count;
194 if (ttype) *ttype = ECORE_X_ATOM_ATOM;
195 if (tsize) *tsize = 32;
199 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)
203 if (ad->targetAtoms[ATOM_INDEX_TARGET].atom[0] == reqAtom)
204 return targets_converter(ad, reqAtom, item, data_ret, size_ret, ttype, tsize);
206 int req_index = atom_type_index_get(ad, reqAtom);
207 int item_type_index = ATOM_INDEX_TEXT;
208 void *item_data = "";
210 if (req_index < 0) return EINA_FALSE;
214 item_type_index = item->type_index;
215 item_data = item->data;
218 if (ad->targetAtoms[item_type_index].convert_to_target[req_index])
220 *data_ret = ad->targetAtoms[item_type_index].convert_to_target[req_index](ad, item_type_index, item_data);
223 if (size_ret) *size_ret = SAFE_STRLEN(*data_ret);
224 if (ttype) *ttype = ad->targetAtoms[item_type_index].atom[0];
225 if (tsize) *tsize = 8;
232 /* For convert EFL to HTML */
234 #define TAGPOS_START 0x00000001
235 #define TAGPOS_END 0x00000002
236 #define TAGPOS_ALONE 0x00000003
238 /* TEXTBLOCK tag using stack but close tag word has no mean maybe bug...
239 * TEXTBLOCK <b>bold<font>font</b>bold</font>
240 * HTML <b>bold<font>font bold</b>font</font> */
242 typedef struct _TagTable {
247 TagTable _EFLtoHTMLConvertTable[] = {
249 {"underline", "del"},
250 {"strikethrough", "ins"},
258 TagTable _HTMLtoEFLConvertTable[] = {
260 {"del", "underline"},
262 {"ins", "strikethrough"},
263 {"s", "strikethrough"},
271 typedef struct _TagNode TagNode, *PTagNode;
273 char *tag; //EINA_STRINGSHARE if NULL just str
276 const char *pos_in_ori_str;
279 unsigned char tagPosType;
282 typedef struct _FontTagData FontTagData, *PFontTagData;
283 struct _FontTagData {
291 typedef struct _ItemTagData ItemTagData, *PItemTagData;
292 struct _ItemTagData {
298 #define SAFEFREE(ptr) \
306 #define freeAndAssign(dst, value) \
316 static PTagNode _new_tag_node(char *tag, char *tag_str, char* str, const char *pos_in_ori_str);
317 static PTagNode _get_start_node(const char *str);
318 static PTagNode _get_next_node(PTagNode prev);
319 static void _delete_node(PTagNode node);
320 static void _link_match_tags(Eina_List *nodes);
321 static char *_get_tag_value(const char *tag_str, const char *tag_name);
322 static char *_convert_to_html(Eina_List* nodes);
323 static void _set_EFL_tag_data(Eina_List* nodes);
324 static char *_convert_to_edje(Eina_List* nodes);
325 static void _set_HTML_tag_data(Eina_List* nodes);
326 static void cleanup_tag_list(Eina_List *nodeList);
327 static PFontTagData _set_EFL_font_data(PFontTagData data, const char *tag_str);
328 static PItemTagData _set_EFL_item_data(PItemTagData data, const char *tag_str);
329 static PFontTagData _set_HTML_font_data(PFontTagData data, const char *tag_str);
330 static PItemTagData _set_HTML_img_data(PItemTagData data, const char *tag_str);
332 static void _dumpNode(Eina_List* nodes);
335 _new_tag_node(char *tag, char *tag_str, char* str, const char *pos_in_ori_str)
337 PTagNode newNode = CALLOC(1, sizeof(TagNode));
339 eina_str_tolower(&tag);
341 newNode->tag_str = tag_str;
343 newNode->pos_in_ori_str = pos_in_ori_str;
348 _get_start_node(const char *str)
350 char *startStr = NULL;
351 if (!str || str[0] == '\0')
356 char *tagStart = SAFE_STRCHR(str, '<');
358 startStr = SAFE_STRDUP(str);
361 int strLength = tagStart - str;
362 startStr = MALLOC(sizeof(char) * (strLength + 1));
363 SAFE_STRNCPY(startStr, str, strLength);
364 startStr[strLength] = '\0';
368 return _new_tag_node(NULL, NULL, startStr, str);
372 _get_next_node(PTagNode prev)
374 PTagNode retTag = NULL;
377 char *tagNameEnd = NULL;
380 if (prev->tag == NULL)
381 tagStart = SAFE_STRCHR(prev->pos_in_ori_str, '<');
383 tagStart = SAFE_STRCHR(prev->pos_in_ori_str + 1, '<');
388 tagEnd = SAFE_STRCHR(tagStart, '>');
389 nextTagStart = SAFE_STRCHR(tagStart + 1, '<');
391 if (!tagEnd || (nextTagStart && (nextTagStart < tagEnd)))
392 return _get_start_node(tagStart + 1);
395 char *spArray[spCnt];
396 spArray[0] = SAFE_STRCHR(tagStart, '=');
397 spArray[1] = SAFE_STRCHR(tagStart, '_');
398 spArray[2] = SAFE_STRCHR(tagStart, ' ');
399 spArray[3] = SAFE_STRCHR(tagStart, '\t');
400 spArray[4] = SAFE_STRCHR(tagStart, '\n');
404 for (i = 0; i < spCnt; i++)
406 if (spArray[i] && spArray[i] < tagNameEnd)
407 tagNameEnd = spArray[i];
410 int tagLength = tagNameEnd - tagStart - 1;
411 char *tagName = NULL;
412 if (!SAFE_STRNCMP(&tagStart[1], "/item", tagLength))
413 tagName = SAFE_STRDUP("");
415 tagName = SAFE_STRNDUP(&tagStart[1], tagLength);
417 int tagStrLength = 0;
421 tagStrLength = tagEnd - tagStart + 1;
422 tagStr = SAFE_STRNDUP(tagStart, tagStrLength);
425 unsigned int strLength = nextTagStart ? (unsigned int)(nextTagStart - tagEnd - 1) : SAFE_STRLEN(&tagEnd[1]);
426 char *str = SAFE_STRNDUP(&tagEnd[1], strLength);
428 retTag = _new_tag_node(tagName, tagStr, str, tagStart);
434 _delete_node(PTagNode node)
438 SAFEFREE(node->tag_str);
445 if (!SAFE_STRCMP("font", node->tag))
447 PFontTagData data = node->tagData;
448 SAFEFREE(data->name);
449 SAFEFREE(data->color);
450 SAFEFREE(data->size);
451 SAFEFREE(data->bg_color);
453 if (!SAFE_STRCMP("item", node->tag))
455 PItemTagData data = node->tagData;
456 SAFEFREE(data->href);
457 SAFEFREE(data->width);
458 SAFEFREE(data->height);
461 SAFEFREE(node->tagData);
469 _link_match_tags(Eina_List *nodes)
471 Eina_List *stack = NULL;
473 PTagNode trail, popData;
476 EINA_LIST_FOREACH(nodes, l, trail)
478 if (!trail || !trail->tag || trail->tag[0] == '\0') continue;
480 if (!SAFE_STRCMP("br", trail->tag) || !SAFE_STRCMP("br/", trail->tag))
482 trail->tagPosType = TAGPOS_ALONE;
485 else if (!SAFE_STRCMP("item", trail->tag) || !SAFE_STRCMP("img", trail->tag))
487 trail->tagPosType = TAGPOS_ALONE;
491 if (trail->tag[0] != '/') // PUSH
493 stack = eina_list_append(stack, trail);
494 /* eina_array_push(stack, trail);
495 DBG("stack: %d, tag %s", eina_array_count_get(stack), trail->tag);*/
496 DBG("stack: %d, tag %s", eina_list_count(stack), trail->tag);
500 if (!eina_list_count(stack))
502 WRN("tag not matched %s", trail->tag);
506 EINA_LIST_REVERSE_FOREACH(stack, r, popData)
508 if (!popData || !popData->tag || popData->tag[0] == '\0') continue;
510 if (!SAFE_STRCMP(popData->tag, &trail->tag[1]))
512 popData->tagPosType = TAGPOS_START;
513 trail->tagPosType = TAGPOS_END;
514 popData->matchTag = trail;
515 trail->matchTag = popData;
516 stack = eina_list_remove_list(stack, r);
520 /* popData = eina_array_pop(stack);
522 popData->tagPosType = TAGPOS_START;
523 trail->tagPosType = TAGPOS_END;
524 popData->matchTag = trail;
525 trail->matchTag = popData;
526 DBG("pop stack: %d, tag %s", eina_array_count_get(stack), trail->tag);
531 /* if (eina_array_count_get(stack))
532 DBG("stack state: %d, tag %s", eina_array_count_get(stack), trail->tag);*/
534 /* Make Dummy close tag */
535 /* while ((popData = eina_array_pop(stack))) */
537 EINA_LIST_REVERSE_FOREACH(stack, r, popData)
539 if (!popData) continue;
542 int tagLength = SAFE_STRLEN(popData->tag);
543 char *tagName = MALLOC(sizeof(char) * (tagLength + 2));
548 SAFE_STRCAT(tagName, popData->tag);
550 newData = _new_tag_node(tagName, NULL, NULL, NULL);
551 popData->tagPosType = TAGPOS_START;
552 newData->tagPosType = TAGPOS_END;
553 popData->matchTag = newData;
554 newData->matchTag = popData;
555 nodes = eina_list_append(nodes, newData);
556 /* DBG("stack: %d, tag %s", eina_array_count_get(stack), popData->tag);*/
558 /* DBG("stack_top: %d", eina_array_count_get(stack));
559 eina_array_free(stack);*/
560 eina_list_free(stack);
564 _get_tag_value(const char *tag_str, const char *tag_name)
566 if (!tag_name || !tag_str)
570 if ((tag = SAFE_STRSTR(tag_str, tag_name)))
572 if (tag[SAFE_STRLEN(tag_name)] == '_')
574 char *value = SAFE_STRCHR(tag, '=');
580 } while (!isalnum(*value) && *value != '#');
583 char *spArray[spCnt];
584 spArray[0] = SAFE_STRCHR(value, ' ');
585 spArray[1] = SAFE_STRCHR(value, '>');
586 spArray[2] = SAFE_STRCHR(value, '\"');
587 spArray[3] = SAFE_STRCHR(value, '\'');
588 spArray[4] = SAFE_STRCHR(value, '\t');
589 spArray[5] = SAFE_STRCHR(value, '\n');
590 char *valueEnd = SAFE_STRCHR(value, '\0');
594 if ((!SAFE_STRNCMP(tag_str, "<item", 5) && !SAFE_STRCMP(tag_name, "href")) // EFL img tag
595 || (!SAFE_STRNCMP(tag_str, "<img", 4) && !SAFE_STRCMP(tag_name, "src"))) // HTML img tag
598 for (i = start; i < spCnt; i++)
600 if (spArray[i] && spArray[i] < valueEnd)
601 valueEnd = spArray[i];
604 int valueLength = valueEnd - value;
605 return SAFE_STRNDUP(value, valueLength);
612 _set_EFL_font_data(PFontTagData data, const char *tag_str)
617 data = CALLOC(1, sizeof(FontTagData));
618 value = _get_tag_value(tag_str, "font_size");
619 freeAndAssign(data->size, value);
620 value = _get_tag_value(tag_str, "color");
621 freeAndAssign(data->color, value);
622 value = _get_tag_value(tag_str, "bgcolor");
623 freeAndAssign(data->bg_color, value);
624 value = _get_tag_value(tag_str, "font");
625 freeAndAssign(data->name, value);
631 _set_EFL_item_data(PItemTagData data, const char *tag_str)
636 data = CALLOC(1, sizeof(ItemTagData));
637 value = _get_tag_value(tag_str, "href");
640 char *path = SAFE_STRSTR(value, "file://");
643 char *modify = MALLOC(sizeof(char) * (SAFE_STRLEN(value) + 1));
644 SAFE_STRNCPY(modify, "file://", 8);
646 while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
650 SAFE_STRCAT(modify, path);
652 DBG("image href ---%s---", data->href);
656 freeAndAssign(data->href, value);
659 value = _get_tag_value(tag_str, "absize");
662 char *xpos = SAFE_STRCHR(value, 'x');
665 int absizeLen = SAFE_STRLEN(value);
666 char *modify = SAFE_STRNDUP(value, xpos - value);
670 data->width = modify;
672 modify = SAFE_STRNDUP(xpos + 1, absizeLen - (xpos - value) - 1);
676 data->height = modify;
678 DBG("image width: -%s-, height: -%s-", data->width, data->height);
686 _set_EFL_tag_data(Eina_List* nodes)
691 EINA_LIST_FOREACH(nodes, l, trail)
693 if (!trail || !trail->tag || trail->tag[0] == '\0') continue;
695 if (!SAFE_STRCMP("font", trail->tag) || !SAFE_STRCMP("color", trail->tag))
696 trail->tagData = _set_EFL_font_data(trail->tagData, trail->tag_str);
697 else if (!SAFE_STRCMP("item", trail->tag))
698 trail->tagData = _set_EFL_item_data(trail->tagData, trail->tag_str);
703 _set_HTML_font_data(PFontTagData data, const char *tag_str)
708 data = CALLOC(1, sizeof(FontTagData));
709 value = _get_tag_value(tag_str, "size");
710 freeAndAssign(data->size, value);
711 value = _get_tag_value(tag_str, "color");
712 freeAndAssign(data->color, value);
713 value = _get_tag_value(tag_str, "bgcolor");
714 freeAndAssign(data->bg_color, value);
715 value = _get_tag_value(tag_str, "face");
716 freeAndAssign(data->name, value);
722 _set_HTML_img_data(PItemTagData data, const char *tag_str)
727 data = CALLOC(1, sizeof(ItemTagData));
728 value = _get_tag_value(tag_str, "src");
731 char *path = SAFE_STRSTR(value, "file://");
734 char *modify = MALLOC(sizeof(char) * (SAFE_STRLEN(value) + 1));
735 SAFE_STRNCPY(modify, "file://", 8);
737 while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
741 SAFE_STRCAT(modify, path);
743 DBG("image src ---%s---", data->href);
747 freeAndAssign(data->href, value);
750 value = _get_tag_value(tag_str, "width");
751 freeAndAssign(data->width, value);
752 value = _get_tag_value(tag_str, "height");
753 freeAndAssign(data->height, value);
758 _set_HTML_tag_data(Eina_List* nodes)
763 EINA_LIST_FOREACH(nodes, l, trail)
765 if (!trail || !trail->tag || trail->tag[0] == '\0') continue;
767 if (!SAFE_STRCMP("font", trail->tag) || !SAFE_STRCMP("color", trail->tag))
768 trail->tagData = _set_HTML_font_data(trail->tagData, trail->tag_str);
769 else if (!SAFE_STRCMP("img", trail->tag))
770 trail->tagData = _set_HTML_img_data(trail->tagData, trail->tag_str);
775 _dumpNode(Eina_List* nodes)
780 EINA_LIST_FOREACH(nodes, l, trail)
782 if (!trail) continue;
784 DBG("tag: %s, tag_str: %s, str: %s, tagPosType: %d",
785 trail->tag, trail->tag_str, trail->str, trail->tagPosType);
786 DBG("matchTag: %x", (unsigned int)trail->matchTag);
788 DBG("matchTag->tag_str: %s", trail->matchTag->tag_str);
791 if (!SAFE_STRCMP(trail->tag, "font"))
793 PFontTagData data = trail->tagData;
794 DBG(" tagData->name: %s, tagData->color: %s, tagData->size: %s, tagData->bg_color: %s",
795 data->name, data->color, data->size, data->bg_color);
797 else if (!SAFE_STRCMP(trail->tag, "item") || !SAFE_STRCMP(trail->tag, "img"))
799 PItemTagData data = trail->tagData;
800 DBG(" tagData->href: %s, tagData->width: %s, tagData->height: %s",
801 data->href, data->width, data->height);
804 WRN("ERROR!!!! not need tagData");
810 _convert_to_html(Eina_List* nodes)
815 Eina_Strbuf *html = eina_strbuf_new();
817 int tableCnt = sizeof(_EFLtoHTMLConvertTable) / sizeof(TagTable);
819 EINA_LIST_FOREACH(nodes, l, trail)
821 if (!trail) continue;
825 char *tagName = trail->tagPosType == TAGPOS_END ?
826 trail->matchTag->tag : trail->tag;
828 for(j = 0; j < tableCnt; j++)
830 if (!SAFE_STRCMP(_EFLtoHTMLConvertTable[j].src, tagName))
832 switch(trail->tagPosType)
835 eina_strbuf_append(html, "</");
838 eina_strbuf_append(html, "<");
842 eina_strbuf_append(html, _EFLtoHTMLConvertTable[j].dst);
843 if (trail->tagPosType != TAGPOS_END)
845 if (!SAFE_STRCMP(_EFLtoHTMLConvertTable[j].src, "font"))
847 PFontTagData data = trail->tagData;
853 char *color = SAFE_STRDUP(data->color);
854 if (color && color[0] == '#' && SAFE_STRLEN(color) == 9)
857 eina_strbuf_append_printf(html, " color=\"%s\"", color);
860 eina_strbuf_append_printf(html, " color=\"%s\"", data->color);
865 eina_strbuf_append_printf(html, " size=\"%s\"", data->size);
870 else if (!SAFE_STRCMP(_EFLtoHTMLConvertTable[j].src, "item"))
872 PItemTagData data = trail->tagData;
874 eina_strbuf_append_printf(html, " src=\"%s\"", data->href);
876 eina_strbuf_append_printf(html, " width=\"%s\"", data->width);
878 eina_strbuf_append_printf(html, " height=\"%s\"", data->height);
881 switch(trail->tagPosType)
883 /* closed tag does not need in HTML
885 eina_strbuf_append(html, " />");
888 eina_strbuf_append(html, ">");
896 eina_strbuf_append(html, trail->str);
899 eina_strbuf_replace_all(html, " ", " ");
900 char *ret = eina_strbuf_string_steal(html);
901 eina_strbuf_free(html);
905 #define IMAGE_DEFAULT_WIDTH "240"
906 #define IMAGE_DEFAULT_HEIGHT "180"
910 _convert_to_edje(Eina_List* nodes)
915 Eina_Strbuf *edje = eina_strbuf_new();
917 int tableCnt = sizeof(_HTMLtoEFLConvertTable) / sizeof(TagTable);
919 EINA_LIST_FOREACH(nodes, l, trail)
921 if (!trail) continue;
925 char *tagName = trail->tagPosType == TAGPOS_END ?
926 trail->matchTag->tag : trail->tag;
928 for(j = 0; j < tableCnt; j++)
930 if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, tagName))
932 if (_HTMLtoEFLConvertTable[j].dst[0] != '\0')
934 switch(trail->tagPosType)
937 eina_strbuf_append(edje, "</");
940 eina_strbuf_append(edje, "<");
944 eina_strbuf_append(edje, _HTMLtoEFLConvertTable[j].dst);
946 if (trail->tagPosType != TAGPOS_END)
948 if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, "font"))
950 PFontTagData data = trail->tagData;
956 if (data->color[0] == '#' && SAFE_STRLEN(data->color) == 7)
957 eina_strbuf_append_printf(edje, "<color=%sff>", data->color);
959 eina_strbuf_append_printf(edje, "<color=%s>", data->color);
963 eina_strbuf_append_printf(edje, "<font_size=%s>", data->size);
969 else if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, "img"))
971 PItemTagData data = trail->tagData;
972 char *width = IMAGE_DEFAULT_WIDTH, *height = IMAGE_DEFAULT_HEIGHT;
976 height = data->height;
977 eina_strbuf_append_printf(edje, " absize=%sx%s", width, height);
979 eina_strbuf_append_printf(edje, " href=%s></item>", data->href);
985 if (_HTMLtoEFLConvertTable[j].dst[0] == '\0')
987 if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, "font"))
989 if (trail->matchTag->tagData)
991 PFontTagData data = trail->matchTag->tagData;
996 eina_strbuf_append_printf(edje, "</color>");
998 eina_strbuf_append_printf(edje, "</font>");
1007 switch(trail->tagPosType)
1009 /* not support in efl
1011 eina_strbuf_append(edje, " />");
1015 eina_strbuf_append(edje, ">");
1020 }/* for(j = 0; j < tableCnt; j++) end */
1023 eina_strbuf_append(edje, trail->str);
1026 eina_strbuf_replace_all(edje, " ", " ");
1027 char *ret = eina_strbuf_string_steal(edje);
1028 eina_strbuf_free(edje);
1032 char *string_for_entry_get(AppData *ad, int type_index, const char *str)
1034 DBG("type_index: %d str: %s ", type_index, str);
1035 if (ad->targetAtoms[type_index].convert_to_entry)
1036 return ad->targetAtoms[type_index].convert_to_entry(ad, type_index, str);
1040 char *string_for_image_path_get(AppData *ad, int type_index, const char *str)
1042 DBG("type_index: %d str: %s ", type_index, str);
1043 char *image_path = NULL;
1045 if (type_index == ATOM_INDEX_HTML)
1046 image_path = html_to_image_path(ad, type_index, str);
1047 else if (type_index == ATOM_INDEX_EFL)
1048 image_path = efl_to_image_path(ad, type_index, str);
1053 static char *make_close_tag(Eina_List* nodes)
1059 Eina_Strbuf *tag_str = eina_strbuf_new();
1061 EINA_LIST_FOREACH(nodes, l, trail)
1066 eina_strbuf_append(tag_str, trail->tag_str);
1069 eina_strbuf_append(tag_str, "<");
1070 eina_strbuf_append(tag_str, trail->tag);
1071 eina_strbuf_append(tag_str, ">");
1075 eina_strbuf_append(tag_str, trail->str);
1078 char *ret = eina_strbuf_string_steal(tag_str);
1079 eina_strbuf_free(tag_str);
1083 static char *do_not_convert(AppData *ad, int type_index, const char *str)
1085 DBG("str: %s", str);
1086 if (type_index != ATOM_INDEX_HTML)
1088 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1089 return emoticon_text;
1091 return SAFE_STRDUP(str);
1094 static char *efl_to_efl(AppData *ad, int type_index, const char *str)
1100 static char *html_to_html(AppData *ad, int type_index, const char *str)
1107 #define IMAGE_DEFAULT_WIDTH "240"
1108 #define IMAGE_DEFAULT_HEIGHT "180"
1109 static char *make_image_path_tag(int type_index, const char *str)
1111 char *img_tag_str = "file://%s";
1112 char *efl_img_tag = "<item absize="IMAGE_DEFAULT_WIDTH"x"IMAGE_DEFAULT_HEIGHT" href=file://%s>";
1113 char *html_img_tag = "<img src=\"file://%s\">";
1117 case ATOM_INDEX_HTML:
1118 img_tag_str = html_img_tag;
1120 case ATOM_INDEX_EFL:
1121 img_tag_str = efl_img_tag;
1123 case ATOM_INDEX_TEXT:
1124 case ATOM_INDEX_IMAGE:
1127 ERR("wrong type_index: %d", type_index);
1131 size_t len = snprintf(NULL, 0, img_tag_str, str) + 1;
1132 char *ret = MALLOC(sizeof(char) * len);
1134 snprintf(ret, len, img_tag_str, str);
1139 static char *image_path_to_text(AppData *ad, int type_index, const char *str)
1141 DBG("str: %s", str);
1142 return make_image_path_tag(ATOM_INDEX_TEXT, str);
1146 static char *image_path_to_html(AppData *ad, int type_index, const char *str)
1148 DBG("str: %s", str);
1149 return make_image_path_tag(ATOM_INDEX_HTML, str);
1152 static char *image_path_to_efl(AppData *ad, int type_index, const char *str)
1154 DBG("str: %s", str);
1155 return make_image_path_tag(ATOM_INDEX_EFL, str);
1158 static char *image_path_to_image_path(AppData *ad, int type_index, const char *str)
1160 DBG("str: %s", str);
1161 return make_image_path_tag(ATOM_INDEX_IMAGE, str);
1164 static char *html_to_image_path(AppData *ad, int type_index, const char *str)
1166 DBG("str: %s", str);
1167 Eina_Strbuf *sbuf = eina_strbuf_new();
1168 Eina_Bool image_path_exists = EINA_FALSE;
1169 int len = SAFE_STRLEN(str);
1170 char *p = (char *)str;
1172 char *image_path = NULL;
1174 if (type_index == ATOM_INDEX_HTML)
1176 for (s = p; (p - s) <= len; p++)
1180 if (!SAFE_STRNCMP((p + 1), "img", 3))
1182 for (p += 4; *p != '"'; p++);
1183 if (!SAFE_STRNCMP((p + 1), "http:/", 6) || !SAFE_STRNCMP((p + 1), "file:/", 6))
1185 if (!SAFE_STRNCMP((p + 1), "http:/", 6))
1186 ad->clipdrawer->http_path = EINA_TRUE;
1188 ad->clipdrawer->http_path = EINA_FALSE;
1192 for (; *p != '"'; p++);
1193 eina_strbuf_append_length(sbuf, s, p - s);
1194 image_path_exists = EINA_TRUE;
1197 else if ((*(p + 1) == '/'))
1201 for (; *p != '"'; p++);
1202 eina_strbuf_append_length(sbuf, s, p - s);
1203 image_path_exists = EINA_TRUE;
1204 ad->clipdrawer->http_path = EINA_FALSE;
1212 if (image_path_exists)
1214 //Replace the space Unicode character(%20).
1215 eina_strbuf_replace_all(sbuf, "%20", " ");
1216 image_path = eina_strbuf_string_steal(sbuf);
1217 eina_strbuf_free(sbuf);
1221 eina_strbuf_free(sbuf);
1225 static char *efl_to_image_path(AppData *ad, int type_index, const char *str)
1227 DBG("str: %s", str);
1228 Eina_Strbuf *sbuf = eina_strbuf_new();
1229 Eina_Bool image_path_exists = EINA_FALSE;
1230 int len = SAFE_STRLEN(str);
1231 char *p = entry_convert_emoticon_to_normal_text((char *)str);
1233 char *image_path = NULL;
1235 if (!p) return NULL;
1237 if (type_index == ATOM_INDEX_EFL)
1239 for (s = p; (p - s) <= len; p++)
1243 if (!SAFE_STRNCMP((p + 1), "item", 3))
1245 for (p += 5; *p != 'h'; p++);
1246 if (!SAFE_STRNCMP(p, "href=file:/", 11))
1250 for (; *p != '>'; p++);
1251 eina_strbuf_append_length(sbuf, s, p - s);
1252 image_path_exists = EINA_TRUE;
1255 else if (!SAFE_STRNCMP(p, "href=", 5))
1259 for (; *p != '>'; p++);
1260 eina_strbuf_append_length(sbuf, s, p - s);
1261 image_path_exists = EINA_TRUE;
1269 if (image_path_exists)
1271 image_path = eina_strbuf_string_steal(sbuf);
1272 eina_strbuf_free(sbuf);
1277 eina_strbuf_free(sbuf);
1283 static char *markup_to_entry(AppData *ad, int type_index, const char *str)
1289 Eina_Strbuf *strbuf = eina_strbuf_new();
1291 return SAFE_STRDUP(str);
1292 eina_strbuf_prepend(strbuf, "<font_size=28><color=#000000FF>");
1294 const char *trail = str;
1296 while (trail && *trail)
1298 const char *pretrail = trail;
1299 unsigned long length;
1303 trail = SAFE_STRCHR(trail, '<');
1306 eina_strbuf_append(strbuf, pretrail);
1309 endtag = SAFE_STRCHR(trail, '>');
1313 length = trail - pretrail;
1315 temp = SAFE_STRNDUP(pretrail, length);
1322 eina_strbuf_append(strbuf, temp);
1326 if (trail[0] == '/')
1332 if (!SAFE_STRNCMP(trail, "br", 2))
1334 eina_strbuf_append(strbuf, "<br>");
1341 if (type_index == ATOM_INDEX_HTML)
1342 eina_strbuf_replace_all(strbuf, " ", " ");
1344 char *entry_str = eina_strbuf_string_steal(strbuf);
1345 eina_strbuf_free(strbuf);
1349 static char *polaris_to_entry(AppData *ad, int type_index, const char *str)
1351 DBG("str: %s", str);
1352 return markup_to_entry(ad, type_index, str);
1355 static char *html_to_entry(AppData *ad, int type_index, const char *str)
1357 DBG("str: %s", str);
1358 return markup_to_entry(ad, type_index, str);
1361 static int entry_emoticon_origin_string(char **src_text, int* item_length)
1364 char *start_item = NULL;
1365 char *end_item = NULL;
1366 char *emoticon = NULL;
1368 int start_item_pos = 0;
1369 int end_item_pos = 0;
1370 int emoticon_pos = 0;
1372 char href_buf[50] = {0, };
1374 start_item = strstr(*src_text, "<item");
1377 start_item_pos = strlen(*src_text) - strlen(start_item);
1379 end_item = strchr(*src_text, '>');
1382 end_item_pos = strlen(*src_text) - strlen(end_item);
1384 if (start_item_pos >= end_item_pos)
1385 return ENTRY_EMOTICON_NONE;
1387 for (i = 1; i < ENTRY_EMOTICON_MAX; i++) {
1388 bzero(href_buf, sizeof(href_buf));
1389 snprintf(href_buf, sizeof(href_buf), "href=%s", emotion_name_table[i].emoticon_name);
1390 emoticon = strstr(*src_text, href_buf);
1392 emoticon_pos = strlen(*src_text) - strlen(emoticon);
1394 if (emoticon_pos > start_item_pos && emoticon_pos < end_item_pos) {
1395 *src_text += start_item_pos;
1396 *item_length = end_item_pos - start_item_pos + 1;
1402 return ENTRY_EMOTICON_NONE;
1405 char *entry_convert_emoticon_to_normal_text(const char *src_text)
1407 char *remain_text = (char *)src_text;
1408 char *dst_str = NULL;
1410 Eina_Strbuf *msg_data = eina_strbuf_new();
1412 if (!msg_data) return NULL;
1414 while (*remain_text) {
1415 char *text_start = remain_text;
1416 int emoticon = ENTRY_EMOTICON_NONE;
1417 int emoticon_txt_length = 0;
1419 emoticon = entry_emoticon_origin_string(&remain_text, &emoticon_txt_length);
1421 if (emoticon != ENTRY_EMOTICON_NONE) {
1422 eina_strbuf_append_length(msg_data, text_start, remain_text - text_start);
1423 eina_strbuf_append_printf(msg_data, "%s", emotion_name_table[emoticon].text);
1425 remain_text = remain_text + emoticon_txt_length;
1427 if (strncmp(remain_text, "</item>", strlen("</item>")) == 0) {
1428 remain_text = remain_text + strlen("</item>");
1431 if (*remain_text == '\0')
1434 eina_strbuf_append(msg_data, text_start);
1439 dst_str = strdup(eina_strbuf_string_get(msg_data));
1440 eina_strbuf_free(msg_data);
1445 static char *efl_to_entry(AppData *ad, int type_index, const char *str)
1447 DBG("str: %s", str);
1449 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1450 char *normal_text = markup_to_entry(ad, type_index, emoticon_text);
1451 FREE(emoticon_text);
1455 static char *image_path_to_entry(AppData *ad, int type_index, const char *str)
1461 static char *text_to_entry(AppData *ad, int type_index, const char *str)
1463 DBG("str: %s", str);
1464 char *markup = NULL;
1465 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1466 markup = (char*)evas_textblock_text_utf8_to_markup(NULL, emoticon_text);
1467 char *for_entry = markup_to_entry(ad, type_index, markup);
1469 FREE(emoticon_text);
1473 static Eina_List *make_tag_list(int type_index, const char *str)
1475 Eina_List *nodeList = NULL;
1478 nodeData = _get_start_node(str);
1482 nodeList = eina_list_append(nodeList, nodeData);
1483 nodeData = _get_next_node(nodeData);
1486 _link_match_tags(nodeList);
1490 case ATOM_INDEX_EFL:
1491 _set_EFL_tag_data(nodeList);
1493 case ATOM_INDEX_HTML:
1494 _set_HTML_tag_data(nodeList);
1497 WRN("wrong index: %d", type_index);
1500 _dumpNode(nodeList);
1504 static void cleanup_tag_list(Eina_List *nodeList)
1509 EINA_LIST_FOREACH(nodeList, trail, nodeData)
1510 _delete_node(nodeData);
1511 eina_list_free(nodeList);
1514 static char *html_to_efl(AppData *ad, int type_index, const char *str)
1517 Eina_List *nodeList = NULL;
1518 nodeList = make_tag_list(type_index, str);
1519 char *ret = _convert_to_edje(nodeList);
1520 DBG("efl: %s", ret);
1521 cleanup_tag_list(nodeList);
1526 static char *efl_to_html(AppData *ad, int type_index, const char *str)
1529 Eina_List *nodeList = NULL;
1530 nodeList = make_tag_list(type_index, str);
1531 char *ret = _convert_to_html(nodeList);
1532 DBG("html: %s", ret);
1533 cleanup_tag_list(nodeList);
1538 static char *text_to_html(AppData *ad, int type_index, const char *str)
1540 DBG("str: %s", str);
1541 char *markup = NULL;
1542 markup = (char*)evas_textblock_text_utf8_to_markup(NULL, str);
1543 char *html = efl_to_html(ad, ATOM_INDEX_EFL, markup);
1548 static char *text_to_efl(AppData *ad, int type_index, const char *str)
1550 DBG("str: %s", str);
1552 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1553 ret = (char*)evas_textblock_text_utf8_to_markup(NULL, emoticon_text);
1554 FREE(emoticon_text);
1558 static char *to_text(AppData *ad, int type_index, const char *str)
1560 DBG("str: %s", str);
1561 char *entry_text = NULL;
1563 if (type_index == ATOM_INDEX_HTML)
1565 Eina_Strbuf *buf = eina_strbuf_new();
1569 eina_strbuf_append(buf, str);
1570 eina_strbuf_replace_all(buf, " ", " ");
1571 html = eina_strbuf_string_steal(buf);
1572 eina_strbuf_free(buf);
1573 entry_text = (char*)evas_textblock_text_markup_to_utf8(NULL, html);
1579 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1582 entry_text = markup_to_entry(ad, type_index, emoticon_text);
1583 entry_text = evas_textblock_text_markup_to_utf8(NULL, entry_text);
1584 if (entry_text) strcat(entry_text, "\0");
1585 FREE(emoticon_text);