diff --git a/app/assets/javascripts/autocomplete.js b/app/assets/javascripts/autocomplete.js new file mode 100644 index 000000000..7b6274ee8 --- /dev/null +++ b/app/assets/javascripts/autocomplete.js @@ -0,0 +1,146 @@ +(function() { + Danbooru.Autocomplete = {}; + + Danbooru.Autocomplete.initialize_all = function() { + if (Danbooru.meta("enable-auto-complete") === "true") { + this.initialize_tag_autocomplete(); + } + } + + Danbooru.Autocomplete.initialize_tag_autocomplete = function() { + var $fields_multiple = $( + "#tags,#post_tag_string,#upload_tag_string,#tag-script-field,#c-moderator-post-queues #query" + ); + var $fields_single = $( + "#search_post_tags_match,#c-tags #search_name_matches,#c-tag-aliases #query,#c-tag-implications #query," + + "#wiki_page_title,#artist_name," + + "#tag_alias_request_antecedent_name,#tag_alias_request_consequent_name," + + "#tag_implication_request_antecedent_name,#tag_implication_request_consequent_name," + + "#tag_alias_antecedent_name,#tag_alias_consequent_name," + + "#tag_implication_antecedent_name,#tag_implication_consequent_name" + ); + + var prefixes = "-|~|general:|gen:|artist:|art:|copyright:|copy:|co:|character:|char:|ch:"; + + $fields_multiple.autocomplete({ + delay: 100, + focus: function() { + return false; + }, + select: function(event, ui) { + var before_caret_text = this.value.substring(0, this.selectionStart); + var after_caret_text = this.value.substring(this.selectionStart); + + var regexp = new RegExp("(" + prefixes + ")?\\S+$", "g"); + this.value = before_caret_text.replace(regexp, "$1" + ui.item.value + " "); + + // Preserve original caret position to prevent it from jumping to the end + var original_start = this.selectionStart; + this.value += after_caret_text; + this.selectionStart = this.selectionEnd = original_start; + + return false; + }, + source: function(req, resp) { + var before_caret_text = req.term.substring(0, this.element.get(0).selectionStart); + + if (before_caret_text.match(/ $/)) { + this.close(); + return; + } + + var term = before_caret_text.match(/\S+/g).pop(); + var regexp = new RegExp("^(?:" + prefixes + ")(.*)$"); + var match = term.match(regexp); + if (match) { + term = match[1]; + } + if (term === "") { + return; + } + + $.ajax({ + url: "/tags.json", + data: { + "search[order]": "count", + "search[name_matches]": term + "*", + "limit": 10 + }, + method: "get", + success: function(data) { + resp($.map(data, function(tag) { + return { + label: tag.name.replace(/_/g, " "), + value: tag.name, + category: tag.category, + post_count: tag.post_count + }; + })); + } + }); + } + }); + + $fields_multiple.on("autocompleteselect", function() { + Danbooru.autocompleting = true; + }); + + $fields_multiple.on("autocompleteclose", function() { + // this is needed otherwise the var is disabled by the time the + // keydown is triggered + setTimeout(function() {Danbooru.autocompleting = false;}, 100); + }); + + $fields_single.autocomplete({ + minLength: 1, + source: function(req, resp) { + $.ajax({ + url: "/tags.json", + data: { + "search[order]": "count", + "search[name_matches]": req.term + "*", + "limit": 10 + }, + method: "get", + success: function(data) { + resp($.map(data, function(tag) { + return { + label: tag.name.replace(/_/g, " "), + value: tag.name, + category: tag.category, + post_count: tag.post_count + }; + })); + } + }); + } + }); + + var render_tag = function(list, tag) { + var $link = $("").addClass("tag-type-" + tag.category).text(tag.label); + $link.attr("href", "/posts?tags=" + encodeURIComponent(tag.value)); + $link.click(function(e) { + e.preventDefault(); + }); + + var count; + if (tag.post_count >= 1000) { + count = Math.floor(tag.post_count / 1000) + "k"; + } else { + count = tag.post_count; + } + var $post_count = $("").addClass("post-count").css("float", "right").text(count); + $link.append($post_count); + + return $("
").data("item.autocomplete", tag).append($link).appendTo(list); + }; + + $.merge($fields_multiple, $fields_single).each(function(i, field) { + $(field).data("uiAutocomplete")._renderItem = render_tag; + }); + } +})(); + +$(document).ready(function() { + Danbooru.Autocomplete.initialize_all(); +}); diff --git a/app/assets/javascripts/posts.js b/app/assets/javascripts/posts.js index 676280838..60fc5f623 100644 --- a/app/assets/javascripts/posts.js +++ b/app/assets/javascripts/posts.js @@ -6,10 +6,6 @@ Danbooru.Post.initialize_all = function() { this.initialize_post_previews(); - if (Danbooru.meta("enable-auto-complete") === "true") { - this.initialize_tag_autocomplete(); - } - if ($("#c-posts").length) { if (Danbooru.meta("enable-js-navigation") === "true") { this.initialize_shortcuts(); @@ -137,139 +133,6 @@ $tag_string.css({"resize": "", "width": ""}); } - Danbooru.Post.initialize_tag_autocomplete = function() { - var $fields_multiple = $( - "#tags,#post_tag_string,#upload_tag_string,#tag-script-field,#c-moderator-post-queues #query" - ); - var $fields_single = $( - "#search_post_tags_match,#c-tags #search_name_matches,#c-tag-aliases #query,#c-tag-implications #query," + - "#wiki_page_title,#artist_name," + - "#tag_alias_request_antecedent_name,#tag_alias_request_consequent_name," + - "#tag_implication_request_antecedent_name,#tag_implication_request_consequent_name," + - "#tag_alias_antecedent_name,#tag_alias_consequent_name," + - "#tag_implication_antecedent_name,#tag_implication_consequent_name" - ); - - var prefixes = "-|~|general:|gen:|artist:|art:|copyright:|copy:|co:|character:|char:|ch:"; - - $fields_multiple.autocomplete({ - delay: 100, - focus: function() { - return false; - }, - select: function(event, ui) { - var before_caret_text = this.value.substring(0, this.selectionStart); - var after_caret_text = this.value.substring(this.selectionStart); - - var regexp = new RegExp("(" + prefixes + ")?\\S+$", "g"); - this.value = before_caret_text.replace(regexp, "$1" + ui.item.value + " "); - - // Preserve original caret position to prevent it from jumping to the end - var original_start = this.selectionStart; - this.value += after_caret_text; - this.selectionStart = this.selectionEnd = original_start; - - return false; - }, - source: function(req, resp) { - var before_caret_text = req.term.substring(0, this.element.get(0).selectionStart); - - if (before_caret_text.match(/ $/)) { - this.close(); - return; - } - - var term = before_caret_text.match(/\S+/g).pop(); - var regexp = new RegExp("^(?:" + prefixes + ")(.*)$"); - var match = term.match(regexp); - if (match) { - term = match[1]; - } - if (term === "") { - return; - } - - $.ajax({ - url: "/tags.json", - data: { - "search[order]": "count", - "search[name_matches]": term + "*", - "limit": 10 - }, - method: "get", - success: function(data) { - resp($.map(data, function(tag) { - return { - label: tag.name.replace(/_/g, " "), - value: tag.name, - category: tag.category, - post_count: tag.post_count - }; - })); - } - }); - } - }); - - $fields_multiple.on("autocompleteselect", function() { - Danbooru.autocompleting = true; - }); - - $fields_multiple.on("autocompleteclose", function() { - // this is needed otherwise the var is disabled by the time the - // keydown is triggered - setTimeout(function() {Danbooru.autocompleting = false;}, 100); - }); - - $fields_single.autocomplete({ - minLength: 1, - source: function(req, resp) { - $.ajax({ - url: "/tags.json", - data: { - "search[order]": "count", - "search[name_matches]": req.term + "*", - "limit": 10 - }, - method: "get", - success: function(data) { - resp($.map(data, function(tag) { - return { - label: tag.name.replace(/_/g, " "), - value: tag.name, - category: tag.category, - post_count: tag.post_count - }; - })); - } - }); - } - }); - - var render_tag = function(list, tag) { - var $link = $("").addClass("tag-type-" + tag.category).text(tag.label); - $link.attr("href", "/posts?tags=" + encodeURIComponent(tag.value)); - $link.click(function(e) { - e.preventDefault(); - }); - - var count; - if (tag.post_count >= 1000) { - count = Math.floor(tag.post_count / 1000) + "k"; - } else { - count = tag.post_count; - } - var $post_count = $("").addClass("post-count").css("float", "right").text(count); - $link.append($post_count); - - return $("").data("item.autocomplete", tag).append($link).appendTo(list); - }; - - $.merge($fields_multiple, $fields_single).each(function(i, field) { - $(field).data("uiAutocomplete")._renderItem = render_tag; - }); - } - Danbooru.Post.initialize_similar = function() { $("#similar-button").click(function(e) { var old_source_name = $("#post_source").attr("name");