Fixes NB#118220, properly hyperlinkify URL's. We were not parsing "&" and "?" charact...
[modest] / src / modest-text-utils.c
index 614db37..7a89d08 100644 (file)
@@ -109,8 +109,8 @@ struct _url_match_t {
 
 /* 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  {                              \
-       { "(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://" },                              \
@@ -286,6 +286,8 @@ modest_text_utils_strftime(char *s, gsize max, const char *fmt, time_t timet)
           garbage in the s variable */
        if (s)
                s[0] = '\0';
+       else
+               return 0;
 
        /* does not work on old maemo glib: 
         *   g_date_set_time_t (&date, timet);
@@ -1016,7 +1018,7 @@ modest_text_utils_quote_html (const gchar *text,
                }
                quote_html_add_to_gstring (result_string, cite);
                quoted_text = g_string_new ("");
-               quoted_text = modest_text_utils_quote_body (quoted_text, text, ">", limit);
+               quoted_text = modest_text_utils_quote_body (quoted_text, (text) ? text : "", ">", limit);
                quote_html_add_to_gstring (result_string, quoted_text->str);
                g_string_free (quoted_text, TRUE);
                if (attachments) {
@@ -1040,6 +1042,7 @@ cmp_offsets_reverse (const url_match_t *match1, const url_match_t *match2)
 
 static gint url_matches_block = 0;
 static url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS;
+static GMutex *url_patterns_mutex = NULL;
 
 
 static gboolean
@@ -1074,17 +1077,25 @@ free_patterns ()
 void
 modest_text_utils_hyperlinkify_begin (void)
 {
+
+       if (url_patterns_mutex == NULL) {
+               url_patterns_mutex = g_mutex_new ();
+       }
+       g_mutex_lock (url_patterns_mutex);
        if (url_matches_block == 0)
                compile_patterns ();
        url_matches_block ++;
+       g_mutex_unlock (url_patterns_mutex);
 }
 
 void
 modest_text_utils_hyperlinkify_end (void)
 {
+       g_mutex_lock (url_patterns_mutex);
        url_matches_block--;
        if (url_matches_block <= 0)
                free_patterns ();
+       g_mutex_unlock (url_patterns_mutex);
 }
 
 
@@ -1392,10 +1403,17 @@ 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 */
+#ifdef MODEST_TOOLKIT_HILDON2
        if (day == date_day) /* is the date today? */
                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, _HL("wdgt_va_date"), date); 
+#else
+       if (day == date_day) /* is the date today? */
+               modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%X", date);
+       else 
+               modest_text_utils_strftime (date_buf, DATE_BUF_SIZE, "%x", date); 
+#endif
 
        return date_buf; /* this is a static buffer, don't free! */
 }
@@ -1826,6 +1844,17 @@ modest_text_utils_buffer_selection_is_valid (GtkTextBuffer *buffer)
        return result;
 }
 
+static void
+remove_quotes (gchar **quotes)
+{
+       if (g_str_has_prefix (*quotes, "\"") && g_str_has_suffix (*quotes, "\"")) {
+               gchar *result;
+               result = g_strndup ((*quotes)+1, strlen (*quotes) - 2);
+               g_free (*quotes);
+               *quotes = result;
+       }
+}
+
 gchar *
 modest_text_utils_escape_mnemonics (const gchar *text)
 {
@@ -1845,3 +1874,53 @@ modest_text_utils_escape_mnemonics (const gchar *text)
        
        return g_string_free (result, FALSE);
 }
+
+gchar *
+modest_text_utils_simplify_recipients (const gchar *recipients)
+{
+       GSList *addresses, *node;
+       GString *result;
+       gboolean is_first = TRUE;
+
+       if (recipients == NULL)
+               return g_strdup ("");
+
+       addresses = modest_text_utils_split_addresses_list (recipients);
+       result = g_string_new ("");
+
+       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, ">");
+
+               if (is_first)
+                       is_first = FALSE;
+               else
+                       result = g_string_append (result, ", ");
+
+               if ((left_limit == NULL)||(right_limit == NULL)|| (left_limit > right_limit)) {
+                       result = g_string_append (result, address);
+               } else {
+                       gchar *name_side;
+                       gchar *email_side;
+                       name_side = g_strndup (address, left_limit - address);
+                       name_side = g_strstrip (name_side);
+                       remove_quotes (&name_side);
+                       email_side = get_email_from_address (address);
+                       if (name_side && email_side && !strcmp (name_side, email_side)) {
+                               result = g_string_append (result, email_side);
+                       } else {
+                               result = g_string_append (result, address);
+                       }
+                       g_free (name_side);
+                       g_free (email_side);
+               }
+
+       }
+       g_slist_foreach (addresses, (GFunc)g_free, NULL);
+       g_slist_free (addresses);
+
+       return g_string_free (result, FALSE);
+
+}