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 || item->img_from_markup)
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 freeAndAssign(data->width, SAFE_STRNDUP(value, xpos - value));
667 freeAndAssign(data->height, SAFE_STRNDUP(xpos + 1, absizeLen - (xpos - value) - 1));
668 DBG("image width: -%s-, height: -%s-", data->width, data->height);
676 _set_EFL_tag_data(Eina_List* nodes)
681 EINA_LIST_FOREACH(nodes, l, trail)
683 if (!trail || !trail->tag || trail->tag[0] == '\0') continue;
685 if (!SAFE_STRCMP("font", trail->tag) || !SAFE_STRCMP("color", trail->tag))
686 trail->tagData = _set_EFL_font_data(trail->tagData, trail->tag_str);
687 else if (!SAFE_STRCMP("item", trail->tag))
688 trail->tagData = _set_EFL_item_data(trail->tagData, trail->tag_str);
693 _set_HTML_font_data(PFontTagData data, const char *tag_str)
698 data = CALLOC(1, sizeof(FontTagData));
699 value = _get_tag_value(tag_str, "size");
700 freeAndAssign(data->size, value);
701 value = _get_tag_value(tag_str, "color");
702 freeAndAssign(data->color, value);
703 value = _get_tag_value(tag_str, "bgcolor");
704 freeAndAssign(data->bg_color, value);
705 value = _get_tag_value(tag_str, "face");
706 freeAndAssign(data->name, value);
712 _set_HTML_img_data(PItemTagData data, const char *tag_str)
717 data = CALLOC(1, sizeof(ItemTagData));
718 value = _get_tag_value(tag_str, "src");
721 char *path = SAFE_STRSTR(value, "file://");
724 char *modify = MALLOC(sizeof(char) * (SAFE_STRLEN(value) + 1));
725 SAFE_STRNCPY(modify, "file://", 8);
727 while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
731 SAFE_STRCAT(modify, path);
733 DBG("image src ---%s---", data->href);
737 freeAndAssign(data->href, value);
740 value = _get_tag_value(tag_str, "width");
741 freeAndAssign(data->width, value);
742 value = _get_tag_value(tag_str, "height");
743 freeAndAssign(data->height, value);
748 _set_HTML_tag_data(Eina_List* nodes)
753 EINA_LIST_FOREACH(nodes, l, trail)
755 if (!trail || !trail->tag || trail->tag[0] == '\0') continue;
757 if (!SAFE_STRCMP("font", trail->tag) || !SAFE_STRCMP("color", trail->tag))
758 trail->tagData = _set_HTML_font_data(trail->tagData, trail->tag_str);
759 else if (!SAFE_STRCMP("img", trail->tag))
760 trail->tagData = _set_HTML_img_data(trail->tagData, trail->tag_str);
765 _dumpNode(Eina_List* nodes)
770 EINA_LIST_FOREACH(nodes, l, trail)
772 if (!trail) continue;
774 DBG("tag: %s, tag_str: %s, str: %s, tagPosType: %d",
775 trail->tag, trail->tag_str, trail->str, trail->tagPosType);
776 DBG("matchTag: %x", (unsigned int)trail->matchTag);
778 DBG("matchTag->tag_str: %s", trail->matchTag->tag_str);
781 if (!SAFE_STRCMP(trail->tag, "font"))
783 PFontTagData data = trail->tagData;
784 DBG(" tagData->name: %s, tagData->color: %s, tagData->size: %s, tagData->bg_color: %s",
785 data->name, data->color, data->size, data->bg_color);
787 else if (!SAFE_STRCMP(trail->tag, "item") || !SAFE_STRCMP(trail->tag, "img"))
789 PItemTagData data = trail->tagData;
790 DBG(" tagData->href: %s, tagData->width: %s, tagData->height: %s",
791 data->href, data->width, data->height);
794 WRN("ERROR!!!! not need tagData");
800 _convert_to_html(Eina_List* nodes)
805 Eina_Strbuf *html = eina_strbuf_new();
807 int tableCnt = sizeof(_EFLtoHTMLConvertTable) / sizeof(TagTable);
809 EINA_LIST_FOREACH(nodes, l, trail)
811 if (!trail) continue;
815 char *tagName = trail->tagPosType == TAGPOS_END ?
816 trail->matchTag->tag : trail->tag;
818 for(j = 0; j < tableCnt; j++)
820 if (!SAFE_STRCMP(_EFLtoHTMLConvertTable[j].src, tagName))
822 switch(trail->tagPosType)
825 eina_strbuf_append(html, "</");
828 eina_strbuf_append(html, "<");
832 eina_strbuf_append(html, _EFLtoHTMLConvertTable[j].dst);
833 if (trail->tagPosType != TAGPOS_END)
835 if (!SAFE_STRCMP(_EFLtoHTMLConvertTable[j].src, "font"))
837 PFontTagData data = trail->tagData;
843 char *color = SAFE_STRDUP(data->color);
844 if (color && color[0] == '#' && SAFE_STRLEN(color) == 9)
847 eina_strbuf_append_printf(html, " color=\"%s\"", color);
850 eina_strbuf_append_printf(html, " color=\"%s\"", data->color);
855 eina_strbuf_append_printf(html, " size=\"%s\"", data->size);
860 else if (!SAFE_STRCMP(_EFLtoHTMLConvertTable[j].src, "item"))
862 PItemTagData data = trail->tagData;
864 eina_strbuf_append_printf(html, " src=\"%s\"", data->href);
866 eina_strbuf_append_printf(html, " width=\"%s\"", data->width);
868 eina_strbuf_append_printf(html, " height=\"%s\"", data->height);
871 switch(trail->tagPosType)
873 /* closed tag does not need in HTML
875 eina_strbuf_append(html, " />");
878 eina_strbuf_append(html, ">");
886 eina_strbuf_append(html, trail->str);
889 eina_strbuf_replace_all(html, " ", " ");
890 char *ret = eina_strbuf_string_steal(html);
891 eina_strbuf_free(html);
895 #define IMAGE_DEFAULT_WIDTH "240"
896 #define IMAGE_DEFAULT_HEIGHT "180"
900 _convert_to_edje(Eina_List* nodes)
905 Eina_Strbuf *edje = eina_strbuf_new();
907 int tableCnt = sizeof(_HTMLtoEFLConvertTable) / sizeof(TagTable);
909 EINA_LIST_FOREACH(nodes, l, trail)
911 if (!trail) continue;
915 char *tagName = trail->tagPosType == TAGPOS_END ?
916 trail->matchTag->tag : trail->tag;
918 for(j = 0; j < tableCnt; j++)
920 if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, tagName))
922 if (_HTMLtoEFLConvertTable[j].dst[0] != '\0')
924 switch(trail->tagPosType)
927 eina_strbuf_append(edje, "</");
930 eina_strbuf_append(edje, "<");
934 eina_strbuf_append(edje, _HTMLtoEFLConvertTable[j].dst);
936 if (trail->tagPosType != TAGPOS_END)
938 if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, "font"))
940 PFontTagData data = trail->tagData;
946 if (data->color[0] == '#' && SAFE_STRLEN(data->color) == 7)
947 eina_strbuf_append_printf(edje, "<color=%sff>", data->color);
949 eina_strbuf_append_printf(edje, "<color=%s>", data->color);
953 eina_strbuf_append_printf(edje, "<font_size=%s>", data->size);
959 else if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, "img"))
961 PItemTagData data = trail->tagData;
962 char *width = IMAGE_DEFAULT_WIDTH, *height = IMAGE_DEFAULT_HEIGHT;
966 height = data->height;
967 eina_strbuf_append_printf(edje, " absize=%sx%s", width, height);
969 eina_strbuf_append_printf(edje, " href=%s></item>", data->href);
975 if (_HTMLtoEFLConvertTable[j].dst[0] == '\0')
977 if (!SAFE_STRCMP(_HTMLtoEFLConvertTable[j].src, "font"))
979 if (trail->matchTag->tagData)
981 PFontTagData data = trail->matchTag->tagData;
986 eina_strbuf_append_printf(edje, "</color>");
988 eina_strbuf_append_printf(edje, "</font>");
997 switch(trail->tagPosType)
999 /* not support in efl
1001 eina_strbuf_append(edje, " />");
1005 eina_strbuf_append(edje, ">");
1010 }/* for(j = 0; j < tableCnt; j++) end */
1013 eina_strbuf_append(edje, trail->str);
1016 eina_strbuf_replace_all(edje, " ", " ");
1017 char *ret = eina_strbuf_string_steal(edje);
1018 eina_strbuf_free(edje);
1022 char *string_for_entry_get(AppData *ad, int type_index, const char *str)
1024 DBG("type_index: %d str: %s ", type_index, str);
1025 if (ad->targetAtoms[type_index].convert_to_entry)
1026 return ad->targetAtoms[type_index].convert_to_entry(ad, type_index, str);
1030 char *string_for_image_path_get(AppData *ad, int type_index, const char *str)
1032 DBG("type_index: %d str: %s ", type_index, str);
1033 char *image_path = NULL;
1035 if (type_index == ATOM_INDEX_HTML)
1036 image_path = html_to_image_path(ad, type_index, str);
1037 else if (type_index == ATOM_INDEX_EFL)
1038 image_path = efl_to_image_path(ad, type_index, str);
1043 static char *make_close_tag(Eina_List* nodes)
1049 Eina_Strbuf *tag_str = eina_strbuf_new();
1051 EINA_LIST_FOREACH(nodes, l, trail)
1056 eina_strbuf_append(tag_str, trail->tag_str);
1059 eina_strbuf_append(tag_str, "<");
1060 eina_strbuf_append(tag_str, trail->tag);
1061 eina_strbuf_append(tag_str, ">");
1065 eina_strbuf_append(tag_str, trail->str);
1068 char *ret = eina_strbuf_string_steal(tag_str);
1069 eina_strbuf_free(tag_str);
1073 static char *do_not_convert(AppData *ad, int type_index, const char *str)
1075 DBG("str: %s", str);
1076 if (type_index != ATOM_INDEX_HTML)
1078 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1079 return emoticon_text;
1081 return SAFE_STRDUP(str);
1084 static char *efl_to_efl(AppData *ad, int type_index, const char *str)
1090 static char *html_to_html(AppData *ad, int type_index, const char *str)
1097 #define IMAGE_DEFAULT_WIDTH "240"
1098 #define IMAGE_DEFAULT_HEIGHT "180"
1099 static char *make_image_path_tag(int type_index, const char *str)
1101 char *img_tag_str = "file://%s";
1102 char *efl_img_tag = "<item absize="IMAGE_DEFAULT_WIDTH"x"IMAGE_DEFAULT_HEIGHT" href=file://%s>";
1103 char *html_img_tag = "<img src=\"file://%s\">";
1107 case ATOM_INDEX_HTML:
1108 img_tag_str = html_img_tag;
1110 case ATOM_INDEX_EFL:
1111 img_tag_str = efl_img_tag;
1113 case ATOM_INDEX_TEXT:
1114 case ATOM_INDEX_IMAGE:
1117 ERR("wrong type_index: %d", type_index);
1121 size_t len = snprintf(NULL, 0, img_tag_str, str) + 1;
1122 char *ret = MALLOC(sizeof(char) * len);
1124 snprintf(ret, len, img_tag_str, str);
1129 static char *image_path_to_text(AppData *ad, int type_index, const char *str)
1131 DBG("str: %s", str);
1132 return make_image_path_tag(ATOM_INDEX_TEXT, str);
1136 static char *image_path_to_html(AppData *ad, int type_index, const char *str)
1138 DBG("str: %s", str);
1139 return make_image_path_tag(ATOM_INDEX_HTML, str);
1142 static char *image_path_to_efl(AppData *ad, int type_index, const char *str)
1144 DBG("str: %s", str);
1145 return make_image_path_tag(ATOM_INDEX_EFL, str);
1148 static char *image_path_to_image_path(AppData *ad, int type_index, const char *str)
1150 DBG("str: %s", str);
1151 return make_image_path_tag(ATOM_INDEX_IMAGE, str);
1154 static char *html_to_image_path(AppData *ad, int type_index, const char *str)
1156 DBG("str: %s", str);
1157 Eina_Strbuf *sbuf = eina_strbuf_new();
1158 Eina_Bool image_path_exists = EINA_FALSE;
1159 int len = SAFE_STRLEN(str);
1160 char *p = (char *)str;
1162 char *image_path = NULL;
1164 if (type_index == ATOM_INDEX_HTML)
1166 for (s = p; (p - s) <= len; p++)
1170 if (!SAFE_STRNCMP((p + 1), "img", 3))
1172 for (p += 4; *p != '"'; p++);
1173 if (!SAFE_STRNCMP((p + 1), "http:/", 6) || !SAFE_STRNCMP((p + 1), "file:/", 6))
1175 if (!SAFE_STRNCMP((p + 1), "http:/", 6))
1176 ad->clipdrawer->http_path = EINA_TRUE;
1178 ad->clipdrawer->http_path = EINA_FALSE;
1182 for (; *p != '"'; p++);
1183 eina_strbuf_append_length(sbuf, s, p - s);
1184 image_path_exists = EINA_TRUE;
1187 else if ((*(p + 1) == '/'))
1191 for (; *p != '"'; p++);
1192 eina_strbuf_append_length(sbuf, s, p - s);
1193 image_path_exists = EINA_TRUE;
1194 ad->clipdrawer->http_path = EINA_FALSE;
1202 if (image_path_exists)
1204 //Replace the space Unicode character(%20).
1205 eina_strbuf_replace_all(sbuf, "%20", " ");
1206 image_path = eina_strbuf_string_steal(sbuf);
1207 eina_strbuf_free(sbuf);
1211 eina_strbuf_free(sbuf);
1215 static char *efl_to_image_path(AppData *ad, int type_index, const char *str)
1217 DBG("str: %s", str);
1218 Eina_Strbuf *sbuf = eina_strbuf_new();
1219 Eina_Bool image_path_exists = EINA_FALSE;
1220 int len = SAFE_STRLEN(str);
1221 char *p = entry_convert_emoticon_to_normal_text((char *)str);
1223 char *image_path = NULL;
1225 if (type_index == ATOM_INDEX_EFL)
1227 for (s = p; (p - s) <= len; p++)
1231 if (!SAFE_STRNCMP((p + 1), "item", 3))
1233 for (p += 5; *p != 'h'; p++);
1234 if (!SAFE_STRNCMP(p, "href=file:/", 11))
1238 for (; *p != '>'; p++);
1239 eina_strbuf_append_length(sbuf, s, p - s);
1240 image_path_exists = EINA_TRUE;
1243 else if (!SAFE_STRNCMP(p, "href=", 5))
1247 for (; *p != '>'; p++);
1248 eina_strbuf_append_length(sbuf, s, p - s);
1249 image_path_exists = EINA_TRUE;
1257 if (image_path_exists)
1259 image_path = eina_strbuf_string_steal(sbuf);
1260 eina_strbuf_free(sbuf);
1264 eina_strbuf_free(sbuf);
1268 static char *markup_to_entry(AppData *ad, int type_index, const char *str)
1274 Eina_Strbuf *strbuf = eina_strbuf_new();
1276 return SAFE_STRDUP(str);
1277 eina_strbuf_prepend(strbuf, "<font_size=28><color=#000000FF>");
1279 const char *trail = str;
1281 while (trail && *trail)
1283 const char *pretrail = trail;
1284 unsigned long length;
1288 trail = SAFE_STRCHR(trail, '<');
1291 eina_strbuf_append(strbuf, pretrail);
1294 endtag = SAFE_STRCHR(trail, '>');
1298 length = trail - pretrail;
1300 temp = SAFE_STRNDUP(pretrail, length);
1307 eina_strbuf_append(strbuf, temp);
1311 if (trail[0] == '/')
1317 if (!SAFE_STRNCMP(trail, "br", 2))
1319 eina_strbuf_append(strbuf, "<br>");
1326 if (type_index == ATOM_INDEX_HTML)
1327 eina_strbuf_replace_all(strbuf, " ", " ");
1329 char *entry_str = eina_strbuf_string_steal(strbuf);
1330 eina_strbuf_free(strbuf);
1334 static char *polaris_to_entry(AppData *ad, int type_index, const char *str)
1336 DBG("str: %s", str);
1337 return markup_to_entry(ad, type_index, str);
1340 static char *html_to_entry(AppData *ad, int type_index, const char *str)
1342 DBG("str: %s", str);
1343 return markup_to_entry(ad, type_index, str);
1346 static int entry_emoticon_origin_string(char **src_text, int* item_length)
1349 char *start_item = NULL;
1350 char *end_item = NULL;
1351 char *emoticon = NULL;
1353 int start_item_pos = 0;
1354 int end_item_pos = 0;
1355 int emoticon_pos = 0;
1357 char href_buf[50] = {0, };
1359 start_item = strstr(*src_text, "<item");
1362 start_item_pos = strlen(*src_text) - strlen(start_item);
1364 end_item = strchr(*src_text, '>');
1367 end_item_pos = strlen(*src_text) - strlen(end_item);
1369 if (start_item_pos >= end_item_pos)
1370 return ENTRY_EMOTICON_NONE;
1372 for (i = 1; i < ENTRY_EMOTICON_MAX; i++) {
1373 bzero(href_buf, sizeof(href_buf));
1374 snprintf(href_buf, sizeof(href_buf), "href=%s", emotion_name_table[i].emoticon_name);
1375 emoticon = strstr(*src_text, href_buf);
1377 emoticon_pos = strlen(*src_text) - strlen(emoticon);
1379 if (emoticon_pos > start_item_pos && emoticon_pos < end_item_pos) {
1380 *src_text += start_item_pos;
1381 *item_length = end_item_pos - start_item_pos + 1;
1387 return ENTRY_EMOTICON_NONE;
1390 char *entry_convert_emoticon_to_normal_text(const char *src_text)
1392 char *remain_text = (char *)src_text;
1393 char *dst_str = NULL;
1396 Eina_Strbuf *msg_data = eina_strbuf_new();
1398 while (*remain_text) {
1399 char *text_start = remain_text;
1400 int emoticon = ENTRY_EMOTICON_NONE;
1401 int emoticon_txt_length = 0;
1403 emoticon = entry_emoticon_origin_string(&remain_text, &emoticon_txt_length);
1405 if (emoticon != ENTRY_EMOTICON_NONE) {
1406 eina_strbuf_append_length(msg_data, text_start, remain_text - text_start);
1407 eina_strbuf_append_printf(msg_data, "%s", emotion_name_table[emoticon].text);
1409 remain_text = remain_text + emoticon_txt_length;
1411 if (strncmp(remain_text, "</item>", strlen("</item>")) == 0) {
1412 remain_text = remain_text + strlen("</item>");
1415 if (*remain_text == '\0')
1418 eina_strbuf_append(msg_data, text_start);
1422 str = eina_strbuf_string_get(msg_data);
1423 if (str) dst_str = strdup(str);
1424 eina_strbuf_free(msg_data);
1429 static char *efl_to_entry(AppData *ad, int type_index, const char *str)
1431 DBG("str: %s", str);
1433 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1434 char *normal_text = markup_to_entry(ad, type_index, emoticon_text);
1439 static char *image_path_to_entry(AppData *ad, int type_index, const char *str)
1445 static char *text_to_entry(AppData *ad, int type_index, const char *str)
1447 DBG("str: %s", str);
1448 char *markup = NULL;
1449 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1450 markup = (char*)evas_textblock_text_utf8_to_markup(NULL, emoticon_text);
1451 char *for_entry = markup_to_entry(ad, type_index, markup);
1453 FREE(emoticon_text);
1457 static Eina_List *make_tag_list(int type_index, const char *str)
1459 Eina_List *nodeList = NULL;
1462 nodeData = _get_start_node(str);
1466 nodeList = eina_list_append(nodeList, nodeData);
1467 nodeData = _get_next_node(nodeData);
1470 _link_match_tags(nodeList);
1474 case ATOM_INDEX_EFL:
1475 _set_EFL_tag_data(nodeList);
1477 case ATOM_INDEX_HTML:
1478 _set_HTML_tag_data(nodeList);
1481 WRN("wrong index: %d", type_index);
1484 _dumpNode(nodeList);
1488 static void cleanup_tag_list(Eina_List *nodeList)
1493 EINA_LIST_FOREACH(nodeList, trail, nodeData)
1494 _delete_node(nodeData);
1495 eina_list_free(nodeList);
1498 static char *html_to_efl(AppData *ad, int type_index, const char *str)
1501 Eina_List *nodeList = NULL;
1502 nodeList = make_tag_list(type_index, str);
1503 char *ret = _convert_to_edje(nodeList);
1504 DBG("efl: %s", ret);
1505 cleanup_tag_list(nodeList);
1510 static char *efl_to_html(AppData *ad, int type_index, const char *str)
1513 Eina_List *nodeList = NULL;
1514 nodeList = make_tag_list(type_index, str);
1515 char *ret = _convert_to_html(nodeList);
1516 DBG("html: %s", ret);
1517 cleanup_tag_list(nodeList);
1522 static char *text_to_html(AppData *ad, int type_index, const char *str)
1524 DBG("str: %s", str);
1525 char *markup = NULL;
1526 markup = (char*)evas_textblock_text_utf8_to_markup(NULL, str);
1527 char *html = efl_to_html(ad, ATOM_INDEX_EFL, markup);
1532 static char *text_to_efl(AppData *ad, int type_index, const char *str)
1534 DBG("str: %s", str);
1536 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1537 ret = (char*)evas_textblock_text_utf8_to_markup(NULL, emoticon_text);
1538 FREE(emoticon_text);
1542 static char *to_text(AppData *ad, int type_index, const char *str)
1544 DBG("str: %s", str);
1545 char *entry_text = NULL;
1547 if (type_index == ATOM_INDEX_HTML)
1549 Eina_Strbuf *buf = eina_strbuf_new();
1553 eina_strbuf_append(buf, str);
1554 eina_strbuf_replace_all(buf, " ", " ");
1555 html = eina_strbuf_string_steal(buf);
1556 eina_strbuf_free(buf);
1557 entry_text = (char*)evas_textblock_text_markup_to_utf8(NULL, html);
1563 char *emoticon_text = entry_convert_emoticon_to_normal_text(str);
1567 tmp = markup_to_entry(ad, type_index, emoticon_text);
1568 entry_text = evas_textblock_text_markup_to_utf8(NULL, tmp);
1570 if (entry_text) strcat(entry_text, "\0");
1571 FREE(emoticon_text);