From: Jose Dapena Paz Date: Wed, 4 Jun 2008 15:55:38 +0000 (+0000) Subject: * src/modest-text-utils.[ch]: X-Git-Tag: git_migration_finished~1323 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=b82646213f0d683e64a8a3b115d69fb0d243cd2e;ds=sidebyside * src/modest-text-utils.[ch]: * Added a method to convert uris to hyperlinks con html messages as created in wpeditor. * src/maemo/modest-msg-edit-window.c: * Now we also hyperlinkify the messages in rich text for storing or sending (fixes NB#86186). pmo-trunk-r4608 --- diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index dc93da1..96eb886 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -1586,6 +1586,8 @@ get_formatted_data (ModestMsgEditWindow *edit_window) wp_text_buffer_save_document (WP_TEXT_BUFFER(priv->text_buffer), get_formatted_data_cb, &string_buffer); + modest_text_utils_hyperlinkify (string_buffer); + gtk_text_buffer_set_modified (priv->text_buffer, TRUE); return g_string_free (string_buffer, FALSE); diff --git a/src/modest-text-utils.c b/src/modest-text-utils.c index 012ac59..8deb5cc 100644 --- a/src/modest-text-utils.c +++ b/src/modest-text-utils.c @@ -139,9 +139,9 @@ const guint USER_NAME_FORBIDDEN_CHARS_LENGTH = G_N_ELEMENTS (user_name_forbidden /* private */ static gchar* cite (const time_t sent_date, const gchar *from); -static void hyperlinkify_plain_text (GString *txt); +static void hyperlinkify_plain_text (GString *txt, gint offset); static gint cmp_offsets_reverse (const url_match_t *match1, const url_match_t *match2); -static GSList* get_url_matches (GString *txt); +static GSList* get_url_matches (GString *txt, gint offset); static GString* get_next_line (const char *b, const gsize blen, const gchar * iter); static int get_indent_level (const char *l); @@ -491,7 +491,7 @@ modest_text_utils_convert_to_html (const gchar *data) g_string_append (html, ""); if (len <= HYPERLINKIFY_MAX_LENGTH) - hyperlinkify_plain_text (html); + hyperlinkify_plain_text (html, 0); modest_text_utils_convert_buffer_to_html_finish (html); @@ -515,7 +515,7 @@ modest_text_utils_convert_to_html_body (const gchar *data, gssize n, gboolean hy modest_text_utils_convert_buffer_to_html_start (html, data, n); if (hyperlinkify && (n < HYPERLINKIFY_MAX_LENGTH)) - hyperlinkify_plain_text (html); + hyperlinkify_plain_text (html, 0); modest_text_utils_convert_buffer_to_html_finish (html); @@ -1018,10 +1018,10 @@ modest_text_utils_hyperlinkify_end (void) static GSList* -get_url_matches (GString *txt) +get_url_matches (GString *txt, gint offset) { regmatch_t rm; - guint rv, i, offset = 0; + guint rv, i, tmp_offset = 0; GSList *match_list = NULL; const size_t pattern_num = sizeof(patterns)/sizeof(url_match_pattern_t); @@ -1031,13 +1031,13 @@ get_url_matches (GString *txt) /* find all the matches */ for (i = 0; i != pattern_num; ++i) { - offset = 0; + tmp_offset = offset; while (1) { url_match_t *match; gboolean is_submatch; GSList *cursor; - if ((rv = regexec (patterns[i].preg, txt->str + offset, 1, &rm, 0)) != 0) { + if ((rv = regexec (patterns[i].preg, txt->str + tmp_offset, 1, &rm, 0)) != 0) { g_return_val_if_fail (rv == REG_NOMATCH, NULL); /* this should not happen */ break; /* try next regexp */ } @@ -1050,7 +1050,7 @@ get_url_matches (GString *txt) while (cursor && !is_submatch) { const url_match_t *old_match = (const url_match_t *) cursor->data; - guint new_offset = offset + rm.rm_so; + guint new_offset = tmp_offset + rm.rm_so; is_submatch = (new_offset > old_match->offset && new_offset < old_match->offset + old_match->len); cursor = g_slist_next (cursor); @@ -1059,12 +1059,12 @@ get_url_matches (GString *txt) if (!is_submatch) { /* make a list of our matches ( tupels)*/ match = g_slice_new (url_match_t); - match->offset = offset + rm.rm_so; + match->offset = tmp_offset + rm.rm_so; match->len = rm.rm_eo - rm.rm_so; match->prefix = patterns[i].prefix; match_list = g_slist_prepend (match_list, match); } - offset += rm.rm_eo; + tmp_offset += rm.rm_eo; } } @@ -1105,10 +1105,10 @@ replace_string (const gchar *haystack, const gchar *needle, gchar repl) } static void -hyperlinkify_plain_text (GString *txt) +hyperlinkify_plain_text (GString *txt, gint offset) { GSList *cursor; - GSList *match_list = get_url_matches (txt); + GSList *match_list = get_url_matches (txt, offset); /* we will work backwards, so the offsets stay valid */ for (cursor = match_list; cursor; cursor = cursor->next) { @@ -1144,6 +1144,18 @@ hyperlinkify_plain_text (GString *txt) g_slist_free (match_list); } +void +modest_text_utils_hyperlinkify (GString *string_buffer) +{ + gchar *after_body; + gint offset = 0; + + after_body = strstr (string_buffer->str, ""); + if (after_body != NULL) + offset = after_body - string_buffer->str; + hyperlinkify_plain_text (string_buffer, offset); +} + /* for optimization reasons, we change the string in-place */ void diff --git a/src/modest-text-utils.h b/src/modest-text-utils.h index b2e56ea..e9f98c9 100644 --- a/src/modest-text-utils.h +++ b/src/modest-text-utils.h @@ -221,7 +221,14 @@ gchar* modest_text_utils_convert_to_html_body (const gchar *data, gssize n, gbo */ size_t modest_text_utils_strftime(char *s, size_t max, const char *fmt, time_t timet); - +/** + * modest_text_utils_hyperlinkify: + * @string_buffer: buffer where we replace uri strings with links + * + * Replace uri's with links in the buffer. This is required that the document + * do not contain linkified links already. + */ +void modest_text_utils_hyperlinkify (GString *string_buffer); /** * modest_text_utils_get_display_address: