GList *attachments,
int limit);
static gchar* get_email_from_address (const gchar *address);
+static void remove_extra_spaces (gchar *string);
+
/* ******************************************************************* */
}
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");
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;
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;
}
guchar kar = data[i];
if (space_seen && kar != ' ') {
- g_string_append (html, " ");
+ g_string_append (html, " ");
space_seen = FALSE;
}
GString *str;
gchar *start, *cur;
+ if (!addresses)
+ return;
+
+ if (strlen (addresses) == 0)
+ return;
+
str = g_string_new ("");
start = (gchar*) addresses;
cur = (gchar*) addresses;
for (cur = start; *cur != '\0'; cur = g_utf8_next_char (cur)) {
if (*cur == ',' || *cur == ';') {
- if (!g_utf8_strchr (start, (cur - start + 1), g_utf8_get_char ("@")))
+ gint *start_index, *end_index;
+ gchar *next_char = g_utf8_next_char (cur);
+
+ if (!g_utf8_strchr (start, (cur - start + 1), g_utf8_get_char ("@")) &&
+ next_char && *next_char != '\n')
continue;
- {
- gint *start_index, *end_index;
- start_index = g_new0 (gint, 1);
- end_index = g_new0 (gint, 1);
- *start_index = g_utf8_pointer_to_offset (addresses, start);
- *end_index = g_utf8_pointer_to_offset (addresses, cur);;
- *start_indexes = g_slist_prepend (*start_indexes, start_index);
- *end_indexes = g_slist_prepend (*end_indexes, end_index);
- start = g_utf8_next_char (cur);
- }
+
+ start_index = g_new0 (gint, 1);
+ end_index = g_new0 (gint, 1);
+ *start_index = g_utf8_pointer_to_offset (addresses, start);
+ *end_index = g_utf8_pointer_to_offset (addresses, cur);;
+ *start_indexes = g_slist_prepend (*start_indexes, start_index);
+ *end_indexes = g_slist_prepend (*end_indexes, end_index);
+ start = g_utf8_next_char (cur);
}
}
- *start_indexes = g_slist_reverse (*start_indexes);
- *end_indexes = g_slist_reverse (*end_indexes);
+ if (start != cur) {
+ gint *start_index, *end_index;
+ start_index = g_new0 (gint, 1);
+ end_index = g_new0 (gint, 1);
+ *start_index = g_utf8_pointer_to_offset (addresses, start);
+ *end_index = g_utf8_pointer_to_offset (addresses, cur);;
+ *start_indexes = g_slist_prepend (*start_indexes, start_index);
+ *end_indexes = g_slist_prepend (*end_indexes, end_index);
+ }
+
+ if (*start_indexes)
+ *start_indexes = g_slist_reverse (*start_indexes);
+ if (*end_indexes)
+ *end_indexes = g_slist_reverse (*end_indexes);
}
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;
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,
}
}
if (last_quote)
- current = last_quote;
+ current = g_utf8_next_char (last_quote);
} else {
has_error = TRUE;
for (current = stripped ; *current != '\0'; current = g_utf8_next_char (current)) {
}
}
+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)
{
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);
if (blank && (blank != *start)) {
if (is_quoted (*start, blank - 1)) {
*str = g_string_append_len (*str, *start, str_len);
- *str = g_string_append (*str, "; ");
+ *str = g_string_append (*str, ";");
*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 (*str, "; ");
+ *str = g_string_append_len (*str, blank, (*cur - blank));
+ *str = g_string_append (*str, ";");
*start = g_utf8_next_char (*cur);
}
} else {
*str = g_string_append_len (*str, *start, str_len);
- *str = g_string_append (*str, "; ");
+ *str = g_string_append (*str, ";");
*start = g_utf8_next_char (*cur);
}
}