modest_text_utils_strftime(char *s, gsize max, const char *fmt, time_t timet)
{
struct tm tm;
-/* static GDate date; */
/* 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);
}
return result;
}
+
gchar*
modest_text_utils_convert_to_html (const gchar *data)
{
guint i;
- gboolean first_space = TRUE;
+ gboolean space_seen = FALSE;
GString *html;
gsize len;
-
+
if (!data)
return NULL;
len = strlen (data);
- html = g_string_sized_new (len + 100); /* just a guess... */
-
+ 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\">"
+ "<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);
}
}
return g_string_free (html, FALSE);
}
+
GSList *
modest_text_utils_split_addresses_list (const gchar *addresses)
{