From f3c952f8fc6470c4a3356e774df12d80008af459 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sun, 29 Dec 2019 17:52:51 +0100 Subject: Support smiley->emoji conversion in the middle of the text --- main/src/ui/chat_input/smiley_converter.vala | 29 +++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/main/src/ui/chat_input/smiley_converter.vala b/main/src/ui/chat_input/smiley_converter.vala index 89512356..dc975f10 100644 --- a/main/src/ui/chat_input/smiley_converter.vala +++ b/main/src/ui/chat_input/smiley_converter.vala @@ -10,6 +10,7 @@ class SmileyConverter { private TextView text_input; private static HashMap smiley_translations = new HashMap(); + private Regex whitespace_regex = /\s/; static construct { smiley_translations[":)"] = "🙂"; @@ -40,13 +41,27 @@ class SmileyConverter { } private void check_convert() { - if (Dino.Application.get_default().settings.convert_utf8_smileys) { - foreach (string smiley in smiley_translations.keys) { - if (text_input.buffer.text.has_suffix(smiley)) { - if (text_input.buffer.text.length == smiley.length || - text_input.buffer.text[text_input.buffer.text.length - smiley.length - 1] == ' ') { - text_input.buffer.text = text_input.buffer.text.substring(0, text_input.buffer.text.length - smiley.length) + smiley_translations[smiley]; - } + if (!Dino.Application.get_default().settings.convert_utf8_smileys) return; + + TextIter? start_iter; + text_input.buffer.get_start_iter(out start_iter); + TextIter? cursor_iter; + text_input.buffer.get_iter_at_mark(out cursor_iter, text_input.buffer.get_insert()); + if (start_iter == null || cursor_iter == null) return; + + string text = text_input.buffer.get_text(start_iter, cursor_iter, true); + + foreach (string smiley in smiley_translations.keys) { + if (text.has_suffix(smiley)) { + if (text.length == smiley.length || whitespace_regex.match(text[text.length - smiley.length - 1].to_string())) { + TextIter? end_iter; + text_input.buffer.get_end_iter(out end_iter); + if (end_iter == null) continue; + + TextIter smiley_start_iter = cursor_iter; + smiley_start_iter.backward_chars(smiley.length); + text_input.buffer.delete(ref smiley_start_iter, ref cursor_iter); + text_input.buffer.insert_text(ref cursor_iter, smiley_translations[smiley], smiley_translations[smiley].length); } } } -- cgit v1.2.3-70-g09d2