diff --git a/app/assets/javascripts/related_tag.js b/app/assets/javascripts/related_tag.js
new file mode 100644
index 000000000..ff552bada
--- /dev/null
+++ b/app/assets/javascripts/related_tag.js
@@ -0,0 +1,96 @@
+(function() {
+ Danbooru.RelatedTag = {};
+
+ Danbooru.RelatedTag.initialize_all = function() {
+ this.initialize_buttons();
+ }
+
+ Danbooru.RelatedTag.initialize_buttons = function() {
+ this.common_bind("#related-tags-button", "");
+ this.common_bind("#related-artists-button", "artist");
+ this.common_bind("#related-characters-button", "character");
+ this.common_bind("#related-copyrights-button", "copyright");
+ }
+
+ Danbooru.RelatedTag.common_bind = function(button_name, category) {
+ $(button_name).click(function(e) {
+ $.get("/related_tag.json", {
+ "query": Danbooru.RelatedTag.current_tag(),
+ "category": category
+ }).success(Danbooru.RelatedTag.process_response);
+ e.preventDefault();
+ });
+ }
+
+ Danbooru.RelatedTag.current_tag = function() {
+ var $field = $("#upload_tag_string,#post_tag_string");
+ var string = $field.val();
+ var text_length = string.length;
+ var a = $field[0].selectionStart;
+ var b = $field[0].selectionStart;
+
+ while ((a > 0) && string[a] != " ") {
+ a -= 1;
+ }
+
+ if (string[a] == " ") {
+ a += 1;
+ }
+
+ while ((b < text_length) && string[b] != " ") {
+ b += 1;
+ }
+
+ return string.slice(a, b);
+ }
+
+ Danbooru.RelatedTag.process_response = function(data) {
+ var query = data.query;
+ var related_tags = data.tags;
+ var wiki_page_tags = data.wiki_page_tags;
+ var $dest = $("#related-tags");
+
+ $dest.append(Danbooru.RelatedTag.build_html(query, related_tags));
+ if (wiki_page_tags.length > 0) {
+ $dest.append(Danbooru.RelatedTag.build_html("wiki:" + query), wiki_page_tags);
+ }
+ }
+
+ Danbooru.RelatedTag.build_html = function(query, related_tags) {
+ if (query === null || query === "") {
+ return "";
+ }
+
+ var current = $("#upload_tag_string,#post_tag_string").val().match(/\S+/g) || [];
+ var $div = $("
").addClass("tag-column");
+ var $ul = $("");
+ $ul.append(
+ $("").append(
+ $("").html(
+ query.replace(/_/g, " ")
+ )
+ )
+ );
+
+ $.each(related_tags, function(i, tag) {
+ var $link = $("");
+ $link.html(tag[0].replace(/_/g, " "));
+ $link.addClass("tag-type-" + tag[1]);
+ $link.attr("href", "/posts?tags=" + encodeURIComponent(tag[0]));
+ $link.click(Danbooru.RelatedTag.toggle_tag);
+ if ($.inArray(tag, current)) {
+ $link.addClass("active");
+ }
+ $ul.append(
+ $("").append($link)
+ );
+ });
+
+ $div.append($ul);
+ return $div;
+ }
+})();
+
+$(function() {
+ Danbooru.RelatedTag.initialize_all();
+});
diff --git a/app/controllers/related_tags_controller.rb b/app/controllers/related_tags_controller.rb
new file mode 100644
index 000000000..1328ffe32
--- /dev/null
+++ b/app/controllers/related_tags_controller.rb
@@ -0,0 +1,12 @@
+class RelatedTagsController < ApplicationController
+ respond_to :json
+
+ def show
+ @query = RelatedTagQuery.new(params[:query], params[:category])
+ respond_with(@query) do |format|
+ format.json do
+ render :json => @query.to_json
+ end
+ end
+ end
+end
diff --git a/app/helpers/related_tags_helper.rb b/app/helpers/related_tags_helper.rb
new file mode 100644
index 000000000..52d56005a
--- /dev/null
+++ b/app/helpers/related_tags_helper.rb
@@ -0,0 +1,2 @@
+module RelatedTagsHelper
+end
diff --git a/app/logical/related_tag_query.rb b/app/logical/related_tag_query.rb
index bd01c8f92..1c7c85de3 100644
--- a/app/logical/related_tag_query.rb
+++ b/app/logical/related_tag_query.rb
@@ -20,8 +20,16 @@ class RelatedTagQuery
wiki_page.try(:tags) || []
end
+ def to_json
+ {:query => query, :category => category, :tags => map_with_category_data(tags), :wiki_page_tags => map_with_category_data(wiki_page_tags)}.to_json
+ end
+
protected
+ def map_with_category_data(list_of_tag_names)
+ Tag.categories_for(list_of_tag_names).to_a
+ end
+
def pattern_matching_tags
Tag.name_matches(query).order("post_count desc").limit(50).sort_by {|x| x.name}.map(&:name)
end
diff --git a/app/views/uploads/new.html.erb b/app/views/uploads/new.html.erb
index 688ee466a..140846047 100644
--- a/app/views/uploads/new.html.erb
+++ b/app/views/uploads/new.html.erb
@@ -38,9 +38,18 @@
+
+
<%= submit_tag "Submit" %>
diff --git a/config/routes.rb b/config/routes.rb
index 8bf5bd0e2..b87bed740 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -33,6 +33,7 @@ Danbooru::Application.routes.draw do
resources :hits, :controller => "advertisement_hits", :only => [:create]
end
resource :source, :only => [:show]
+ resource :related_tag, :only => [:show]
resources :artists do
member do
put :revert
diff --git a/test/functional/related_tags_controller_test.rb b/test/functional/related_tags_controller_test.rb
new file mode 100644
index 000000000..9f2bbe128
--- /dev/null
+++ b/test/functional/related_tags_controller_test.rb
@@ -0,0 +1,7 @@
+require 'test_helper'
+
+class RelatedTagsControllerTest < ActionController::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
diff --git a/test/unit/related_tag_query_test.rb b/test/unit/related_tag_query_test.rb
index 81b1b983d..0f6d4ff58 100644
--- a/test/unit/related_tag_query_test.rb
+++ b/test/unit/related_tag_query_test.rb
@@ -24,6 +24,10 @@ class RelatedTagQueryTest < ActiveSupport::TestCase
should "work" do
assert_equal(["aaa", "bbb", "ccc"], @query.tags)
end
+
+ should "render the json" do
+ assert_equal("{\"query\":\"aaa\",\"category\":\"\",\"tags\":[[\"aaa\",0],[\"bbb\",0],[\"ccc\",0]],\"wiki_page_tags\":[]}", @query.to_json)
+ end
end
context "for a tag that doesn't exist" do