static Paste_Image *pasteimage_alloc(const char *file, int pathlen);
static Eina_Bool pasteimage_append(Paste_Image *pi, Evas_Object *entry);
static void pasteimage_free(Paste_Image *pi);
+static void entry_insert_filter(Evas_Object* entry, char* str);
/* Optimisation: Turn this into a 256 byte table:
* then can lookup in one index, not N checks */
static const Escape escapes[] = {
- { "<br>", '\n' },
- { "<\t>", '\t' },
- { "gt;", '>' },
- { "lt;", '<' },
- { "amp;", '&' },
- { "quot;", '\'' },
- { "dquot;", '"' }
+ { "<br>", '\n' },
+ { "<ps>", '\n' },
+ { "<\t>", '\t' },
+ { "gt;", '>' },
+ { "lt;", '<' },
+ { "amp;", '&' },
+ { "quot;", '\'' },
+ { "dquot;", '"' }
};
#define N_ESCAPES ((int)(sizeof(escapes) / sizeof(escapes[0])))
{"underline", "del", 0},
{"strikethrough", "ins", 0},
{"br", "br", 1},
+ {"ps", "br", 1},
{"b", "b", 1},
{"item", "img", 1}
};
char *valueEnd = strchr(value, '\0');
int i;
- for (i = 0; i < spCnt; i++)
+ int start = 0;
+ if ((!strncmp(tag_str, "<item", 5) && !strcmp(tag_name, "href")) // EFL img tag
+ || (!strncmp(tag_str, "<img", 4) && !strcmp(tag_name, "src"))) // HTML img tag
+ start = 1;
+
+ for (i = start; i < spCnt; i++)
{
if (spArray[i] && spArray[i] < valueEnd)
valueEnd = spArray[i];
if (path)
{
char *modify = malloc(sizeof(char) * (strlen(value) + 1));
- strncpy(modify, "file://", 7);
- modify[7] = '\0';
+ strncpy(modify, "file://", 8);
path += 7;
while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
{
if (path)
{
char *modify = malloc(sizeof(char) * (strlen(value) + 1));
- strncpy(modify, "file://", 7);
- modify[7] = '\0';
+ strncpy(modify, "file://", 8);
path += 7;
while (path[1] && path[0] && path[1] == '/' && path[0] == '/')
{
}
switch(trail->tagPosType)
{
+ /* closed tag does not need in HTML
case TAGPOS_ALONE:
eina_strbuf_append(html, " />");
- break;
+ break;*/
default:
eina_strbuf_append(html, ">");
break;
Cnp_Selection *sel;
if (!data_ret) return EINA_FALSE;
+ if (!data || (*((unsigned int *)data) >= ELM_SEL_MAX))
+ return EINA_FALSE;
sel = selections + *((int *)data);
cnp_debug("Got %s\n", p);
if (strncmp(p, "file://", 7))
{
- /* elm_selection_set send target notify->data just "x" */
- if (*p == 'x') return EINA_TRUE;
if (*p != '/') return EINA_FALSE;
}
{
if ((atoms[j].atom == atomlist[i]) && (atoms[j].notify))
{
+#if 0
if ((j == CNP_ATOM_text_uri) ||
(j == CNP_ATOM_text_urilist))
{
if(!is_uri_type_data(sel, notify)) continue;
}
+#endif
cnp_debug("Atom %s matches\n",atoms[j].name);
goto done;
}
return 0;
}
+static void
+entry_insert_filter(Evas_Object* entry, char* str)
+{
+ if (!entry || !str)
+ return;
+
+ char *insertStr = str;
+ // if entry has text only set then remove item tags
+ if (elm_entry_cnp_textonly_get(entry))
+ {
+ while (EINA_TRUE)
+ {
+ char *startTag = NULL;
+ char *endTag = NULL;
+
+ startTag = strstr(insertStr, "<item");
+ if (!startTag)
+ startTag = strstr(insertStr, "</item");
+ if (startTag)
+ endTag = strstr(startTag, ">");
+ else
+ break;
+ if (!endTag || startTag > endTag)
+ {
+ cnp_debug("Broken tag: %s\n", str);
+ break;
+ }
+
+ size_t sindex = startTag - insertStr;
+ size_t eindex = endTag - insertStr + 1;
+
+ Eina_Strbuf *buf = eina_strbuf_new();
+ if (buf)
+ {
+ eina_strbuf_append(buf, insertStr);
+ eina_strbuf_remove(buf, sindex, eindex);
+ insertStr = eina_strbuf_string_steal(buf);
+ eina_strbuf_free(buf);
+ }
+ }
+ }
+ cnp_debug("remove item tag: %s\n", insertStr);
+
+ // if entry has single line set then remove <br> & <ps> tags
+ if (elm_entry_single_line_get(entry))
+ {
+ Eina_Strbuf *buf = eina_strbuf_new();
+ if (buf)
+ {
+ eina_strbuf_append(buf, insertStr);
+ eina_strbuf_replace_all(buf, "<br>", "");
+ eina_strbuf_replace_all(buf, "<ps>", "");
+ insertStr = eina_strbuf_string_steal(buf);
+ eina_strbuf_free(buf);
+ }
+ }
+ cnp_debug("remove break tag: %s\n", insertStr);
+
+ elm_entry_entry_insert(entry, insertStr);
+
+ if (insertStr != str)
+ free(insertStr);
+}
static int
notify_handler_text(Cnp_Selection *sel, Ecore_X_Event_Selection_Notify *notify)
{
Elm_Selection_Data ddata;
- str = mark_up((char *)data->data, data->length, NULL);
+ str = strdup(data->data);
ddata.x = ddata.y = 0;
ddata.format = ELM_SEL_FORMAT_TEXT;
ddata.data = str;
cnp_debug("Notify handler text %d %d %p\n", data->format,data->length, data->data);
str = mark_up((char *)data->data, data->length, NULL);
cnp_debug("String is %s (from %s)\n", str, data->data);
- elm_entry_entry_insert(sel->requestwidget, str);
+ entry_insert_filter(sel->requestwidget, str);
+ //elm_entry_entry_insert(sel->requestwidget, str);
free(str);
return 0;
}
Ecore_X_Selection_Data *data;
Ecore_X_Selection_Data_Files *files;
Paste_Image *pi;
- char *p;
+ char *p, *stripstr;
data = notify->data;
cnp_debug("data->format is %d %p %p\n", data->format, notify, data);
cnp_debug("more then one file: Bailing\n");
return 0;
}
- p = files->files[0];
+ stripstr = p = strdup(files->files[0]);
}
else
{
- p = (char *)data->data;
+ stripstr = p = strndup((char *)data->data, data->length);
}
if (!p)
ddata.data = p;
ddata.len = data->length;
sel->datacb(sel->udata, sel->widget, &ddata);
+ free(p);
return 0;
}
if (strncmp(p, "file://", 7))
{
/* Try and continue if it looks sane */
- if (*p != '/') return 0;
+ if (*p != '/')
+ {
+ free(p);
+ return 0;
+ }
}
else
{
pasteimage_append(pi, sel->requestwidget);
savedtypes.pi = NULL;
}
+ free(stripstr);
return 0;
}
sel->datacb(sel->udata, sel->widget, &ddata);
}
else
- elm_entry_entry_insert(sel->requestwidget, stripstr);
+ entry_insert_filter(sel->requestwidget, stripstr);
+ //elm_entry_entry_insert(sel->requestwidget, stripstr);
cnp_debug("String is %s (%d bytes)\n", stripstr, data->length);
free(stripstr);
sel->datacb(sel->udata, sel->widget, &ddata);
}
else
- elm_entry_entry_insert(sel->requestwidget, stripstr);
+ entry_insert_filter(sel->requestwidget, stripstr);
+ //elm_entry_entry_insert(sel->requestwidget, stripstr);
cnp_debug("String is %s (%d bytes)\n", stripstr, data->length);
free(stripstr);
if (size_ret) *size_ret = strlen(sel->selbuf);*/
char *edje = NULL;
- if (data_ret && (sel->format & ELM_SEL_FORMAT_HTML))
+ if (data_ret && (sel->format == ELM_SEL_FORMAT_TEXT))
+ {
+ if (sel->selbuf && sel->selbuf[0] != '\0')
+ edje = mark_up(sel->selbuf, strlen(sel->selbuf), NULL);
+ }
+ else if (data_ret && ((sel->format & ELM_SEL_FORMAT_HTML)))
{
Eina_List *nodeList = NULL;
Eina_List *trail;
if (edje)
*data_ret = edje;
else
- *data_ret = strdup(sel->selbuf);
+ if (sel->selbuf)
+ *data_ret = strdup(sel->selbuf);
+ else
+ *data_ret = strdup("");
}
if (size_ret)
{
if (edje)
*size_ret = strlen(edje);
else
- *size_ret = strlen(sel->selbuf);
+ if (sel->selbuf)
+ *size_ret = strlen(sel->selbuf);
+ else
+ *size_ret = 0;
}
return EINA_TRUE;
sel = selections + *(int *)data;
char *html = NULL;
- if (data_ret && (sel->format & ELM_SEL_FORMAT_MARKUP))
+ char *convert_target = sel->selbuf;
+ Eina_Bool convert_edje = EINA_FALSE;
+
+ if (data_ret && (sel->format == ELM_SEL_FORMAT_TEXT))
+ {
+ if (sel->selbuf && sel->selbuf[0] != '\0')
+ {
+ convert_target = mark_up(sel->selbuf, strlen(sel->selbuf), NULL);
+ convert_edje = EINA_TRUE;
+ }
+ }
+
+ if (data_ret && ((sel->format & ELM_SEL_FORMAT_MARKUP) || convert_edje))
{
Eina_List *nodeList = NULL;
Eina_List *trail;
PTagNode nodeData;
- nodeData = _get_start_node(sel->selbuf);
+ nodeData = _get_start_node(convert_target);
while (nodeData)
{
if (html)
*data_ret = html;
else
- *data_ret = strdup(sel->selbuf);
+ if (sel->selbuf)
+ *data_ret = strdup(sel->selbuf);
+ else
+ *data_ret = strdup("");
}
if (size_ret)
if (html)
*size_ret = strlen(html);
else
- *size_ret = strlen(sel->selbuf);
+ if (sel->selbuf)
+ *size_ret = strlen(sel->selbuf);
+ else
+ *size_ret = 0;
}
+ if (convert_target != sel->selbuf)
+ free(convert_target);
return EINA_TRUE;
}
if (!pi) return EINA_FALSE;
if (!entry) return EINA_FALSE;
+ if (elm_entry_cnp_textonly_get(entry)) return EINA_FALSE;
pasteimage_provider_set(entry);
tmppath = getenv("TMP");
if (!tmppath) tmppath = P_tmpdir;
- if (!tmppath) tmppath = "/tmp";
len = snprintf(NULL, 0, "%s/%sXXXXXX", tmppath, "elmcnpitem-");
if (len < 0)
{
return info;
}
- //eina_mmap_safety_enabled_set(EINA_TRUE); // NOTE: Temporary comment
+ eina_mmap_safety_enabled_set(EINA_TRUE);
info->map = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, info->fd, 0);
if (info->map == MAP_FAILED)