diff options
author | Xavier Claessens <xclaesse@gmail.com> | 2009-11-16 16:23:12 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2009-11-25 01:29:44 +0800 |
commit | e83c0814113515cdd5a3dc511f7e29cbe51651e8 (patch) | |
tree | 5d3a2c36524fc75d6c0ca7e91764ae4ec2eb3959 /libempathy-gtk/empathy-smiley-manager.c | |
parent | 1af4342a53358f23f71fabd0012a0d868a13c194 (diff) | |
download | gsoc2013-empathy-e83c0814113515cdd5a3dc511f7e29cbe51651e8.tar gsoc2013-empathy-e83c0814113515cdd5a3dc511f7e29cbe51651e8.tar.gz gsoc2013-empathy-e83c0814113515cdd5a3dc511f7e29cbe51651e8.tar.bz2 gsoc2013-empathy-e83c0814113515cdd5a3dc511f7e29cbe51651e8.tar.lz gsoc2013-empathy-e83c0814113515cdd5a3dc511f7e29cbe51651e8.tar.xz gsoc2013-empathy-e83c0814113515cdd5a3dc511f7e29cbe51651e8.tar.zst gsoc2013-empathy-e83c0814113515cdd5a3dc511f7e29cbe51651e8.zip |
Add comments to explain empathy_smiley_manager_parse_len(), it is non-trivial function.
Diffstat (limited to 'libempathy-gtk/empathy-smiley-manager.c')
-rw-r--r-- | libempathy-gtk/empathy-smiley-manager.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/libempathy-gtk/empathy-smiley-manager.c b/libempathy-gtk/empathy-smiley-manager.c index 846b2b72b..71cb5065f 100644 --- a/libempathy-gtk/empathy-smiley-manager.c +++ b/libempathy-gtk/empathy-smiley-manager.c @@ -327,12 +327,22 @@ empathy_smiley_manager_parse_len (EmpathySmileyManager *manager, g_return_val_if_fail (EMPATHY_IS_SMILEY_MANAGER (manager), NULL); g_return_val_if_fail (text != NULL, NULL); + /* If len is negative, parse the string until we find '\0' */ if (len < 0) { len = G_MAXSSIZE; } + /* Parse the len first bytes of text to find smileys. Each time a smiley + * is detected, append a EmpathySmileyHit struct to the returned list, + * containing the smiley pixbuf and the position of the text to be + * replaced by it. + * cur_str is a pointer in the text showing the current position + * of the parsing. It is always at the begining of an UTF-8 character, + * because we support unicode smileys! For example we could want to + * replace ™ by an image. */ + for (cur_str = text; - *cur_str && cur_str - text < len; + *cur_str != '\0' && cur_str - text < len; cur_str = g_utf8_next_char (cur_str)) { SmileyManagerTree *child; gunichar c; @@ -340,19 +350,27 @@ empathy_smiley_manager_parse_len (EmpathySmileyManager *manager, c = g_utf8_get_char (cur_str); child = smiley_manager_tree_find_child (cur_tree, c); + /* If we have a child it means c is part of a smiley */ if (child) { if (cur_tree == priv->tree) { + /* c is the first char of some smileys, keep + * the begining position */ start = cur_str; } cur_tree = child; continue; } + /* c is not part of a smiley. let's check if we found a smiley + * before it. */ if (cur_tree->pixbuf != NULL) { + /* found! */ hit = smiley_hit_new (cur_tree, start - text, cur_str - text); hits = g_slist_prepend (hits, hit); + /* c was not part of this smiley, check if a new smiley + * start with it. */ cur_tree = smiley_manager_tree_find_child (priv->tree, c); if (cur_tree) { start = cur_str; @@ -360,11 +378,23 @@ empathy_smiley_manager_parse_len (EmpathySmileyManager *manager, cur_tree = priv->tree; } } else if (cur_tree != priv->tree) { + /* We searched a smiley starting at 'start' but we ended + * with no smiley. Look again starting from next char. + * + * For example ">:)" and ":(" are both valid smileys, + * when parsing text ">:(" we first see '>' which could + * be the start of a smiley. 'start' variable is set to + * that position and we parse next char which is ':' and + * is still potential smiley. Then we see '(' which is + * NOT part of the smiley, ">:(" does not exist, so we + * have to start again from ':' to find ":(" which is + * correct smiley. */ cur_str = start; cur_tree = priv->tree; } } + /* Check if last char of the text was the end of a smiley */ if (cur_tree->pixbuf != NULL) { hit = smiley_hit_new (cur_tree, start - text, cur_str - text); hits = g_slist_prepend (hits, hit); |