From 8a4cc23ff5f4ac022ce4c3f0b8546fe1a4db0c1b Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Wed, 18 Feb 2015 09:54:23 +0200 Subject: client/completer: wip handle multiple delimiters for search (| and space) --- src/client/view/completer.js | 35 +++++++++++++++++++++++++++-------- src/client/view/search.js | 8 ++++++-- 2 files changed, 33 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/client/view/completer.js b/src/client/view/completer.js index 66b94ed4..078f8860 100644 --- a/src/client/view/completer.js +++ b/src/client/view/completer.js @@ -42,7 +42,6 @@ var completer = (function (input_element, dropdown, base_config) { // turn off the browser's autocomplete input_element.attr('autocomplete', 'off'); - //$('.ui-autocomplete').css('width', '10px'); options_bus.onValue(function update_options(new_options) { options = new_options; }); @@ -82,11 +81,18 @@ var completer = (function (input_element, dropdown, base_config) { } }); + function anyof_re(chars) + { + return new RegExp('[' + chars.replace('[', '\\[').replace(']', '\\]') + ']'); + } + function get_config(base) { return { - triggerStart: base && base.triggerStart || '#', - triggerEnd: base && base.triggerEnd || ' ', + triggerStart: anyof_re(base && base.triggerStart || '#'), + triggerEnd: anyof_re(base && base.triggerEnd || ' '), hideOnTab: base && base.hasOwnProperty('hideOnTab') ? base.hideOnTab : true, + matchStartOfString: (base && base.matchStartOfString) || false, + appendSpaceOnEnter: (base && base.appendSpaceOnEnter) || false, }; } @@ -104,7 +110,6 @@ var completer = (function (input_element, dropdown, base_config) { var click_event = 'click.completer.' + input_element_raw.id; function hide_on_click(e) { - console.log('good night'); hide(); } @@ -122,6 +127,20 @@ var completer = (function (input_element, dropdown, base_config) { $(document).off(click_event, "body", hide_on_click); } + /** + * Helper similar to String.lastIndexOf but works with regular expressions + */ + function lastRegexpIndex(s, r) + { + var reversed = s.split('').reverse().join(''); // constly + index = reversed.search(r); + + if (index == -1) { + return -1; + } + return s.length - 1 - index; + } + /*** * #this is a # * ^ @@ -133,15 +152,15 @@ var completer = (function (input_element, dropdown, base_config) { * ^ */ function oninput(text, cursor) { - var hash = text.slice(0, cursor).lastIndexOf(config.triggerStart); + var hash = lastRegexpIndex(text.slice(0, cursor), config.triggerStart); // TODO check if current completion has been invalidated _invalidateSelection(); hide(); dropdown_raw.innerHTML = ""; // remove all elements - if (hash == -1 && config.triggerStart != ' ') { // space matches start of string too + if (hash == -1 && !config.matchStartOfString) { return; } - var space = text.slice(hash + 1).indexOf(config.triggerEnd); + var space = text.slice(hash + 1).search(config.triggerEnd); space = space == -1 ? text.length : space; if (space < cursor) { return; @@ -215,7 +234,7 @@ var completer = (function (input_element, dropdown, base_config) { } function _applySuggestion(str) { var cur = input_element.val(), - start = cur.slice(0, completion_start) + str + ' '; + start = cur.slice(0, completion_start) + str + config.appendSpaceOnEnter ? ' ' : ''; input_element.val(start + cur.slice(completion_end)); setCaret(input_element, start.length); oninput('', 0); diff --git a/src/client/view/search.js b/src/client/view/search.js index 4da81b4a..c6203c34 100644 --- a/src/client/view/search.js +++ b/src/client/view/search.js @@ -11,7 +11,11 @@ var focus = function() { function init() { search = $('#search'); search_completer = completer(search, $('#search-suggestion'), - {triggerStart:' ', triggerEnd:' '}); + { + triggerStart:' |', + triggerEnd:' |', + matchStartOfString: true, + }); search_completer.options.plug(textanalysis.suggestions_options); search.on('input', search_on_submit); @@ -21,7 +25,7 @@ function init() { search_on_submit(e); return false; } - return undefined; + return true; }); function search_on_submit() { -- cgit v1.3.1