diff options
author | Gary Kramlich <grim@reaperworld.com> | 2017-12-15 04:27:32 +0000 |
---|---|---|
committer | Gary Kramlich <grim@reaperworld.com> | 2017-12-15 04:27:32 +0000 |
commit | d9e962b16bfd6baa7608866d2aa2a47d35cdb9cf (patch) | |
tree | b442274715cec97f0f97ae3233031f2666d690f5 | |
parent | 2dc10625a60cbb8a21438fbfc0a6f1af5b8f7c38 (diff) | |
parent | 6452e8ffe24532385f8338e96dc34b76d8b85a1a (diff) | |
download | pidgin-d9e962b16bfd6baa7608866d2aa2a47d35cdb9cf.tar.gz |
Merged in strangeways/main/release-2.x.y (pull request #262)
Improve smiley matching for unicode
Approved-by: Eion Robb <eionrobb@gmail.com>
Approved-by: Gary Kramlich <grim@reaperworld.com>
-rw-r--r-- | pidgin/gtkimhtml.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/pidgin/gtkimhtml.c b/pidgin/gtkimhtml.c index 283900c314..57e8ddcded 100644 --- a/pidgin/gtkimhtml.c +++ b/pidgin/gtkimhtml.c @@ -2054,58 +2054,66 @@ static gint gtk_smiley_tree_lookup (GtkSmileyTree *tree, const gchar *text) { + gunichar text_ch = g_utf8_get_char(text); GtkSmileyTree *t = tree; - const gchar *x = text; gint len = 0; - const gchar *amp; - gint alen; - - while (*x) { + gint lastlen = 0; + + while (text_ch) { + const gchar *amp; gchar *pos; + gint alen; if (!t->values) break; - if(*x == '&' && (amp = purple_markup_unescape_entity(x, &alen))) { + if((amp = purple_markup_unescape_entity(text, &alen))) { gboolean matched = TRUE; + const char *amp_next = g_utf8_next_char(amp); + /* Make sure all chars of the unescaped value match */ - while (*(amp + 1)) { - pos = strchr (t->values->str, *amp); + while (g_utf8_get_char(amp_next)) { + pos = g_utf8_strchr (t->values->str, -1, g_utf8_get_char(amp)); if (pos) t = t->children [GPOINTER_TO_INT(pos) - GPOINTER_TO_INT(t->values->str)]; else { matched = FALSE; break; } - amp++; + amp = amp_next; + amp_next = g_utf8_next_char(amp_next); } + if (!matched) break; - - pos = strchr (t->values->str, *amp); + + pos = g_utf8_strchr (t->values->str, -1, g_utf8_get_char(amp)); } - else if (*x == '<') /* Because we're all WYSIWYG now, a '<' + else if (text_ch == '<') /* Because we're all WYSIWYG now, a '<' * char should only appear as the start of a tag. Perhaps a safer (but costlier) * check would be to call gtk_imhtml_is_tag on it */ break; else { - alen = 1; - pos = strchr (t->values->str, *x); + alen = g_unichar_to_utf8 (text_ch, NULL); + pos = g_utf8_strchr (t->values->str, -1, text_ch); } - if (pos) + if (pos) { t = t->children [GPOINTER_TO_INT(pos) - GPOINTER_TO_INT(t->values->str)]; - else + if (t->image) + lastlen = len + alen; + } else break; - x += alen; len += alen; + text = g_utf8_next_char(text); + text_ch = g_utf8_get_char(text); } if (t->image) return len; - return 0; + return lastlen; } static void |