aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy-gtk')
-rw-r--r--libempathy-gtk/Makefile.am2
-rw-r--r--libempathy-gtk/empathy-chat-text-view.c1
-rw-r--r--libempathy-gtk/empathy-string-parser.c131
-rw-r--r--libempathy-gtk/empathy-string-parser.h74
-rw-r--r--libempathy-gtk/empathy-theme-adium.c1
-rw-r--r--libempathy-gtk/empathy-ui-utils.c104
-rw-r--r--libempathy-gtk/empathy-ui-utils.h45
7 files changed, 209 insertions, 149 deletions
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index c9736ac43..6ec319e1c 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -65,6 +65,7 @@ libempathy_gtk_handwritten_source = \
empathy-sound.c \
empathy-spell.c \
empathy-status-preset-dialog.c \
+ empathy-string-parser.c \
empathy-theme-boxes.c \
empathy-theme-irc.c \
empathy-theme-manager.c \
@@ -111,6 +112,7 @@ libempathy_gtk_headers = \
empathy-sound.h \
empathy-spell.h \
empathy-status-preset-dialog.h \
+ empathy-string-parser.h \
empathy-theme-boxes.h \
empathy-theme-irc.h \
empathy-theme-manager.h \
diff --git a/libempathy-gtk/empathy-chat-text-view.c b/libempathy-gtk/empathy-chat-text-view.c
index 07f8f6cb9..7f16ab9a3 100644
--- a/libempathy-gtk/empathy-chat-text-view.c
+++ b/libempathy-gtk/empathy-chat-text-view.c
@@ -42,6 +42,7 @@
#include "empathy-conf.h"
#include "empathy-ui-utils.h"
#include "empathy-smiley-manager.h"
+#include "empathy-string-parser.h"
#define DEBUG_FLAG EMPATHY_DEBUG_CHAT
#include <libempathy/empathy-debug.h>
diff --git a/libempathy-gtk/empathy-string-parser.c b/libempathy-gtk/empathy-string-parser.c
new file mode 100644
index 000000000..9d0163e8e
--- /dev/null
+++ b/libempathy-gtk/empathy-string-parser.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2010 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Xavier Claessens <xclaesse@gmail.com>
+ */
+
+#include <config.h>
+
+#include <string.h>
+
+#include "empathy-string-parser.h"
+#include "empathy-smiley-manager.h"
+
+void
+empathy_string_parser_substr (const gchar *text,
+ gssize len,
+ EmpathyStringParser *parsers,
+ gpointer user_data)
+{
+ if (parsers != NULL && parsers[0].match_func != NULL) {
+ parsers[0].match_func (text, len,
+ parsers[0].replace_func, parsers + 1,
+ user_data);
+ }
+}
+
+void
+empathy_string_match_link (const gchar *text,
+ gssize len,
+ EmpathyStringReplace replace_func,
+ EmpathyStringParser *sub_parsers,
+ gpointer user_data)
+{
+ GRegex *uri_regex;
+ GMatchInfo *match_info;
+ gboolean match;
+ gint last = 0;
+
+ uri_regex = empathy_uri_regex_dup_singleton ();
+ match = g_regex_match_full (uri_regex, text, len, 0, 0, &match_info, NULL);
+ if (match) {
+ gint s = 0, e = 0;
+
+ do {
+ g_match_info_fetch_pos (match_info, 0, &s, &e);
+
+ if (s > last) {
+ /* Append the text between last link (or the
+ * start of the message) and this link */
+ empathy_string_parser_substr (text + last,
+ s - last,
+ sub_parsers,
+ user_data);
+ }
+
+ replace_func (text + s, e - s, NULL, user_data);
+
+ last = e;
+ } while (g_match_info_next (match_info, NULL));
+ }
+
+ empathy_string_parser_substr (text + last, len - last,
+ sub_parsers, user_data);
+
+ g_match_info_free (match_info);
+ g_regex_unref (uri_regex);
+}
+
+void
+empathy_string_match_smiley (const gchar *text,
+ gssize len,
+ EmpathyStringReplace replace_func,
+ EmpathyStringParser *sub_parsers,
+ gpointer user_data)
+{
+ guint last = 0;
+ EmpathySmileyManager *smiley_manager;
+ GSList *hits, *l;
+
+ smiley_manager = empathy_smiley_manager_dup_singleton ();
+ hits = empathy_smiley_manager_parse_len (smiley_manager, text, len);
+
+ for (l = hits; l; l = l->next) {
+ EmpathySmileyHit *hit = l->data;
+
+ if (hit->start > last) {
+ /* Append the text between last smiley (or the
+ * start of the message) and this smiley */
+ empathy_string_parser_substr (text + last,
+ hit->start - last,
+ sub_parsers, user_data);
+ }
+
+ replace_func (text + hit->start, hit->end - hit->start,
+ hit, user_data);
+
+ last = hit->end;
+
+ empathy_smiley_hit_free (hit);
+ }
+ g_slist_free (hits);
+ g_object_unref (smiley_manager);
+
+ empathy_string_parser_substr (text + last, len - last,
+ sub_parsers, user_data);
+}
+
+void
+empathy_string_match_all (const gchar *text,
+ gssize len,
+ EmpathyStringReplace replace_func,
+ EmpathyStringParser *sub_parsers,
+ gpointer user_data)
+{
+ replace_func (text, len, NULL, user_data);
+}
+
diff --git a/libempathy-gtk/empathy-string-parser.h b/libempathy-gtk/empathy-string-parser.h
new file mode 100644
index 000000000..696545b65
--- /dev/null
+++ b/libempathy-gtk/empathy-string-parser.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2010 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Xavier Claessens <xclaesse@gmail.com>
+ */
+
+#ifndef __EMPATHY_STRING_PARSER_H__
+#define __EMPATHY_STRING_PARSER_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef struct _EmpathyStringParser EmpathyStringParser;
+
+typedef void (*EmpathyStringReplace) (const gchar *text,
+ gssize len,
+ gpointer match_data,
+ gpointer user_data);
+typedef void (*EmpathyStringMatch) (const gchar *text,
+ gssize len,
+ EmpathyStringReplace replace_func,
+ EmpathyStringParser *sub_parsers,
+ gpointer user_data);
+
+struct _EmpathyStringParser {
+ EmpathyStringMatch match_func;
+ EmpathyStringReplace replace_func;
+};
+
+void
+empathy_string_parser_substr (const gchar *text,
+ gssize len,
+ EmpathyStringParser *parsers,
+ gpointer user_data);
+
+void
+empathy_string_match_link (const gchar *text,
+ gssize len,
+ EmpathyStringReplace replace_func,
+ EmpathyStringParser *sub_parsers,
+ gpointer user_data);
+
+void
+empathy_string_match_smiley (const gchar *text,
+ gssize len,
+ EmpathyStringReplace replace_func,
+ EmpathyStringParser *sub_parsers,
+ gpointer user_data);
+
+void
+empathy_string_match_all (const gchar *text,
+ gssize len,
+ EmpathyStringReplace replace_func,
+ EmpathyStringParser *sub_parsers,
+ gpointer user_data);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_STRING_PARSER_H__ */
diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c
index 5c67af857..ef7d3a73e 100644
--- a/libempathy-gtk/empathy-theme-adium.c
+++ b/libempathy-gtk/empathy-theme-adium.c
@@ -40,6 +40,7 @@
#include "empathy-conf.h"
#include "empathy-ui-utils.h"
#include "empathy-plist.h"
+#include "empathy-string-parser.h"
#define DEBUG_FLAG EMPATHY_DEBUG_CHAT
#include <libempathy/empathy-debug.h>
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index dcba5fe23..a2865bc55 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1726,107 +1726,3 @@ empathy_receive_file_with_file_chooser (EmpathyFTHandler *handler)
gtk_widget_show (widget);
}
-void
-empathy_string_parser_substr (const gchar *text,
- gssize len,
- EmpathyStringParser *parsers,
- gpointer user_data)
-{
- if (parsers != NULL && parsers[0].match_func != NULL) {
- parsers[0].match_func (text, len,
- parsers[0].replace_func, parsers + 1,
- user_data);
- }
-}
-
-void
-empathy_string_match_link (const gchar *text,
- gssize len,
- EmpathyStringReplace replace_func,
- EmpathyStringParser *sub_parsers,
- gpointer user_data)
-{
- GRegex *uri_regex;
- GMatchInfo *match_info;
- gboolean match;
- gint last = 0;
-
- uri_regex = empathy_uri_regex_dup_singleton ();
- match = g_regex_match_full (uri_regex, text, len, 0, 0, &match_info, NULL);
- if (match) {
- gint s = 0, e = 0;
-
- do {
- g_match_info_fetch_pos (match_info, 0, &s, &e);
-
- if (s > last) {
- /* Append the text between last link (or the
- * start of the message) and this link */
- empathy_string_parser_substr (text + last,
- s - last,
- sub_parsers,
- user_data);
- }
-
- replace_func (text + s, e - s, NULL, user_data);
-
- last = e;
- } while (g_match_info_next (match_info, NULL));
- }
-
- empathy_string_parser_substr (text + last, len - last,
- sub_parsers, user_data);
-
- g_match_info_free (match_info);
- g_regex_unref (uri_regex);
-}
-
-void
-empathy_string_match_smiley (const gchar *text,
- gssize len,
- EmpathyStringReplace replace_func,
- EmpathyStringParser *sub_parsers,
- gpointer user_data)
-{
- guint last = 0;
- EmpathySmileyManager *smiley_manager;
- GSList *hits, *l;
-
- smiley_manager = empathy_smiley_manager_dup_singleton ();
- hits = empathy_smiley_manager_parse_len (smiley_manager, text, len);
-
- for (l = hits; l; l = l->next) {
- EmpathySmileyHit *hit = l->data;
-
- if (hit->start > last) {
- /* Append the text between last smiley (or the
- * start of the message) and this smiley */
- empathy_string_parser_substr (text + last,
- hit->start - last,
- sub_parsers, user_data);
- }
-
- replace_func (text + hit->start, hit->end - hit->start,
- hit, user_data);
-
- last = hit->end;
-
- empathy_smiley_hit_free (hit);
- }
- g_slist_free (hits);
- g_object_unref (smiley_manager);
-
- empathy_string_parser_substr (text + last, len - last,
- sub_parsers, user_data);
-}
-
-void
-empathy_string_match_all (const gchar *text,
- gssize len,
- EmpathyStringReplace replace_func,
- EmpathyStringParser *sub_parsers,
- gpointer user_data)
-{
- replace_func (text, len, NULL, user_data);
-}
-
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 925ecc5cb..e03ec66f8 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -130,51 +130,6 @@ gchar * empathy_make_absolute_url (const gchar *url);
gchar * empathy_make_absolute_url_len (const gchar *url,
guint len);
-/* String parser */
-typedef struct _EmpathyStringParser EmpathyStringParser;
-
-typedef void (*EmpathyStringReplace) (const gchar *text,
- gssize len,
- gpointer match_data,
- gpointer user_data);
-typedef void (*EmpathyStringMatch) (const gchar *text,
- gssize len,
- EmpathyStringReplace replace_func,
- EmpathyStringParser *sub_parsers,
- gpointer user_data);
-
-struct _EmpathyStringParser {
- EmpathyStringMatch match_func;
- EmpathyStringReplace replace_func;
-};
-
-void
-empathy_string_parser_substr (const gchar *text,
- gssize len,
- EmpathyStringParser *parsers,
- gpointer user_data);
-
-void
-empathy_string_match_link (const gchar *text,
- gssize len,
- EmpathyStringReplace replace_func,
- EmpathyStringParser *sub_parsers,
- gpointer user_data);
-
-void
-empathy_string_match_smiley (const gchar *text,
- gssize len,
- EmpathyStringReplace replace_func,
- EmpathyStringParser *sub_parsers,
- gpointer user_data);
-
-void
-empathy_string_match_all (const gchar *text,
- gssize len,
- EmpathyStringReplace replace_func,
- EmpathyStringParser *sub_parsers,
- gpointer user_data);
-
G_END_DECLS
#endif /* __EMPATHY_UI_UTILS_H__ */