* will hang modest
*/
#define HYPERLINKIFY_MAX_LENGTH (1024*50)
-#define SIGNATURE_MARKER "--"
-
/*
* we need these regexps to find URLs in plain text e-mails
/* note: match MARK_AMP_URI_STR as well, because after txt->html, a '&' will look like $(MARK_AMP_URI_STR)"amp;" */
#define MAIL_VIEWER_URL_MATCH_PATTERNS { \
- { "(feed:|)(file|rtsp|http|ftp|https|mms|mmsh|webcal|feed|rtsp|rdp|lastfm|sip)://[-a-z0-9_$.+!*(),;:@%=?/~#" MARK_AMP_URI_STR \
- "]+[-a-z0-9_$%" MARK_AMP_URI_STR "=?/~#]", \
+ { "(feed:|)(file|rtsp|http|ftp|https|mms|mmsh|webcal|feed|rtsp|rdp|lastfm|sip)://[-a-z0-9_$.+!*(),;:@%=\?/~#&" MARK_AMP_URI_STR \
+ "]+[-a-z0-9_$%&" MARK_AMP_URI_STR "=?/~#]", \
NULL, NULL },\
{ "www\\.[-a-z0-9_$.+!*(),;:@%=?/~#" MARK_AMP_URI_STR "]+[-a-z0-9_$%" MARK_AMP_URI_STR "=?/~#]",\
NULL, "http://" }, \
if (!signature) {
tmp_sig = g_strdup (text);
} else {
- tmp_sig = g_strconcat (text, "\n", SIGNATURE_MARKER, "\n", signature, NULL);
+ tmp_sig = g_strconcat (text, "\n", MODEST_TEXT_UTILS_SIGNATURE_MARKER, "\n", signature, NULL);
}
if (strcmp (content_type, "text/html") == 0) {
tmp += prefix_len;
tmp = g_strchug (tmp);
} else {
- break;
+ gchar *prefix_down, *tmp_down;
+
+ /* We need this to properly check the cases of
+ some clients adding FW: instead of Fw: for
+ example */
+ prefix_down = g_utf8_strdown (prefix, -1);
+ tmp_down = g_utf8_strdown (tmp, -1);
+ if (g_str_has_prefix (tmp_down, prefix_down)) {
+ tmp += prefix_len;
+ tmp = g_strchug (tmp);
+ g_free (prefix_down);
+ g_free (tmp_down);
+ } else {
+ g_free (prefix_down);
+ g_free (tmp_down);
+ break;
+ }
}
} while (tmp);
g_slist_foreach (addresses, (GFunc)g_free, NULL);
g_slist_free (addresses);
+ if (new_list == NULL)
+ new_list = g_strdup ("");
+
return new_list;
}
guchar kar = data[i];
if (space_seen && kar != ' ') {
- g_string_append_c (html, ' ');
+ g_string_append (html, " ");
space_seen = FALSE;
}
/* if we hit the signature marker "-- ", we return -(indent + 1). This
* stops reformatting.
*/
- if (strcmp (l, "-- ") == 0) {
+ if (strcmp (l, MODEST_TEXT_UTILS_SIGNATURE_MARKER) == 0) {
return -1 - indent;
} else {
return indent;
q = g_string_new ("");
if (signature != NULL) {
- q = g_string_append (q, "\n--\n");
+ g_string_append_printf (q, "\n%s\n", MODEST_TEXT_UTILS_SIGNATURE_MARKER);
q = g_string_append (q, signature);
}
GString *quoted_text;
g_string_append (result_string, "<pre>\n");
if (signature) {
- quote_html_add_to_gstring (result_string, SIGNATURE_MARKER);
+ quote_html_add_to_gstring (result_string, MODEST_TEXT_UTILS_SIGNATURE_MARKER);
quote_html_add_to_gstring (result_string, signature);
}
quote_html_add_to_gstring (result_string, cite);
}
+gchar *
+modest_text_utils_get_display_addresses (const gchar *recipients)
+{
+ gchar *addresses;
+ GSList *recipient_list;
+
+ addresses = NULL;
+ recipient_list = modest_text_utils_split_addresses_list (recipients);
+ if (recipient_list) {
+ GString *add_string = g_string_sized_new (strlen (recipients));
+ GSList *iter = recipient_list;
+ gboolean first = TRUE;
+
+ while (iter) {
+ /* Strings are changed in place */
+ modest_text_utils_get_display_address ((gchar *) iter->data);
+ if (G_UNLIKELY (first)) {
+ g_string_append_printf (add_string, "%s", (gchar *) iter->data);
+ first = FALSE;
+ } else {
+ g_string_append_printf (add_string, ", %s", (gchar *) iter->data);
+ }
+ iter = g_slist_next (iter);
+ }
+ g_slist_foreach (recipient_list, (GFunc) g_free, NULL);
+ g_slist_free (recipient_list);
+ addresses = g_string_free (add_string, FALSE);
+ }
+ return addresses;
+}
gchar *
else if (KB <= size && size < 100 * KB)
return g_strdup_printf (_FM("sfil_li_size_1kb_99kb"), (int) size / KB);
else if (100*KB <= size && size < MB)
- return g_strdup_printf (_FM("sfil_li_size_100kb_1mb"), (float) size / MB);
+ return g_strdup_printf (_FM("sfil_li_size_100kb_1mb"), (int) size / KB);
else if (MB <= size && size < 10*MB)
return g_strdup_printf (_FM("sfil_li_size_1mb_10mb"), (float) size / MB);
else if (10*MB <= size && size < GB)
- return g_strdup_printf (_FM("sfil_li_size_10mb_1gb"), (int) size / MB);
+ return g_strdup_printf (_FM("sfil_li_size_10mb_1gb"), (float) size / MB);
else
return g_strdup_printf (_FM("sfil_li_size_1gb_or_greater"), (float) size / GB);
}
for (node = addresses; node != NULL; node = g_slist_next (node)) {
const gchar *address = (const gchar *) node->data;
gchar *left_limit, *right_limit;
+
left_limit = strstr (address, "<");
right_limit = g_strrstr (address, ">");
return g_string_free (result, FALSE);
}
+
+GSList *
+modest_text_utils_remove_duplicate_addresses_list (GSList *address_list)
+{
+ GSList *new_list, *iter;
+ GHashTable *table;
+
+ g_return_val_if_fail (address_list, NULL);
+
+ table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
+ new_list = address_list;
+ iter = address_list;
+ while (iter) {
+ const gchar* address = (const gchar*)iter->data;
+
+ /* We need only the email to just compare it and not
+ the full address which would make "a <a@a.com>"
+ different from "a@a.com" */
+ const gchar *email = get_email_from_address (address);
+
+ /* ignore the address if already seen */
+ if (g_hash_table_lookup (table, email) == 0) {
+ g_hash_table_insert (table, (gchar*)email, GINT_TO_POINTER(1));
+ iter = g_slist_next (iter);
+ } else {
+ GSList *tmp = g_slist_next (iter);
+ new_list = g_slist_delete_link (new_list, iter);
+ iter = tmp;
+ }
+ }
+
+ g_hash_table_unref (table);
+
+ return new_list;
+}
+
+gchar *
+modest_text_utils_get_secure_header (gchar *value,
+ const gchar *header)
+{
+ gchar *new_value = value;
+ gchar *needle = g_strrstr (value, header);
+
+ if (needle) {
+ gchar *tmp = value;
+ new_value = g_strdup (needle + strlen (header));
+ g_free (tmp);
+ }
+
+ return new_value;
+}