Better quote+wrap algorithm. Fixes NB#148667.
authorJosé Dapena Paz <jdapena@igalia.com>
Wed, 13 Jan 2010 17:21:04 +0000 (18:21 +0100)
committerJosé Dapena Paz <jdapena@igalia.com>
Wed, 13 Jan 2010 17:28:11 +0000 (18:28 +0100)
src/modest-formatter.c
src/modest-text-utils.c

index aade0e3..f1f5aff 100644 (file)
@@ -80,6 +80,7 @@ extract_text (ModestFormatter *self, TnyMimePart *body)
        ModestFormatterPrivate *priv;
        gint total, lines, total_lines, line_chars;
        gboolean is_html, first_time;
+       gboolean forced_wrap;
 
        buf = gtk_text_buffer_new (NULL);
        stream = TNY_STREAM (tny_gtk_text_buffer_stream_new (buf));
@@ -98,6 +99,7 @@ extract_text (ModestFormatter *self, TnyMimePart *body)
        line_chars = 0;
        lines = 0;
 
+       forced_wrap = FALSE;
        first_time = TRUE;
        while (!tny_stream_is_eos (input_stream)) {
                gchar buffer [128];
@@ -116,14 +118,18 @@ extract_text (ModestFormatter *self, TnyMimePart *body)
                offset = buffer;
                while (offset < buffer + n_read) {
 
-                       if (*offset == '\n') {
+                       if (*offset == '\n' && !(forced_wrap && offset[1] == '\n')) {
                                total_lines ++;
                                line_chars = 0;
                        } else {
+                               if (*offset == '\n') {
+                                       forced_wrap = FALSE;
+                               }
                                line_chars ++;
                                if (line_chars >= LINE_WRAP) {
                                        total_lines ++;
                                        line_chars = 0;
+                                       forced_wrap = TRUE;
                                }
                        }
                        if (total_lines >= MAX_BODY_LINES)
index 91b9ef9..f45f48a 100644 (file)
@@ -941,6 +941,9 @@ get_breakpoint_utf8 (const gchar * s, gint indent, const gint limit)
        const gchar *pos, *last;
        gunichar *uni;
 
+       if (2*indent >= limit)
+               return strlen (s);
+
        indent = indent < 0 ? abs (indent) - 1 : indent;
 
        last = NULL;
@@ -1024,15 +1027,42 @@ modest_text_utils_quote_body (GString *output, const gchar *text,
        gsize len;
        gint indent, breakpoint, rem_indent = 0;
        GString *l, *remaining;
+       gchar *forced_wrap_append;
 
        iter = text;
        len = strlen(text);
        remaining = g_string_new ("");
+       forced_wrap_append = NULL;
        do {
-               l = get_next_line (text, len, iter);
-               iter = iter + l->len + 1;
-               indent = get_indent_level (l->str);
-               unquote_line (l, quote_symbol);
+
+               if (forced_wrap_append) {
+                       gint next_line_indent;
+                       gint l_len_with_indent;
+
+                       g_string_erase (remaining, 0, -1);
+                       next_line_indent = get_indent_level (iter);
+                       l = get_next_line (text, len, iter);
+                       l_len_with_indent = l->len;
+                       unquote_line (l, quote_symbol);
+                       if ((l->str && l->str[0] == '\0') || (next_line_indent != indent)) {
+                               g_string_free (l, TRUE);
+                               l = g_string_new (forced_wrap_append);
+                       } else {
+                               gunichar first_in_l;
+                               iter = iter + l_len_with_indent + 1;
+                               first_in_l = g_utf8_get_char_validated (l->str, l->len);
+                               if (!g_unichar_isspace (first_in_l)) 
+                                       l = g_string_prepend (l, " ");
+                               l = g_string_prepend (l, forced_wrap_append);
+                       }
+                       g_free (forced_wrap_append);
+                       forced_wrap_append = NULL;
+               } else {
+                       l = get_next_line (text, len, iter);
+                       iter = iter + l->len + 1;
+                       indent = get_indent_level (l->str);
+                       unquote_line (l, quote_symbol);
+               }
 
                if (remaining->len) {
                        if (l->len && indent == rem_indent) {
@@ -1045,8 +1075,14 @@ modest_text_utils_quote_body (GString *output, const gchar *text,
                                                get_breakpoint (remaining->str,
                                                                rem_indent,
                                                                limit);
-                                       append_quoted (output, quote_symbol, rem_indent,
-                                                      remaining, breakpoint);
+                                       if (breakpoint < remaining->len) {
+                                               g_free (forced_wrap_append);
+                                               forced_wrap_append = g_strdup (remaining->str + breakpoint);
+                                       } else {
+                                               if (!forced_wrap_append)
+                                                       append_quoted (output, quote_symbol, rem_indent,
+                                                                      remaining, breakpoint);
+                                       }
                                        g_string_erase (remaining, 0,
                                                        breakpoint);
                                        remaining_first = g_utf8_get_char_validated (remaining->str, remaining->len);
@@ -1065,9 +1101,13 @@ modest_text_utils_quote_body (GString *output, const gchar *text,
                        g_string_erase (remaining, 0, 1);
                }
                rem_indent = indent;
+               if (remaining->len > 0) {
+                       g_free (forced_wrap_append);
+                       forced_wrap_append = g_strdup (remaining->str);
+               }
                append_quoted (output, quote_symbol, indent, l, breakpoint);
                g_string_free (l, TRUE);
-       } while ((iter < text + len) || (remaining->str[0]));
+       } while ((iter < text + len) || (remaining->str[0]) || forced_wrap_append);
 
        return output;
 }