X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=deb2971688832d6fcdbda925349c52984a7cb1a4;hp=85df268d6be6532e54628e03c6170d943531df4c;hb=506d8ddd3ac4f45ad5fffb7d2ec83d306fc6f19b;hpb=0f332c6c834094611227374422ba0afccd560cf8 diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 85df268..deb2971 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -145,8 +145,9 @@ static GSList* get_url_matches (GString *txt, gint offset); static GString* get_next_line (const char *b, const gsize blen, const gchar * iter); static int get_indent_level (const char *l); -static void unquote_line (GString * l); -static void append_quoted (GString * buf, const int indent, const GString * str, +static void unquote_line (GString * l, const gchar *quote_symbol); +static void append_quoted (GString * buf, const gchar *quote_symbol, + const int indent, const GString * str, const int cutpoint); static int get_breakpoint_utf8 (const gchar * s, const gint indent, const gint limit); static int get_breakpoint_ascii (const gchar * s, const gint indent, const gint limit); @@ -278,6 +279,11 @@ modest_text_utils_strftime(char *s, gsize max, const char *fmt, time_t timet) { struct tm tm; + /* To prevent possible problems in strftime that could leave + garbage in the s variable */ + if (s) + s[0] = '\0'; + /* does not work on old maemo glib: * g_date_set_time_t (&date, timet); */ @@ -607,6 +613,7 @@ modest_text_utils_split_addresses_list (const gchar *addresses) const gchar *my_addrs = addresses; const gchar *end; gchar *addr; + gboolean after_at = FALSE; g_return_val_if_fail (addresses, NULL); @@ -621,8 +628,20 @@ modest_text_utils_split_addresses_list (const gchar *addresses) /* nope, we are at the start of some address * now, let's find the end of the address */ end = my_addrs + 1; - while (end[0] && end[0] != ',' && end[0] != ';') + while (end[0] && end[0] != ';' && !(after_at && end[0] == ',')) { + if (end[0] == '\"') { + while (end[0] && end[0] != '\"') + ++end; + } + if (end[0] == '@') { + after_at = TRUE; + } + if ((end[0] && end[0] == '>')&&(end[1] && end[1] == ',')) { + ++end; + break; + } ++end; + } /* we got the address; copy it and remove trailing whitespace */ addr = g_strndup (my_addrs, end - my_addrs); @@ -752,15 +771,17 @@ get_indent_level (const char *l) } static void -unquote_line (GString * l) +unquote_line (GString * l, const gchar *quote_symbol) { gchar *p; + gint quote_len; p = l->str; + quote_len = strlen (quote_symbol); while (p[0]) { - if (p[0] == '>') { - if (p[1] == ' ') { - p++; + if (g_str_has_prefix (p, quote_symbol)) { + if (p[quote_len] == ' ') { + p += quote_len; } } else { break; @@ -771,15 +792,19 @@ unquote_line (GString * l) } static void -append_quoted (GString * buf, int indent, const GString * str, +append_quoted (GString * buf, const gchar *quote_symbol, + int indent, const GString * str, const int cutpoint) { int i; + gchar *quote_concat; indent = indent < 0 ? abs (indent) - 1 : indent; + quote_concat = g_strconcat (quote_symbol, " ", NULL); for (i = 0; i <= indent; i++) { - g_string_append (buf, "> "); + g_string_append (buf, quote_concat); } + g_free (quote_concat); if (cutpoint > 0) { g_string_append_len (buf, str->str, cutpoint); } else { @@ -868,40 +893,25 @@ quoted_attachments (GList *attachments) } -static gchar * -modest_text_utils_quote_plain_text (const gchar *text, - const gchar *cite, - const gchar *signature, - GList *attachments, - int limit) +static GString * +modest_text_utils_quote_body (GString *output, const gchar *text, + const gchar *quote_symbol, + int limit) { + const gchar *iter; - gint indent, breakpoint, rem_indent = 0; - GString *q, *l, *remaining; gsize len; - gchar *attachments_string = NULL; - - q = g_string_new (""); - - if (signature != NULL) { - q = g_string_append (q, "\n--\n"); - q = g_string_append (q, signature); - } - - q = g_string_append (q, "\n"); - q = g_string_append (q, cite); - q = g_string_append_c (q, '\n'); - - /* remaining will store the rest of the line if we have to break it */ - remaining = g_string_new (""); + gint indent, breakpoint, rem_indent = 0; + GString *l, *remaining; iter = text; len = strlen(text); + remaining = g_string_new (""); do { l = get_next_line (text, len, iter); iter = iter + l->len + 1; indent = get_indent_level (l->str); - unquote_line (l); + unquote_line (l, quote_symbol); if (remaining->len) { if (l->len && indent == rem_indent) { @@ -913,7 +923,7 @@ modest_text_utils_quote_plain_text (const gchar *text, get_breakpoint (remaining->str, rem_indent, limit); - append_quoted (q, rem_indent, + append_quoted (output, quote_symbol, rem_indent, remaining, breakpoint); g_string_erase (remaining, 0, breakpoint); @@ -931,10 +941,36 @@ modest_text_utils_quote_plain_text (const gchar *text, g_string_erase (remaining, 0, 1); } rem_indent = indent; - append_quoted (q, indent, l, breakpoint); + append_quoted (output, quote_symbol, indent, l, breakpoint); g_string_free (l, TRUE); } while ((iter < text + len) || (remaining->str[0])); + return output; +} + +static gchar * +modest_text_utils_quote_plain_text (const gchar *text, + const gchar *cite, + const gchar *signature, + GList *attachments, + int limit) +{ + GString *q; + gchar *attachments_string = NULL; + + q = g_string_new (""); + + if (signature != NULL) { + q = g_string_append (q, "\n--\n"); + q = g_string_append (q, signature); + } + + q = g_string_append (q, "\n"); + q = g_string_append (q, cite); + q = g_string_append_c (q, '\n'); + + q = modest_text_utils_quote_body (q, text, ">", limit); + attachments_string = quoted_attachments (attachments); q = g_string_append (q, attachments_string); g_free (attachments_string); @@ -969,13 +1005,17 @@ modest_text_utils_quote_html (const gchar *text, "\n
\n"); if (text || cite || signature) { + GString *quoted_text; g_string_append (result_string, "
\n");
 		if (signature) {
 			quote_html_add_to_gstring (result_string, SIGNATURE_MARKER);
 			quote_html_add_to_gstring (result_string, signature);
 		}
 		quote_html_add_to_gstring (result_string, cite);
-		quote_html_add_to_gstring (result_string, text);
+		quoted_text = g_string_new ("");
+		quoted_text = modest_text_utils_quote_body (quoted_text, text, ">", limit);
+		quote_html_add_to_gstring (result_string, quoted_text->str);
+		g_string_free (quoted_text, TRUE);
 		if (attachments) {
 			gchar *attachments_string = quoted_attachments (attachments);
 			quote_html_add_to_gstring (result_string, attachments_string);
@@ -995,7 +1035,7 @@ cmp_offsets_reverse (const url_match_t *match1, const url_match_t *match2)
 	return match2->offset - match1->offset;
 }
 
-static gboolean url_matches_block = 0;
+static gint url_matches_block = 0;
 static url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
 
 
@@ -1304,7 +1344,8 @@ modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insens
 	if (!insensitive) {
 
 		/* optimization: shortcut if first char is ascii */ 
-		if (((s1[0] & 0xf0)== 0) && ((s2[0] & 0xf0) == 0)) 
+		if (((s1[0] & 0x80)== 0) && ((s2[0] & 0x80) == 0) &&
+		    (s1[0] != s2[0])) 
 			return s1[0] - s2[0];
 		
 		return g_utf8_collate (s1, s2);
@@ -1313,8 +1354,9 @@ modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insens
 		gint result;
 		gchar *n1, *n2;
 
-		/* optimization: short cut iif first char is ascii */ 
-		if (((s1[0] & 0xf0) == 0) && ((s2[0] & 0xf0) == 0)) 
+		/* optimization: shortcut if first char is ascii */ 
+		if (((s1[0] & 0x80) == 0) && ((s2[0] & 0x80) == 0) &&
+		    (tolower(s1[0]) != tolower (s2[0]))) 
 			return tolower(s1[0]) - tolower(s2[0]);
 		
 		n1 = g_utf8_strdown (s1, -1);
@@ -1344,10 +1386,11 @@ modest_text_utils_get_display_date (time_t date)
 
 	/* if it's today, show the time, if it's not today, show the date instead */
 
+	/* TODO: take into account the system config for 24/12h */
 	if (day == date_day) /* is the date today? */
-		modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%X", date);
+		modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, _HL("wdgt_va_24h_time"), date);
 	else 
-		modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%x", date); 
+		modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, _HL("wdgt_va_date"), date); 
 
 	return date_buf; /* this is a static buffer, don't free! */
 }
@@ -1613,9 +1656,9 @@ modest_text_utils_get_display_size (guint64 size)
 	const guint GB=1024 * MB;
 
 	if (size == 0)
-		return g_strdup_printf(_FM("sfil_li_size_kb"), 0);
-	if (0 < size && size < KB)
-		return g_strdup_printf (_FM("sfil_li_size_kb"), 1);
+		return g_strdup_printf (_FM("sfil_li_size_kb"));
+	if (0 <= size && size < KB)
+		return g_strdup_printf (_FM("sfil_li_size_1kb_99kb"), 1);
 	else if (KB <= size && size < 100 * KB)
 		return g_strdup_printf (_FM("sfil_li_size_1kb_99kb"), size / KB);
 	else if (100*KB <= size && size < MB)