diff options
| author | Alon Levy <alon@pobox.com> | 2015-02-18 09:54:23 +0200 |
|---|---|---|
| committer | Alon Levy <alon@pobox.com> | 2015-02-18 09:54:23 +0200 |
| commit | 8a4cc23ff5f4ac022ce4c3f0b8546fe1a4db0c1b (patch) | |
| tree | c742040b5e0e7b2a364c17b460ca9924fcdc9fdd | |
| parent | 057e9e46d488c8e76f63afb98c8729e6a9533de3 (diff) | |
client/completer: wip handle multiple delimiters for search (| and space)
| -rw-r--r-- | src/client/view/completer.js | 35 | ||||
| -rw-r--r-- | src/client/view/search.js | 8 |
2 files changed, 33 insertions, 10 deletions
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() { |
