diff --git a/app/assets/javascripts/related_tag.js b/app/assets/javascripts/related_tag.js
index bf87c744a..95d2dbfde 100644
--- a/app/assets/javascripts/related_tag.js
+++ b/app/assets/javascripts/related_tag.js
@@ -125,6 +125,7 @@
this.build_recent_and_frequent($dest);
$dest.append(this.build_html(query, related_tags, "general"));
+ this.build_translated($dest);
if (wiki_page_tags.length) {
$dest.append(Danbooru.RelatedTag.build_html("wiki:" + query, wiki_page_tags, "wiki"));
}
@@ -173,6 +174,12 @@
}
}
+ Danbooru.RelatedTag.build_translated = function($dest) {
+ if (Danbooru.RelatedTag.translated_tags && Danbooru.RelatedTag.translated_tags.length) {
+ $dest.append(this.build_html("translated", Danbooru.RelatedTag.translated_tags, "translated"));
+ }
+ }
+
Danbooru.RelatedTag.build_html = function(query, related_tags, name, is_wide_column) {
if (query === null || query === "") {
return "";
diff --git a/app/assets/javascripts/uploads.js b/app/assets/javascripts/uploads.js
index ae256ac0b..e07430064 100644
--- a/app/assets/javascripts/uploads.js
+++ b/app/assets/javascripts/uploads.js
@@ -85,6 +85,9 @@
$("#source-artist").html('' + data.artist_name + '');
$("#source-tags").html(tag_html);
+
+ Danbooru.RelatedTag.translated_tags = data.translated_tags;
+ Danbooru.RelatedTag.build_all();
var new_artist_link = 'new';
diff --git a/app/assets/stylesheets/specific/wiki_pages.css.scss b/app/assets/stylesheets/specific/wiki_pages.css.scss
index 6c114ec19..cd5b6c5eb 100644
--- a/app/assets/stylesheets/specific/wiki_pages.css.scss
+++ b/app/assets/stylesheets/specific/wiki_pages.css.scss
@@ -1,4 +1,4 @@
-div#c-wiki-pages {
+div#c-wiki-pages, div#excerpt {
span.version {
color: #AAA;
}
@@ -27,4 +27,12 @@ div#c-wiki-pages {
margin-left: 15em;
padding-left: 1em;
}
+
+ .hint {
+ display: block;
+ }
+
+ .other-name {
+ font-weight: bold;
+ }
}
diff --git a/app/helpers/wiki_page_versions_helper.rb b/app/helpers/wiki_page_versions_helper.rb
index fa8e9c28f..b36604f92 100644
--- a/app/helpers/wiki_page_versions_helper.rb
+++ b/app/helpers/wiki_page_versions_helper.rb
@@ -48,4 +48,24 @@ module WikiPageVersionsHelper
output.join.gsub(/\r?\n/, '
').html_safe
end
+
+ def wiki_page_other_names_diff(thispage, otherpage)
+ new_names = otherpage.other_names_array
+ old_names = thispage.other_names_array
+ added_names = new_names - old_names
+ removed_names = old_names - new_names
+ unchanged_names = new_names & old_names
+
+ html = []
+ added_names.each do |name|
+ html << '' + name + ''
+ end
+ removed_names.each do |name|
+ html << '' + name + ''
+ end
+ unchanged_names.each do |name|
+ html << '' + name + ''
+ end
+ return html.join(" ").html_safe
+ end
end
diff --git a/app/helpers/wiki_pages_helper.rb b/app/helpers/wiki_pages_helper.rb
index afe7033fe..8b1f11674 100644
--- a/app/helpers/wiki_pages_helper.rb
+++ b/app/helpers/wiki_pages_helper.rb
@@ -47,4 +47,9 @@ module WikiPagesHelper
html.html_safe
end
+
+ def wiki_page_other_names_list(wiki_page)
+ names_html = wiki_page.other_names_array.map{|name| content_tag("span", name, :class => "other-name")}
+ names_html.join(", ").html_safe
+ end
end
diff --git a/app/logical/sources/site.rb b/app/logical/sources/site.rb
index b88d50201..1202fd8a6 100644
--- a/app/logical/sources/site.rb
+++ b/app/logical/sources/site.rb
@@ -18,12 +18,17 @@ module Sources
end
end
+ def translated_tags
+ WikiPage.other_names_match(tags.map(&:first)).map{|wiki_page| [wiki_page.title, wiki_page.category_name]}
+ end
+
def to_json
return {
:artist_name => artist_name,
:profile_url => profile_url,
:image_url => image_url,
:tags => tags,
+ :translated_tags => translated_tags,
:danbooru_name => artist_record.try(:first).try(:name),
:danbooru_id => artist_record.try(:first).try(:id),
:unique_id => unique_id
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 65ce87e2b..c022d0eed 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -1,5 +1,6 @@
class WikiPage < ActiveRecord::Base
before_save :normalize_title
+ before_save :normalize_other_names
before_validation :initialize_creator, :on => :create
before_validation :initialize_updater
after_save :create_version
@@ -10,7 +11,7 @@ class WikiPage < ActiveRecord::Base
validates_presence_of :title
validate :validate_locker_is_janitor
validate :validate_not_locked
- attr_accessible :title, :body, :is_locked
+ attr_accessible :title, :body, :is_locked, :other_names
has_one :tag, :foreign_key => "name", :primary_key => "title"
has_one :artist, lambda {where(:is_active => true)}, :foreign_key => "name", :primary_key => "title"
has_many :versions, lambda {order("wiki_page_versions.id ASC")}, :class_name => "WikiPageVersion", :dependent => :destroy
@@ -32,6 +33,12 @@ class WikiPage < ActiveRecord::Base
end
end
+ def other_names_match(names)
+ names = names.map{|name| name.to_escaped_for_tsquery}
+ query_sql = names.join(" | ")
+ where("other_names_index @@ to_tsquery('danbooru', E?)", query_sql)
+ end
+
def search(params = {})
q = where("true")
params = {} if params.blank?
@@ -48,6 +55,10 @@ class WikiPage < ActiveRecord::Base
q = q.body_matches(params[:body_matches])
end
+ if params[:other_names_match].present?
+ q = q.other_names_match(params[:other_names_match].split(" "))
+ end
+
if params[:creator_name].present?
q = q.where("creator_id = (select _.id from users _ where lower(_.name) = ?)", params[:creator_name].tr(" ", "_").mb_chars.downcase)
end
@@ -65,7 +76,7 @@ class WikiPage < ActiveRecord::Base
module ApiMethods
def hidden_attributes
- super + [:body_index]
+ super + [:body_index, :other_names_index]
end
def serializable_hash(options = {})
@@ -113,6 +124,7 @@ class WikiPage < ActiveRecord::Base
self.title = version.title
self.body = version.body
self.is_locked = version.is_locked
+ self.other_names = version.other_names
end
def revert_to!(version)
@@ -124,6 +136,12 @@ class WikiPage < ActiveRecord::Base
self.title = title.mb_chars.downcase.tr(" ", "_")
end
+ def normalize_other_names
+ normalized_other_names = other_names.to_s.gsub(/\u3000/, " ").scan(/\S+/)
+ normalized_other_names = normalized_other_names.map{|name| name.downcase}
+ self.other_names = normalized_other_names.uniq.join(" ")
+ end
+
def creator_name
User.id_to_name(creator_id).tr("_", " ")
end
@@ -141,7 +159,8 @@ class WikiPage < ActiveRecord::Base
prev.update_attributes(
:title => title,
:body => body,
- :is_locked => is_locked
+ :is_locked => is_locked,
+ :other_names => other_names
)
end
@@ -156,12 +175,13 @@ class WikiPage < ActiveRecord::Base
:updater_ip_addr => CurrentUser.ip_addr,
:title => title,
:body => body,
- :is_locked => is_locked
+ :is_locked => is_locked,
+ :other_names => other_names
)
end
def create_version
- if title_changed? || body_changed? || is_locked_changed?
+ if title_changed? || body_changed? || is_locked_changed? || other_names_changed?
if merge_version?
merge_version
else
@@ -207,4 +227,8 @@ class WikiPage < ActiveRecord::Base
def visible?
artist.blank? || !artist.is_banned? || CurrentUser.user.is_janitor?
end
+
+ def other_names_array
+ other_names.to_s.scan(/\S+/)
+ end
end
diff --git a/app/models/wiki_page_version.rb b/app/models/wiki_page_version.rb
index 3d2b4bd23..dbf269bce 100644
--- a/app/models/wiki_page_version.rb
+++ b/app/models/wiki_page_version.rb
@@ -2,7 +2,7 @@ class WikiPageVersion < ActiveRecord::Base
belongs_to :wiki_page
belongs_to :updater, :class_name => "User"
belongs_to :artist
- attr_accessible :wiki_page_id, :title, :body, :is_locked, :updater_id, :updater_ip_addr, :version
+ attr_accessible :wiki_page_id, :title, :body, :is_locked, :updater_id, :updater_ip_addr, :version, :other_names
module SearchMethods
def for_user(user_id)
@@ -43,4 +43,7 @@ class WikiPageVersion < ActiveRecord::Base
artist.blank? || !artist.is_banned? || CurrentUser.user.is_janitor?
end
+ def other_names_array
+ other_names.to_s.scan(/\S+/)
+ end
end
diff --git a/app/views/posts/partials/index/_excerpt.html.erb b/app/views/posts/partials/index/_excerpt.html.erb
index 2cb93b36c..0ec1b73c9 100644
--- a/app/views/posts/partials/index/_excerpt.html.erb
+++ b/app/views/posts/partials/index/_excerpt.html.erb
@@ -41,6 +41,10 @@
<% elsif post_set.has_wiki? %>
<%= wiki_page_other_names_list(post_set.wiki_page) %>
+ <% end %> + <%= format_text(post_set.wiki_page.presenter.excerpt) %> <% if post_set.wiki_page.artist %> diff --git a/app/views/wiki_page_versions/diff.html.erb b/app/views/wiki_page_versions/diff.html.erb index 429be93d0..e70f1b79a 100644 --- a/app/views/wiki_page_versions/diff.html.erb +++ b/app/views/wiki_page_versions/diff.html.erb @@ -4,6 +4,8 @@Showing differences between <%= compact_time @thispage.created_at %> (<%= link_to_user @thispage.updater %>) and <%= compact_time @otherpage.created_at %> (<%= link_to_user @otherpage.updater %>)
+<%= wiki_page_other_names_diff(@thispage, @otherpage) %>
+<%= wiki_page_other_names_list(@wiki_page_version) %>
+ <% end %> + <%= format_text(@wiki_page_version.body) %> <% else %>This artist has requested removal of their information.
diff --git a/app/views/wiki_pages/_form.html.erb b/app/views/wiki_pages/_form.html.erb index 53dcd1bb1..d074d358d 100644 --- a/app/views/wiki_pages/_form.html.erb +++ b/app/views/wiki_pages/_form.html.erb @@ -6,6 +6,8 @@ <%= f.input :title, :as => :string %> <% end %> + <%= f.input :other_names, :as => :text, :label => "Other names (view help)".html_safe, :hint => "Names used for this tag on other sites such as Pixiv. Separate with spaces." %> + <%= dtext_field "wiki_page", "body" %> <% if CurrentUser.user.is_janitor? %> diff --git a/app/views/wiki_pages/search.html.erb b/app/views/wiki_pages/search.html.erb index b343af1f9..9d102c7d4 100644 --- a/app/views/wiki_pages/search.html.erb +++ b/app/views/wiki_pages/search.html.erb @@ -4,6 +4,7 @@ <%= search_field "title", :hint => "Use * for wildcard searches" %> <%= search_field "creator_name" %> <%= search_field "body_matches", :label => "Body" %> + <%= search_field "other_names_match", :label => "Other names" %><%= wiki_page_other_names_list(@wiki_page) %>
+ <% end %> + <%= format_text(@wiki_page.body) %> <% if @wiki_page.artist %> diff --git a/db/migrate/20140505000956_add_other_names_to_wiki_pages.rb b/db/migrate/20140505000956_add_other_names_to_wiki_pages.rb new file mode 100644 index 000000000..b6ee5d69d --- /dev/null +++ b/db/migrate/20140505000956_add_other_names_to_wiki_pages.rb @@ -0,0 +1,10 @@ +class AddOtherNamesToWikiPages < ActiveRecord::Migration + def change + add_column :wiki_pages, :other_names, :text + add_column :wiki_pages, :other_names_index, :tsvector + add_column :wiki_page_versions, :other_names, :text + + execute "CREATE INDEX index_wiki_pages_on_other_names_index ON wiki_pages USING GIN (other_names_index)" + execute "CREATE TRIGGER trigger_wiki_pages_on_update_for_other_names BEFORE INSERT OR UPDATE ON wiki_pages FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('other_names_index', 'public.danbooru', 'other_names')" + end +end