From 1da0b4df761e90b6d2738a0da7125ce5dd6bf08a Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 22 Oct 2008 04:00:19 +0000 Subject: [PATCH] do plain text and markup load/save. SVN revision: 36951 --- legacy/elementary/src/lib/elc_notepad.c | 204 ++++++++++++++++++++++-- 1 file changed, 189 insertions(+), 15 deletions(-) diff --git a/legacy/elementary/src/lib/elc_notepad.c b/legacy/elementary/src/lib/elc_notepad.c index a0e6c90396..0dd4e61393 100644 --- a/legacy/elementary/src/lib/elc_notepad.c +++ b/legacy/elementary/src/lib/elc_notepad.c @@ -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, "
", &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);