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);
}
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 != ' ') {
"</head>"
"<body>");
- modest_text_utils_convert_buffer_to_html (html, data);
+ modest_text_utils_convert_buffer_to_html (html, data, -1);
g_string_append (html, "</body></html>");
}
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);
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;
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)) {
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);
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)
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;
}
}
- 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
}
-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)
{