gchar *
modest_text_utils_quote (const gchar *text,
const gchar *content_type,
+ const gchar *signature,
const gchar *from,
const time_t sent_date,
int limit)
gchar *
modest_text_utils_cite (const gchar *text,
const gchar *content_type,
+ const gchar *signature,
const gchar *from,
time_t sent_date)
{
gchar *tmp, *retval;
+ gchar *tmp_sig;
g_return_val_if_fail (text, NULL);
g_return_val_if_fail (content_type, NULL);
+ if (!signature)
+ tmp_sig = g_strdup ("");
+ else if (!strcmp(content_type, "text/html")) {
+ tmp_sig = modest_text_utils_convert_to_html_body(signature);
+ } else {
+ tmp_sig = g_strdup (signature);
+ }
+
tmp = cite (sent_date, from);
- retval = g_strdup_printf ("%s%s\n", tmp, text);
+ retval = g_strdup_printf ("%s%s%s\n", tmp_sig, tmp, text);
+ g_free (tmp_sig);
g_free (tmp);
return retval;
gchar *
modest_text_utils_inline (const gchar *text,
const gchar *content_type,
+ const gchar *signature,
const gchar *from,
time_t sent_date,
const gchar *to,
const gchar *subject)
{
gchar sent_str[101];
- const gchar *plain_format = "%s\n%s %s\n%s %s\n%s %s\n%s %s\n\n%s";
+ gchar *formatted_signature;
+ const gchar *plain_format = "%s%s\n%s %s\n%s %s\n%s %s\n%s %s\n\n%s";
const gchar *html_format = \
- "%s<br>\n<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"2\">\n" \
+ "%s%s<br>\n<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"2\">\n" \
"<tr><td>%s</td><td>%s</td></tr>\n" \
"<tr><td>%s</td><td>%s</td></tr>\n" \
"<tr><td>%s</td><td>%s</td></tr>\n" \
else
format = plain_format;
- return g_strdup_printf (format,
+ if (signature != NULL) {
+ if (!strcmp (content_type, "text/html")) {
+ formatted_signature = g_strconcat (signature, "<br/>", NULL);
+ } else {
+ formatted_signature = g_strconcat (signature, "\n");
+ }
+ } else {
+ formatted_signature = "";
+ }
+
+ return g_strdup_printf (format, formatted_signature,
FORWARD_STRING,
FROM_STRING, (from) ? from : EMPTY_STRING,
SENT_STRING, sent_str,
gsize
modest_text_utils_strftime(char *s, gsize max, const char *fmt, time_t timet)
{
- static GDate date;
+ struct tm tm;
/* does not work on old maemo glib:
* g_date_set_time_t (&date, timet);
*/
- g_date_set_time (&date, (GTime) timet);
+ localtime_r (&timet, &tm);
- return g_date_strftime (s, max, fmt, (const GDate*) &date);
+ return strftime(s, max, fmt, &tm);
}
gchar *
return result;
}
-gchar*
-modest_text_utils_convert_to_html (const gchar *data)
+static void
+modest_text_utils_convert_buffer_to_html (GString *html, const gchar *data)
{
guint i;
- gboolean first_space = TRUE;
- GString *html;
+ gboolean space_seen = FALSE;
gsize len;
- if (!data)
- return NULL;
-
len = strlen (data);
- html = g_string_sized_new (len + 100); /* just a guess... */
-
- g_string_append_printf (html,
- "<html>"
- "<head>"
- "<meta http-equiv=\"content-type\""
- " content=\"text/html; charset=utf8\">"
- "</head>"
- "<body><tt>");
-
+
/* replace with special html chars where needed*/
for (i = 0; i != len; ++i) {
- char kar = data[i];
+ char kar = data[i];
+
+ if (space_seen && kar != ' ') {
+ g_string_append_c (html, ' ');
+ space_seen = FALSE;
+ }
+
switch (kar) {
-
case 0: break; /* ignore embedded \0s */
- case '<' : g_string_append (html, "<"); break;
- case '>' : g_string_append (html, ">"); break;
- case '&' : g_string_append (html, """); break;
- case '\n': g_string_append (html, "<br>\n"); break;
+ case '<' : g_string_append (html, "<"); break;
+ case '>' : g_string_append (html, ">"); break;
+ case '&' : g_string_append (html, "&"); break;
+ case '"' : g_string_append (html, """); break;
+ case '\'' : g_string_append (html, "'"); break;
+ case '\n' : g_string_append (html, "<br>\n"); break;
+ case '\t' : g_string_append (html, " "); break; /* note the space at the end*/
+ case ' ':
+ if (space_seen) { /* second space in a row */
+ g_string_append (html, "  ");
+ space_seen = FALSE;
+ } else
+ space_seen = TRUE;
+ break;
default:
- if (kar == ' ') {
- g_string_append (html, first_space ? " " : " ");
- first_space = FALSE;
- } else if (kar == '\t')
- g_string_append (html, " ");
- else {
- int charnum = 0;
- first_space = TRUE;
- /* optimization trick: accumulate 'normal' chars, then copy */
- do {
- kar = data [++charnum + i];
-
- } while ((i + charnum < len) &&
- (kar > '>' || (kar != '<' && kar != '>'
- && kar != '&' && kar != ' '
- && kar != '\n' && kar != '\t')));
- g_string_append_len (html, &data[i], charnum);
- i += (charnum - 1);
- }
+ g_string_append_c (html, kar);
}
}
+}
+
+gchar*
+modest_text_utils_convert_to_html (const gchar *data)
+{
+ GString *html;
+ gsize len;
+
+ if (!data)
+ return NULL;
+
+ len = strlen (data);
+ html = g_string_sized_new (1.5 * len); /* just a guess... */
+
+ g_string_append_printf (html,
+ "<html><head>"
+ "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf8\">"
+ "</head>"
+ "<body>");
+
+ modest_text_utils_convert_buffer_to_html (html, data);
+
+ g_string_append (html, "</body></html>");
+ hyperlinkify_plain_text (html);
+
+ return g_string_free (html, FALSE);
+}
+
+gchar *
+modest_text_utils_convert_to_html_body (const gchar *data)
+{
+ GString *html;
+ gsize len;
- g_string_append (html, "</tt></body></html>");
+ if (!data)
+ return NULL;
+
+ len = strlen (data);
+ html = g_string_sized_new (1.5 * len); /* just a guess... */
+
+ modest_text_utils_convert_buffer_to_html (html, data);
+
hyperlinkify_plain_text (html);
return g_string_free (html, FALSE);
}
+
GSList *
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)
+{
+ gchar *current = NULL;
+ gint range_start = 0;
+ gint range_end = 0;
+ gint index;
+ gboolean is_quoted = FALSE;
+
+ index = 0;
+ 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 (index < position) {
+ range_start = index + 1;
+ } else {
+ break;
+ }
+ } else if (c == '\"') {
+ is_quoted = !is_quoted;
+ } else if ((c == ' ') &&(range_start == index)) {
+ range_start ++;
+ }
+ index ++;
+ range_end = index;
+ }
+
+ if (start)
+ *start = range_start;
+ if (end)
+ *end = range_end;
+}
+
/* ******************************************************************* */
/* ************************* UTILIY FUNCTIONS ************************ */
now = time (NULL);
- modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date);
- modest_text_utils_strftime (now_buf, BUF_SIZE, "%x", now); /* today */
+ modest_text_utils_strftime (date_buf, BUF_SIZE, "%d/%m/%Y", date);
+ modest_text_utils_strftime (now_buf, BUF_SIZE, "%d/%m/%Y", now); /* today */
+/* modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date); */
+/* modest_text_utils_strftime (now_buf, BUF_SIZE, "%x", now); /\* today *\/ */
/* if this is today, get the time instead of the date */
if (strcmp (date_buf, now_buf) == 0)
- modest_text_utils_strftime (date_buf, BUF_SIZE, _("%X"), date);
+ modest_text_utils_strftime (date_buf, BUF_SIZE, "%H:%M %P", date);
return g_strdup(date_buf);
}
return (count >= 1) ? TRUE : FALSE;
}
+gboolean
+modest_text_utils_validate_recipient (const gchar *recipient)
+{
+ gchar *stripped;
+ gchar *right_part;
+ gint i = 0;
+ gboolean has_error = FALSE;
+
+ if (modest_text_utils_validate_email_address (recipient))
+ return TRUE;
+ stripped = g_strdup (recipient);
+ stripped = g_strstrip (stripped);
+
+ if (stripped[0] == '\0') {
+ g_free (stripped);
+ return FALSE;
+ }
+
+ /* quoted string */
+ if (stripped[0] == '\"') {
+ i = 1;
+ has_error = TRUE;
+ for (i = 1; stripped[i] != '\0'; i++) {
+ if (stripped[i] == '\\') {
+ if (stripped[i+1] >=0) {
+ i++;
+ } else {
+ has_error = TRUE;
+ break;
+ }
+ } else if (stripped[i] == '\"') {
+ has_error = FALSE;
+ break;
+ }
+ }
+ } else {
+ has_error = TRUE;
+ for (i = 0; stripped[i] != '\0'; i++) {
+ if (stripped[i] == ' ') {
+ has_error = FALSE;
+ break;
+ }
+ }
+ }
+
+ if (has_error) {
+ g_free (stripped);
+ return FALSE;
+ }
+ right_part = g_strdup (stripped + i);
+ g_free (stripped);
+ right_part = g_strstrip (right_part);
+ if (g_str_has_prefix (right_part, "<") &&
+ g_str_has_suffix (right_part, ">")) {
+ gchar *address;
+ gboolean valid;
+
+ address = g_strndup (right_part+1, strlen (right_part) - 2);
+ g_free (right_part);
+ valid = modest_text_utils_validate_email_address (address);
+ g_free (address);
+ return valid;
+ } else {
+ g_free (right_part);
+ return FALSE;
+ }
+}
gchar *