X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-text-utils.c;h=9d14bb1d8c3d73be83c3844264913a8f46d2aaaf;hp=de70fa40555a07657b5367edcbd59f7586d67bbd;hb=e1c901e81bcfe668994e305089af9c6367c6b74e;hpb=7ca6e9e5aff9996bac9eb8304d8255a9f00999a6 diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index de70fa4..9d14bb1 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -68,11 +68,18 @@ /* * we mark the ampersand with \007 when converting text->html * because after text->html we do hyperlink detecting, which - * could be screwed up by the ampersand + * could be screwed up by the ampersand. + * ie. 1<3 ==> 1\007lt;3 */ #define MARK_AMP '\007' #define MARK_AMP_STR "\007" +/* mark & separately, because they are parts of urls. + * ie. a&b => 1\008amp;b + */ +#define MARK_AMP_URI '\006' +#define MARK_AMP_URI_STR "\006" + /* * we need these regexps to find URLs in plain text e-mails @@ -91,14 +98,15 @@ struct _url_match_t { const gchar* prefix; }; +/* 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)://[-A-Za-z0-9_$.+!*(),;:@%&=?/~#]+[-A-Za-z0-9_$%&=?/~#]",\ + { "(file|rtsp|http|ftp|https)://[-a-z0-9_$.+!*(),;:@%=?/~#" MARK_AMP_URI_STR "]+[-a-z0-9_$%" MARK_AMP_URI_STR "=?/~#]",\ NULL, NULL },\ - { "www\\.[-a-z0-9.]+[-a-z0-9](:[0-9]*)?(/[-A-Za-z0-9_$.+!*(),;:@%&=?/~#]*[^]}\\),?!;:\"]?)?",\ + { "www\\.[-a-z0-9_$.+!*(),;:@%=?/~#" MARK_AMP_URI_STR "]+[-a-z0-9_$%" MARK_AMP_URI_STR "=?/~#]",\ NULL, "http://" }, \ - { "ftp\\.[-a-z0-9.]+[-a-z0-9](:[0-9]*)?(/[-A-Za-z0-9_$.+!*(),;:@%&=?/~#]*[^]}\\),?!;:\"]?)?",\ + { "ftp\\.[-a-z0-9_$.+!*(),;:@%=?/~#" MARK_AMP_URI_STR "]+[-a-z0-9_$%" MARK_AMP_URI_STR "=?/~#]",\ NULL, "ftp://" },\ - { "(voipto|callto|chatto|jabberto|xmpp):[-_a-z@0-9.\\+]+", \ + { "(voipto|callto|chatto|jabberto|xmpp):[-_a-z@0-9.+]+", \ NULL, NULL}, \ { "mailto:[-_a-z0-9.\\+]+@[-_a-z0-9.]+", \ NULL, NULL},\ @@ -398,13 +406,15 @@ modest_text_utils_convert_buffer_to_html_start (GString *html, const gchar *data switch (kar) { case 0: - case MARK_AMP: /* this is a temp place holder for '&'; we can only + case MARK_AMP: + case MARK_AMP_URI: + /* this is a temp place holder for '&'; we can only * set the real '&' after hyperlink translation, otherwise * we might screw that up */ break; /* ignore embedded \0s and MARK_AMP */ case '<' : g_string_append (html, MARK_AMP_STR "lt;"); break; case '>' : g_string_append (html, MARK_AMP_STR "gt;"); break; - case '&' : g_string_append (html, MARK_AMP_STR "amp;"); break; + case '&' : g_string_append (html, MARK_AMP_URI_STR "amp;"); break; /* special case */ case '"' : g_string_append (html, MARK_AMP_STR "quot;"); break; /* don't convert ' --> wpeditor will try to re-convert it... */ @@ -433,7 +443,7 @@ modest_text_utils_convert_buffer_to_html_finish (GString *html) int i; /* replace all our MARK_AMPs with real ones */ for (i = 0; i != html->len; ++i) - if ((html->str)[i] == MARK_AMP) + if ((html->str)[i] == MARK_AMP || (html->str)[i] == MARK_AMP_URI) (html->str)[i] = '&'; } @@ -552,53 +562,6 @@ modest_text_utils_get_addresses_indexes (const gchar *addresses, GSList **start_ return; } -#if 0 -GSList * -modest_text_utils_split_addresses_list (const gchar *addresses) -{ - gchar *current, *start, *last_blank; - GSList *result = NULL; - - start = (gchar *) addresses; - current = start; - last_blank = start; - - while (*current != '\0') { - if ((start == current)&&((*current == ' ')||(*current == ',')||(*current == ';'))) { - start = g_utf8_next_char (start); - last_blank = current; - } else if ((*current == ',')||(*current == ';')) { - gchar *new_address = NULL; - new_address = g_strndup (start, current - last_blank); - result = g_slist_prepend (result, new_address); - start = g_utf8_next_char (current); - last_blank = start; - } else if (*current == '\"') { - if (current == start) { - current = g_utf8_next_char (current); - start = g_utf8_next_char (start); - } - while ((*current != '\"')&&(*current != '\0')) - current = g_utf8_next_char (current); - } - - current = g_utf8_next_char (current); - } - - if (start != current) { - gchar *new_address = NULL; - new_address = g_strndup (start, current - last_blank); - result = g_slist_prepend (result, new_address); - } - - result = g_slist_reverse (result); - return result; - -} -#endif - - - GSList * modest_text_utils_split_addresses_list (const gchar *addresses) @@ -973,8 +936,11 @@ compile_patterns () 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); + if (regcomp (patterns[i].preg, patterns[i].regex, + REG_ICASE|REG_EXTENDED|REG_NEWLINE) != 0) { + g_warning ("%s: error in regexp:\n%s\n", __FUNCTION__, patterns[i].regex); + return FALSE; + } } return TRUE; } @@ -1071,6 +1037,29 @@ get_url_matches (GString *txt) +/* replace all occurences of needle in haystack with repl*/ +static gchar* +replace_string (const gchar *haystack, const gchar *needle, gchar repl) +{ + gchar *str, *cursor; + + if (!haystack || !needle || strlen(needle) == 0) + return haystack ? g_strdup(haystack) : NULL; + + str = g_strdup (haystack); + + for (cursor = str; cursor && *cursor; ++cursor) { + if (g_str_has_prefix (cursor, needle)) { + cursor[0] = repl; + memmove (cursor + 1, + cursor + strlen (needle), + strlen (cursor + strlen (needle)) + 1); + } + } + + return str; +} + static void hyperlinkify_plain_text (GString *txt) { @@ -1084,10 +1073,17 @@ hyperlinkify_plain_text (GString *txt) gchar *url = g_strndup (txt->str + match->offset, match->len); gchar *repl = NULL; /* replacement */ + /* the string still contains $(MARK_AMP_URI_STR)"amp;" for each + * '&' in the original, because of the text->html conversion. + * in the href-URL (and only there), we must convert that back to + * '&' + */ + gchar *href_url = replace_string (url, MARK_AMP_URI_STR "amp;", '&'); + /* the prefix is NULL: use the one that is already there */ repl = g_strdup_printf ("%s", match->prefix ? match->prefix : EMPTY_STRING, - url, url); + href_url, url); /* replace the old thing with our hyperlink * replacement thing */ @@ -1096,6 +1092,7 @@ hyperlinkify_plain_text (GString *txt) g_free (url); g_free (repl); + g_free (href_url); g_slice_free (url_match_t, match); }