Do not use localized Re: or Fw: when replying/forwarding
[modest] / src / modest-text-utils.c
index 89dcb91..b34c6f8 100644 (file)
@@ -163,6 +163,8 @@ static gchar*   modest_text_utils_quote_html       (const gchar *text,
                                                    GList *attachments,
                                                    int limit);
 static gchar*   get_email_from_address (const gchar *address);
+static void     remove_extra_spaces (gchar *string);
+
 
 
 /* ******************************************************************* */
@@ -295,12 +297,13 @@ modest_text_utils_strftime(char *s, gsize max, const char *fmt, time_t timet)
 }
 
 gchar *
-modest_text_utils_derived_subject (const gchar *subject, const gchar *prefix)
+modest_text_utils_derived_subject (const gchar *subject, gboolean is_reply)
 {
-       gchar *tmp, *subject_dup, *retval;
-       gint prefix_len;
-
-       g_return_val_if_fail (prefix, NULL);
+       gchar *tmp, *subject_dup, *retval, *prefix;
+       const gchar *untranslated_prefix;
+       gint prefix_len, untranslated_prefix_len;
+       gboolean translated_found = FALSE;
+       gboolean first_time;
 
        if (!subject || subject[0] == '\0')
                subject = _("mail_va_no_subject");
@@ -308,13 +311,27 @@ modest_text_utils_derived_subject (const gchar *subject, const gchar *prefix)
        subject_dup = g_strdup (subject);
        tmp = g_strchug (subject_dup);
 
+       prefix = (is_reply) ? _("mail_va_re") : _("mail_va_fw");
+       prefix = g_strconcat (prefix, ":", NULL);
+       prefix_len = g_utf8_strlen (prefix, -1);
+
+       untranslated_prefix =  (is_reply) ? "Re:" : "Fw:";
+       untranslated_prefix_len = 3;
+
        /* We do not want things like "Re: Re: Re:" or "Fw: Fw:" so
           delete the previous ones */
-       prefix_len = strlen (prefix);
+       first_time = TRUE;
        do {
                if (g_str_has_prefix (tmp, prefix)) {
                        tmp += prefix_len;
                        tmp = g_strchug (tmp);
+                       /* Do not consider translated prefixes in the
+                          middle of a Re:Re:..Re: like sequence */
+                       if (G_UNLIKELY (first_time))
+                               translated_found = TRUE;
+               } else if (g_str_has_prefix (tmp, untranslated_prefix)) {
+                       tmp += untranslated_prefix_len;
+                       tmp = g_strchug (tmp);
                } else {
                        gchar *prefix_down, *tmp_down;
 
@@ -334,10 +351,22 @@ modest_text_utils_derived_subject (const gchar *subject, const gchar *prefix)
                                break;
                        }
                }
+               first_time = FALSE;
        } while (tmp);
 
-       retval = g_strdup_printf ("%s %s", prefix, tmp);
+       if (!g_strcmp0 (subject, tmp)) {
+               /* normal case */
+               retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
+       } else {
+               if (translated_found) {
+                       /* Found a translated prefix, i.e, "VS:" in Finish */
+                       retval = g_strdup_printf ("%s %s", prefix, tmp);
+               } else {
+                       retval = g_strdup_printf ("%s %s", untranslated_prefix, tmp);
+               }
+       }
        g_free (subject_dup);
+       g_free (prefix);
 
        return retval;
 }
