]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-string-parser.c
factor out start_gnome_contacts()
[empathy.git] / libempathy-gtk / empathy-string-parser.c
index 27421eb59cfd586ba5f2882f1950861484e13e1a..03eaaef29adeb4218a2ccf486466eaa60f3ef7ee 100644 (file)
 
 #include "empathy-string-parser.h"
 #include "empathy-smiley-manager.h"
+#include "empathy-ui-utils.h"
 
 #define SCHEMES           "([a-zA-Z\\+]+)"
-#define INVALID_CHARS     "\\s\"'"
-#define INVALID_CHARS_EXT INVALID_CHARS "\\[\\]<>(){},;:?"
-#define BODY              "([^"INVALID_CHARS"]+)"
-#define BODY_END          "([^"INVALID_CHARS"]*)[^"INVALID_CHARS_EXT".]"
-#define BODY_STRICT       "([^"INVALID_CHARS_EXT"]+)"
+#define INVALID_CHARS     "\\s\"<>"
+#define INVALID_CHARS_EXT INVALID_CHARS "\\[\\](){},;:"
+#define INVALID_CHARS_FULL INVALID_CHARS_EXT "?'"
+#define BODY              "([^"INVALID_CHARS_FULL"])([^"INVALID_CHARS_EXT"]*)"
+#define BODY_END          "([^"INVALID_CHARS"]*)[^"INVALID_CHARS_FULL".]"
 #define URI_REGEX         "("SCHEMES"://"BODY_END")" \
                          "|((www|ftp)\\."BODY_END")" \
-                         "|((mailto:)?"BODY_STRICT"@"BODY"\\."BODY_END")"
+                         "|((mailto:)?"BODY"@"BODY"\\."BODY_END")"
 
 static GRegex *
 uri_regex_dup_singleton (void)
@@ -42,7 +43,14 @@ uri_regex_dup_singleton (void)
 
        /* We intentionally leak the regex so it's not recomputed */
        if (!uri_regex) {
-               uri_regex = g_regex_new (URI_REGEX, 0, 0, NULL);
+               GError *error = NULL;
+
+               uri_regex = g_regex_new (URI_REGEX, 0, 0, &error);
+               if (uri_regex == NULL) {
+                       g_warning ("Failed to create reg exp: %s", error->message);
+                       g_error_free (error);
+                       return NULL;
+               }
        }
 
        return g_regex_ref (uri_regex);
@@ -74,6 +82,11 @@ empathy_string_match_link (const gchar *text,
        gint        last = 0;
 
        uri_regex = uri_regex_dup_singleton ();
+       if (uri_regex == NULL) {
+               empathy_string_parser_substr (text, len, sub_parsers, user_data);
+               return;
+       }
+
        match = g_regex_match_full (uri_regex, text, len, 0, 0, &match_info, NULL);
        if (match) {
                gint s = 0, e = 0;
@@ -152,3 +165,77 @@ empathy_string_match_all (const gchar *text,
        replace_func (text, len, NULL, user_data);
 }
 
+void
+empathy_string_replace_link (const gchar *text,
+                             gssize len,
+                             gpointer match_data,
+                             gpointer user_data)
+{
+       GString *string = user_data;
+       gchar *real_url;
+       gchar *title;
+       gchar *markup;
+
+       real_url = empathy_make_absolute_url_len (text, len);
+
+       /* Need to copy manually, because g_markup_printf_escaped does not work
+        * with string precision pitfalls. */
+       title = g_strndup (text, len);
+
+       /* Append the link inside <a href=""></a> tag */
+       markup = g_markup_printf_escaped ("<a href=\"%s\">%s</a>",
+                       real_url, title);
+
+       g_string_append (string, markup);
+
+       g_free (real_url);
+       g_free (title);
+       g_free (markup);
+}
+
+void
+empathy_string_replace_escaped (const gchar *text,
+                               gssize len,
+                               gpointer match_data,
+                               gpointer user_data)
+{
+       GString *string = user_data;
+       gchar *escaped;
+       guint i;
+       gsize escaped_len, old_len;
+
+       escaped = g_markup_escape_text (text, len);
+       escaped_len = strlen (escaped);
+
+       /* Allocate more space to string (we really need a g_string_extend...) */
+       old_len = string->len;
+       g_string_set_size (string, old_len + escaped_len);
+       g_string_truncate (string, old_len);
+
+       /* Remove '\r' */
+       for (i = 0; i < escaped_len; i++) {
+               if (escaped[i] != '\r')
+                       g_string_append_c (string, escaped[i]);
+       }
+
+       g_free (escaped);
+}
+
+gchar *
+empathy_add_link_markup (const gchar *text)
+{
+       EmpathyStringParser parsers[] = {
+               {empathy_string_match_link, empathy_string_replace_link},
+               {empathy_string_match_all, empathy_string_replace_escaped},
+               {NULL, NULL}
+       };
+       GString *string;
+
+       g_return_val_if_fail (text != NULL, NULL);
+
+       string = g_string_sized_new (strlen (text));
+       empathy_string_parser_substr (text, -1, parsers, string);
+
+       return g_string_free (string, FALSE);
+}
+