diff --git a/js/inputbar.js b/js/inputbar.js index ca4fe16..72b2116 100644 --- a/js/inputbar.js +++ b/js/inputbar.js @@ -28,9 +28,40 @@ weechat.directive('inputBar', function() { // Expose utils to be able to check if we're on a mobile UI $scope.utils = utils; - // E.g. Turn :smile: into the unicode equivalent + // Emojify input. E.g. Turn :smile: into the unicode equivalent, but + // don't do replacements in the middle of a word (e.g. std::io::foo) $scope.inputChanged = function() { - $scope.command = emojione.shortnameToUnicode($scope.command); + var emojiRegex = /^(?:[\uD800-\uDBFF][\uDC00-\uDFFF])+$/, // *only* emoji + changed = false, // whether a segment was modified + inputNode = $scope.getInputNode(), + caretPos = inputNode.selectionStart, + position = 0; // current position in text + + // use capturing group in regex to include whitespace in output array + var segments = $scope.command.split(/(\s+)/); + for (var i = 0; i < segments.length; i ++) { + if (/\s+/.test(segments[i]) || emojiRegex.test(segments[i])) { + // ignore whitespace and emoji-only segments + position += segments[i].length; + continue; + } + // emojify segment + var emojified = emojione.shortnameToUnicode(segments[i]); + if (emojiRegex.test(emojified)) { + // If result consists *only* of emoji, adjust caret + // position and replace segment with emojified version + caretPos = caretPos - segments[i].length + emojified.length; + segments[i] = emojified; + changed = true; + } + position += segments[i].length; + } + if (changed) { // Only re-assemble if something changed + $scope.command = segments.join(''); + setTimeout(function() { + inputNode.setSelectionRange(caretPos, caretPos); + }); + } }; /*