@@ -487,7 +516,7 @@ modest_text_utils_convert_buffer_to_html_start (GString *html, const gchar *data
                guchar kar = data[i];
                
                if (space_seen && kar != ' ') {
-                       g_string_append (html, " ");
+                       g_string_append (html, " ");
                        space_seen = FALSE;
                }
                
@@ -663,15 +692,16 @@ modest_text_utils_split_addresses_list (const gchar *addresses)
        gboolean after_at = FALSE;
 
        g_return_val_if_fail (addresses, NULL);
-       
-       /* skip any space, ',', ';' at the start */
-       while (my_addrs && (my_addrs[0] == ' ' || my_addrs[0] == ',' || my_addrs[0] == ';'))
+
+       /* skip any space, ',', ';' '\n' at the start */
+       while (my_addrs && (my_addrs[0] == ' ' || my_addrs[0] == ',' ||
+                           my_addrs[0] == ';' || my_addrs[0] == '\n'))
               ++my_addrs;
 
        /* are we at the end of addresses list? */
        if (!my_addrs[0])
                return NULL;
-       
+
        /* nope, we are at the start of some address
         * now, let's find the end of the address */
        end = my_addrs + 1;
@@ -694,12 +724,56 @@ modest_text_utils_split_addresses_list (const gchar *addresses)
        addr = g_strndup (my_addrs, end - my_addrs);
        g_strchomp (addr);
 
+       remove_extra_spaces (addr);
+
        head = g_slist_append (NULL, addr);
        head->next = modest_text_utils_split_addresses_list (end); /* recurse */
 
        return head;
 }
 
+gchar *
+modest_text_utils_join_addresses (const gchar *from,
+                                 const gchar *to,
+                                 const gchar *cc,
+                                 const gchar *bcc)
+{
+       GString *buffer;
+       gboolean add_separator = FALSE;
+
+       buffer = g_string_new ("");
+
+       if (from && strlen (from)) {
+               buffer = g_string_append (buffer, from);
+               add_separator = TRUE;
+       }
+       if (to && strlen (to)) {
+               if (add_separator)
+                       buffer = g_string_append (buffer, "; ");
+               else
+                       add_separator = TRUE;
+
+               buffer = g_string_append (buffer, to);
+       }
+       if (cc && strlen (cc)) {
+               if (add_separator)
+                       buffer = g_string_append (buffer, "; ");
+               else
+                       add_separator = TRUE;
+
+               buffer = g_string_append (buffer, cc);
+       }
+       if (bcc && strlen (bcc)) {
+               if (add_separator)
+                       buffer = g_string_append (buffer, "; ");
+               else
+                       add_separator = TRUE;
+
+               buffer = g_string_append (buffer, bcc);
+       }
+
+       return g_string_free (buffer, FALSE);
+}
 
 void
 modest_text_utils_address_range_at_position (const gchar *recipients_list,
@@ -1936,6 +2010,20 @@ remove_quotes (gchar **quotes)
        }
 }
 
+static void
+remove_extra_spaces (gchar *string)
+{
+       gchar *start;
+
+       start = string;
+       while (start && start[0] != '\0') {
+               if ((start[0] == ' ') && (start[1] == ' ')) {
+                       g_strchug (start+1);
+               }
+               start++;
+       }
+}
+
 gchar *
 modest_text_utils_escape_mnemonics (const gchar *text)
 {
@@ -2047,7 +2135,7 @@ gchar *
 modest_text_utils_get_secure_header (const gchar *value,
                                     const gchar *header)
 {
-       const gint max_len = 128;
+       const gint max_len = 16384;
        gchar *new_value = NULL;
        gchar *needle = g_strrstr (value, header);
 
@@ -2121,13 +2209,9 @@ quote_name_part (GString **str, gchar **cur, gchar **start)
                        *start = g_utf8_next_char (*cur);
                } else {
                        *str = g_string_append_c (*str, '"');
-                       *str = g_string_append_len (*str, *start,
-                                                   (g_utf8_pointer_to_offset (*start, blank) -
-                                                    g_utf8_pointer_to_offset (*start, *start)));
+                       *str = g_string_append_len (*str, *start, (blank - *start));
                        *str = g_string_append_c (*str, '"');
-                       *str = g_string_append_len (*str, blank,
-                                                   (g_utf8_pointer_to_offset (*start, *cur) -
-                                                    g_utf8_pointer_to_offset (*start, blank)));
+                       *str = g_string_append_len (*str, blank, (*cur - blank));
                        *str = g_string_append (*str, ";");
                        *start = g_utf8_next_char (*cur);
                }