From ab86c2049f0dbe8b639b7c3bcb5400170e7e098e Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 12 Feb 2018 22:42:46 -0600 Subject: [PATCH 1/2] autocomplete: factor out parse_query function. --- app/assets/javascripts/autocomplete.js.erb | 67 ++++++++++------------ 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/app/assets/javascripts/autocomplete.js.erb b/app/assets/javascripts/autocomplete.js.erb index 7a99600b1..2f0fb5b10 100644 --- a/app/assets/javascripts/autocomplete.js.erb +++ b/app/assets/javascripts/autocomplete.js.erb @@ -6,6 +6,9 @@ //Just under 5MB of 16-bit characters Danbooru.Autocomplete.MAX_STORAGE_SIZE = 2500000; + Danbooru.Autocomplete.PREFIXES = /^(-|~|<%= TagCategory.mapping.keys.map {|category| category + ':'}.join('|') %>)(.*)$/i; + Danbooru.Autocomplete.METATAGS = /^(<%= Tag::METATAGS %>):(.*)$/i; + Danbooru.Autocomplete.initialize_all = function() { if (Danbooru.meta("enable-auto-complete") === "true") { Danbooru.Autocomplete.enable_local_storage = this.test_local_storage(); @@ -99,9 +102,6 @@ var $fields_multiple = $('[data-autocomplete="tag-query"], [data-autocomplete="tag-edit"]'); var $fields_single = $('[data-autocomplete="tag"]'); - var prefixes = "-|~|" + "<%= TagCategory.mapping.keys.map {|category| category + ':'}.join('|') %>"; - var metatags = "<%= Tag::METATAGS %>"; - $fields_multiple.autocomplete({ delay: 100, autoFocus: true, @@ -111,6 +111,7 @@ select: function(event, ui) { var before_caret_text = this.value.substring(0, this.selectionStart); var after_caret_text = this.value.substring(this.selectionStart); + var prefixes = "-|~|" + "<%= TagCategory.mapping.keys.map {|category| category + ':'}.join('|') %>"; var regexp = new RegExp("(" + prefixes + ")?\\S+$", "g"); this.value = before_caret_text.replace(regexp, "$1" + ui.item.value + " "); @@ -124,36 +125,15 @@ return false; }, source: function(req, resp) { - var before_caret_text = req.term.substring(0, this.element.get(0).selectionStart); + var query = Danbooru.Autocomplete.parse_query(req.term, this.element.get(0).selectionStart); + var metatag = query.metatag; + var term = query.term; - if (before_caret_text.match(/ $/)) { + if (!term) { this.close(); return; } - var term = before_caret_text.match(/\S+/g); - if (!term) { - return; - } - - term = term.pop(); - var regexp = new RegExp("^(?:" + prefixes + ")(.*)$", "i"); - var match = term.match(regexp); - if (match) { - term = match[1]; - } - if (term === "") { - return; - } - - regexp = new RegExp("^(" + metatags + "):(.*)$", "i"); - match = term.match(regexp); - var metatag; - if (match) { - metatag = match[1].toLowerCase(); - term = match[2]; - } - switch(metatag) { case "md5": case "width": @@ -176,7 +156,6 @@ <% end %> resp([]); return; - case "order": case "status": case "rating": @@ -186,13 +165,6 @@ case "filetype": Danbooru.Autocomplete.static_metatag_source(term, resp, metatag); return; - } - - if (term === "") { - return; - } - - switch(metatag) { case "user": case "approver": case "commenter": @@ -280,6 +252,29 @@ }); } + Danbooru.Autocomplete.parse_query = function(text, caret) { + var metatag = ""; + var term = ""; + + var before_caret_text = text.substring(0, caret); + var match = before_caret_text.match(/\S+$/g); + if (match) { + term = match[0]; + } else { + return {}; + } + + if (match = term.match(Danbooru.Autocomplete.PREFIXES)) { + metatag = match[1].toLowerCase(); + term = match[2]; + } else if (match = term.match(Danbooru.Autocomplete.METATAGS)) { + metatag = match[1].toLowerCase(); + term = match[2]; + } + + return { metatag: metatag, term: term }; + }; + Danbooru.Autocomplete.render_item = function(list, item) { var $link = $(""); From f0754c21f57cd9b036048430b99776a17614e096 Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 12 Feb 2018 22:43:35 -0600 Subject: [PATCH 2/2] autocomplete: make enter key submit on exact match. --- app/assets/javascripts/autocomplete.js.erb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/assets/javascripts/autocomplete.js.erb b/app/assets/javascripts/autocomplete.js.erb index 2f0fb5b10..c22ab7189 100644 --- a/app/assets/javascripts/autocomplete.js.erb +++ b/app/assets/javascripts/autocomplete.js.erb @@ -109,6 +109,12 @@ return false; }, select: function(event, ui) { + var query = Danbooru.Autocomplete.parse_query(this.value, this.selectionStart); + if (event.key === "Enter" && query.term === ui.item.value) { + $(this).parents("form").submit(); + return false; + } + var before_caret_text = this.value.substring(0, this.selectionStart); var after_caret_text = this.value.substring(this.selectionStart); var prefixes = "-|~|" + "<%= TagCategory.mapping.keys.map {|category| category + ':'}.join('|') %>";