do plain text and markup load/save.

SVN revision: 36951
This commit is contained in:
Carsten Haitzler 2008-10-22 04:00:19 +00:00
parent 448751a841
commit 1da0b4df76
1 changed files with 189 additions and 15 deletions

View File

@ -49,31 +49,97 @@ _on_focus_hook(void *data, Evas_Object *obj)
elm_widget_focus_set(wd->entry, 1);
}
static char *
_buf_append(char *buf, const char *str, int *len, int *alloc)
{
int len2;
len2 = strlen(str);
if ((*len + len2) >= *alloc)
{
char *buf2;
buf2 = realloc(buf, *alloc + 512);
if (!buf2) return NULL;
buf = buf2;
*alloc += 512;
}
strcpy(buf + *len, str);
*len += len2;
return buf;
}
static char *
_load_markup_utf8(const char *file)
{
FILE *f;
long size;
char *text = NULL;
size_t size;
int alloc = 0, len = 0, pos;
char *text = NULL, buf[4096];
f = fopen(file, "r");
if (!f) return NULL;
fseek(f, 0, SEEK_END);
size = ftell(f);
if (size > 0)
while (size = fread(buf, 1, sizeof(buf), f))
{
rewind(f);
text = malloc(size + 1);
if (text)
pos = 0;
buf[size] = 0;
while (pos < size)
{
if (fread(text, size, 1, f))
int ch;
char str[2];
ch = buf[pos];
if (ch != '\n')
{
text[size] = 0;
str[0] = ch;
str[1] = 0;
text = _buf_append(text, str, &len, &alloc);
}
pos++;
}
}
fclose(f);
return text;
}
static char *
_load_plain_utf8(const char *file)
{
FILE *f;
size_t size;
int alloc = 0, len = 0, pos;
char *text = NULL, buf[4096];
f = fopen(file, "r");
if (!f) return NULL;
while (size = fread(buf, 1, sizeof(buf), f))
{
pos = 0;
buf[size] = 0;
while (pos < size)
{
int ch, ppos;
ppos = pos;
ch = evas_common_font_utf8_get_next(buf, &pos);
if (ch == '\n')
text = _buf_append(text, "<br>", &len, &alloc);
else
{
free(text);
text = NULL;
int stlen = 0;
const char *escape;
char str[16];
escape = evas_textblock_string_escape_get(buf + ppos, &stlen);
printf("esc = %s\n", escape);
if (escape)
text = _buf_append(text, escape, &len, &alloc);
else
{
strncpy(str, buf + ppos, pos - ppos);
str[pos - ppos] = 0;
text = _buf_append(text, str, &len, &alloc);
}
}
}
}
@ -95,7 +161,7 @@ _load(Evas_Object *obj)
switch (wd->format)
{
case ELM_TEXT_FORMAT_PLAIN_UTF8:
// FIXME: convert plaintext to markup
text = _load_plain_utf8(wd->file);
break;
case ELM_TEXT_FORMAT_MARKUP_UTF8:
text = _load_markup_utf8(wd->file);
@ -132,6 +198,111 @@ _save_markup_utf8(const char *file, const char *text)
fputs(text, f); // FIXME: catch error
fputs("\n", f); // FIXME: catch error
fclose(f);
printf(".. written\n");
}
static void
_save_plain_utf8(const char *file, const char *text)
{
FILE *f;
char *s, *p;
char *tag_start, *tag_end, *esc_start, *esc_end;
if ((!text) || (text[0] == 0))
{
ecore_file_unlink(file);
return;
}
f = fopen(file, "w");
if (!f)
{
// FIXME: report a write error
return;
}
tag_start = tag_end = esc_start = esc_end = NULL;
p = (char *)text;
s = p;
for (;;)
{
if ((*p == 0) ||
(tag_end) || (esc_end) ||
(tag_start) || (esc_start))
{
if (tag_end)
{
char *ttag, *match;
ttag = malloc(tag_end - tag_start);
if (ttag)
{
strncpy(ttag, tag_start + 1, tag_end - tag_start - 1);
ttag[tag_end - tag_start - 1] = 0;
if (!strcmp(ttag, "br")) fputs("\n", f); // FIXME: catch error
free(ttag);
}
tag_start = tag_end = NULL;
}
else if (esc_end)
{
char tesc[256];
char *str;
if ((esc_end - esc_start) < (sizeof(tesc) - 2))
{
strncpy(tesc, esc_start, esc_end - esc_start + 1);
tesc[esc_end - esc_start + 1] = 0;
}
str = evas_textblock_escape_string_get(tesc);
if (str) fputs(str, f); // FIXME: catch error
esc_start = esc_end = NULL;
}
else if (*p == 0)
{
fwrite(s, p - s, 1, f); // FIXME: catch error
s = NULL;
}
if (*p == 0)
break;
}
if (*p == '<')
{
if (!esc_start)
{
tag_start = p;
tag_end = NULL;
fwrite(s, p - s, 1, f); // FIXME: catch error
s = NULL;
}
}
else if (*p == '>')
{
if (tag_start)
{
tag_end = p;
s = p + 1;
}
}
else if (*p == '&')
{
if (!tag_start)
{
esc_start = p;
esc_end = NULL;
fwrite(s, p - s, 1, f); // FIXME: catch error
s = NULL;
}
}
else if (*p == ';')
{
if (esc_start)
{
esc_end = p;
s = p + 1;
}
}
p++;
}
fclose(f);
}
static void
@ -142,9 +313,10 @@ _save(Evas_Object *obj)
switch (wd->format)
{
case ELM_TEXT_FORMAT_PLAIN_UTF8:
// FIXME: convert markup to plaintext
_save_plain_utf8(wd->file, elm_entry_entry_get(wd->entry));
break;
case ELM_TEXT_FORMAT_MARKUP_UTF8:
printf(".. save markup\n");
_save_markup_utf8(wd->file, elm_entry_entry_get(wd->entry));
break;
default:
@ -156,6 +328,7 @@ static int
_delay_write(void *data)
{
Widget_Data *wd = elm_widget_data_get(data);
printf(".. save\n");
_save(data);
wd->delay_write = NULL;
return 0;
@ -165,6 +338,7 @@ static void
_entry_changed(void *data, Evas_Object *obj, void *event_info)
{
Widget_Data *wd = elm_widget_data_get(data);
printf(".. changed\n");
if (wd->delay_write)
{
ecore_timer_del(wd->delay_write);
@ -192,7 +366,7 @@ elm_notepad_add(Evas_Object *parent)
wd->scroller = elm_scroller_add(parent);
elm_widget_resize_object_set(obj, wd->scroller);
wd->entry = elm_entry_add(parent);
evas_object_size_hint_weight_set(wd->entry, 1.0, 0.0);
evas_object_size_hint_weight_set(wd->entry, 1.0, 1.0);
evas_object_size_hint_align_set(wd->entry, -1.0, -1.0);
elm_scroller_content_set(wd->scroller, wd->entry);
evas_object_show(wd->entry);