From a5917048af5e1dd6eafcb29b509d1e95e9ea2bde Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Dapena=20Paz?= Date: Wed, 13 Jan 2010 18:21:04 +0100 Subject: [PATCH] Better quote+wrap algorithm. Fixes NB#148667. --- src/modest-formatter.c | 8 ++++++- src/modest-text-utils.c | 54 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/modest-formatter.c b/src/modest-formatter.c index aade0e3..f1f5aff 100644 --- a/src/modest-formatter.c +++ b/src/modest-formatter.c @@ -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) diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 91b9ef9..f45f48a 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -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; } -- 1.7.9.5