X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=b0f547ddb908cc48ddc85f726be2b3e81fd7b084;hp=6b3709ccee5fcea20fc242e299f7a7a4c68f6bd5;hb=a0b97bdb5b2391619437f8ef3c9bae321a1227dd;hpb=51ee3dbf9a9338a7683fb2efe9daeefb316849bd diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 6b3709c..b0f547d 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -188,7 +188,7 @@ modest_text_utils_cite (const gchar *text, retval = g_strdup (""); else if (strcmp(content_type, "text/html") == 0) { tmp_sig = g_strconcat ("\n", signature, NULL); - retval = modest_text_utils_convert_to_html_body(tmp_sig); + retval = modest_text_utils_convert_to_html_body(tmp_sig, -1, TRUE); g_free (tmp_sig); } else { retval = g_strconcat (text, "\n", signature, NULL); @@ -321,17 +321,17 @@ modest_text_utils_remove_address (const gchar *address_list, const gchar *addres } static void -modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data) +modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data, gssize n) { guint i; gboolean space_seen = FALSE; - gsize len; guint break_dist = 0; /* distance since last break point */ - len = strlen (data); + if (n == -1) + n = strlen (data); /* replace with special html chars where needed*/ - for (i = 0; i != len; ++i) { + for (i = 0; i != n; ++i) { char kar = data[i]; if (space_seen && kar != ' ') { @@ -391,7 +391,7 @@ modest_text_utils_convert_to_html (const gchar *data) "" ""); - modest_text_utils_convert_buffer_to_html (html, data); + modest_text_utils_convert_buffer_to_html (html, data, -1); g_string_append (html, ""); @@ -402,20 +402,20 @@ modest_text_utils_convert_to_html (const gchar *data) } gchar * -modest_text_utils_convert_to_html_body (const gchar *data) +modest_text_utils_convert_to_html_body (const gchar *data, gssize n, gboolean hyperlinkify) { GString *html; - gsize len; if (!data) return NULL; - len = strlen (data); - html = g_string_sized_new (1.5 * len); /* just a guess... */ + if (n == -1) + n = strlen (data); + html = g_string_sized_new (1.5 * n); /* just a guess... */ - modest_text_utils_convert_buffer_to_html (html, data); + modest_text_utils_convert_buffer_to_html (html, data, n); - if (len < HYPERLINKIFY_MAX_LENGTH) + if (hyperlinkify && (n < HYPERLINKIFY_MAX_LENGTH)) hyperlinkify_plain_text (html); return g_string_free (html, FALSE); @@ -524,9 +524,9 @@ modest_text_utils_split_addresses_list (const gchar *addresses) void modest_text_utils_address_range_at_position (const gchar *recipients_list, - gint position, - gint *start, - gint *end) + guint position, + guint *start, + guint *end) { gchar *current = NULL; gint range_start = 0; @@ -534,8 +534,12 @@ modest_text_utils_address_range_at_position (const gchar *recipients_list, gint index; gboolean is_quoted = FALSE; + g_return_if_fail (recipients_list); + g_return_if_fail (position < g_utf8_strlen(recipients_list, -1)); + index = 0; - for (current = (gchar *) recipients_list; *current != '\0'; current = g_utf8_find_next_char (current, NULL)) { + for (current = (gchar *) recipients_list; *current != '\0'; + current = g_utf8_find_next_char (current, NULL)) { gunichar c = g_utf8_get_char (current); if ((c == ',') && (!is_quoted)) { @@ -823,12 +827,12 @@ modest_text_utils_quote_html (const gchar *text, if (signature == NULL) signature_result = g_strdup (""); else - signature_result = modest_text_utils_convert_to_html_body (signature); + signature_result = modest_text_utils_convert_to_html_body (signature, -1, TRUE); attachments_string = quoted_attachments (attachments); - q_attachments_string = modest_text_utils_convert_to_html_body (attachments_string); - q_cite = modest_text_utils_convert_to_html_body (cite); - html_text = modest_text_utils_convert_to_html_body (text); + q_attachments_string = modest_text_utils_convert_to_html_body (attachments_string, -1, TRUE); + q_cite = modest_text_utils_convert_to_html_body (cite, -1, TRUE); + html_text = modest_text_utils_convert_to_html_body (text, -1, TRUE); result = g_strdup_printf (format, signature_result, q_cite, html_text, q_attachments_string); g_free (q_cite); g_free (html_text); @@ -845,6 +849,52 @@ 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 url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS; + + +static gboolean +compile_patterns () +{ + guint i; + const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t); + for (i = 0; i != pattern_num; ++i) { + patterns[i].preg = g_slice_new0 (regex_t); + + /* this should not happen */ + g_return_val_if_fail (regcomp (patterns[i].preg, patterns[i].regex, + REG_ICASE|REG_EXTENDED|REG_NEWLINE) == 0, FALSE); + } + return TRUE; +} + +static void +free_patterns () +{ + guint i; + const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t); + for (i = 0; i != pattern_num; ++i) { + regfree (patterns[i].preg); + g_slice_free (regex_t, patterns[i].preg); + } /* don't free patterns itself -- it's static */ +} + +void +modest_text_utils_hyperlinkify_begin (void) +{ + if (url_matches_block == 0) + compile_patterns (); + url_matches_block ++; +} + +void +modest_text_utils_hyperlinkify_end (void) +{ + url_matches_block--; + if (url_matches_block <= 0) + free_patterns (); +} + static GSList* get_url_matches (GString *txt) @@ -853,17 +903,11 @@ get_url_matches (GString *txt) guint rv, i, offset = 0; GSList *match_list = NULL; - static url_match_pattern_t patterns[] = MAIL_VIEWER_URL_MATCH_PATTERNS; const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t); /* initalize the regexps */ - for (i = 0; i != pattern_num; ++i) { - patterns[i].preg = g_slice_new0 (regex_t); + modest_text_utils_hyperlinkify_begin (); - /* this should not happen */ - g_return_val_if_fail (regcomp (patterns[i].preg, patterns[i].regex, - REG_ICASE|REG_EXTENDED|REG_NEWLINE) == 0, NULL); - } /* find all the matches */ for (i = 0; i != pattern_num; ++i) { offset = 0; @@ -904,10 +948,7 @@ get_url_matches (GString *txt) } } - for (i = 0; i != pattern_num; ++i) { - regfree (patterns[i].preg); - g_slice_free (regex_t, patterns[i].preg); - } /* don't free patterns itself -- it's static */ + modest_text_utils_hyperlinkify_end (); /* now sort the list, so the matches are in reverse order of occurence. * that way, we can do the replacements starting from the end, so we don't need @@ -1061,38 +1102,30 @@ modest_text_utils_utf8_strcmp (const gchar* s1, const gchar *s2, gboolean insens } -gchar* +const gchar* modest_text_utils_get_display_date (time_t date) { - time_t now; - static const guint BUF_SIZE = 64; - static const guint ONE_DAY = 24 * 60 * 60; /* seconds in one day */ - gchar date_buf[BUF_SIZE]; - gchar today_buf [BUF_SIZE]; - - modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date); +#define DATE_BUF_SIZE 64 + static gchar date_buf[DATE_BUF_SIZE]; + + /* calculate the # of days since epoch for + * for today and for the date provided + * based on idea from pvanhoof */ + int day = time(NULL) / (24 * 60 * 60); + int date_day = date / (24 * 60 * 60); - now = time (NULL); + /* if it's today, show the time, if it's not today, show the date instead */ - /* we check if the date is within the last 24h, if not, we don't - * have to do the extra, expensive strftime, which was very visible - * in the profiles. - */ - if (abs(now - date) < ONE_DAY) { - - /* it's within the last 24 hours, but double check */ - /* use the localized dates */ - modest_text_utils_strftime (today_buf, BUF_SIZE, "%x", now); + 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); - /* if it's today, use the time instead */ - if (strcmp (date_buf, today_buf) == 0) - modest_text_utils_strftime (date_buf, BUF_SIZE, "%X", date); - } - - return g_strdup(date_buf); + return date_buf; /* this is a static buffer, don't free! */ } + gboolean modest_text_utils_validate_folder_name (const gchar *folder_name) {