diff --git a/app/logical/tag_category.rb b/app/logical/tag_category.rb index d62a592a4..2ffdb64e9 100644 --- a/app/logical/tag_category.rb +++ b/app/logical/tag_category.rb @@ -24,11 +24,6 @@ class TagCategory @@short_name_mapping ||= Hash[Danbooru.config.full_tag_config_info.map {|k,v| [v["short"],k]}] end - # Returns a hash mapping for humanized_essential_tag_string (models/post.rb) - def humanized_mapping - @@humanized_mapping ||= Hash[Danbooru.config.full_tag_config_info.map {|k,v| [k,v["humanized"]]}] - end - # Returns a hash mapping for split_tag_list_html (presenters/tag_set_presenter.rb) def header_mapping @@header_mapping ||= Hash[Danbooru.config.full_tag_config_info.map {|k,v| [k,v["header"]]}] @@ -58,10 +53,6 @@ class TagCategory @@short_name_list ||= short_name_mapping.keys end - def humanized_list - Danbooru.config.humanized_tag_category_list - end - def split_header_list Danbooru.config.split_tag_header_list end diff --git a/app/models/tag.rb b/app/models/tag.rb index fb6086cca..16d7bacdf 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -218,46 +218,52 @@ class Tag < ApplicationRecord end end - module NameMethods - def normalize_name(name) - name.to_s.mb_chars.downcase.strip.tr(" ", "_").to_s + concerning :NameMethods do + def unqualified_name + name.gsub(/_\(.*\)\z/, "").tr("_", " ") end - def create_for_list(names) - names.map {|x| find_or_create_by_name(x).name} - end - - def find_or_create_by_name(name, creator: CurrentUser.user) - name = normalize_name(name) - category = nil - - if name =~ /\A(#{categories.regexp}):(.+)\Z/ - category = $1 - name = $2 + class_methods do + def normalize_name(name) + name.to_s.mb_chars.downcase.strip.tr(" ", "_").to_s end - tag = find_by_name(name) + def create_for_list(names) + names.map {|x| find_or_create_by_name(x).name} + end - if tag - if category - category_id = categories.value_for(category) + def find_or_create_by_name(name, creator: CurrentUser.user) + name = normalize_name(name) + category = nil - # in case a category change hasn't propagated to this server yet, - # force an update the local cache. This may get overwritten in the - # next few lines if the category is changed. - tag.update_category_cache - - if tag.editable_by?(creator) - tag.update(category: category_id) - end + if name =~ /\A(#{categories.regexp}):(.+)\Z/ + category = $1 + name = $2 end - tag - else - Tag.new.tap do |t| - t.name = name - t.category = categories.value_for(category) - t.save + tag = find_by_name(name) + + if tag + if category + category_id = categories.value_for(category) + + # in case a category change hasn't propagated to this server yet, + # force an update the local cache. This may get overwritten in the + # next few lines if the category is changed. + tag.update_category_cache + + if tag.editable_by?(creator) + tag.update(category: category_id) + end + end + + tag + else + Tag.new.tap do |t| + t.name = name + t.category = categories.value_for(category) + t.save + end end end end @@ -921,7 +927,6 @@ class Tag < ApplicationRecord include CountMethods include CategoryMethods extend StatisticsMethods - extend NameMethods extend ParseMethods extend SearchMethods end diff --git a/app/presenters/tag_set_presenter.rb b/app/presenters/tag_set_presenter.rb index 52e379b79..cd99ba42b 100644 --- a/app/presenters/tag_set_presenter.rb +++ b/app/presenters/tag_set_presenter.rb @@ -61,33 +61,22 @@ class TagSetPresenter < Presenter end.reject(&:blank?).join(" \n") end - def humanized_essential_tag_string(category_list: TagCategory.humanized_list, default: "") - strings = category_list.map do |category| - mapping = TagCategory.humanized_mapping[category] - max_tags = mapping["slice"] - regexmap = mapping["regexmap"] - formatstr = mapping["formatstr"] - excluded_tags = mapping["exclusion"] + def humanized_essential_tag_string(default: "") + chartags = tags_for_category("character") + characters = chartags.max_by(5, &:post_count).map(&:unqualified_name) + characters += ["#{chartags.size - 5} more"] if chartags.size > 5 + characters = characters.to_sentence - type_tags = tags_for_category(category).map(&:name) - excluded_tags - next if type_tags.empty? + copytags = tags_for_category("copyright") + copyrights = copytags.max_by(1, &:post_count).map(&:unqualified_name) + copyrights += ["#{copytags.size - 1} more"] if copytags.size > 1 + copyrights = copyrights.to_sentence + copyrights = "(#{copyrights})" if characters.present? - if max_tags > 0 && type_tags.length > max_tags - type_tags = type_tags.sort_by {|x| -x.size}.take(max_tags) + ["etc"] - end + artists = tags_for_category("artist").map(&:name).grep_v("banned_artist").to_sentence + artists = "drawn by #{artists}" if artists.present? - if regexmap != // - type_tags = type_tags.map { |tag| tag.match(regexmap)[1] } - end - - if category == "copyright" && tags_for_category("character").blank? - type_tags.to_sentence - else - formatstr % type_tags.to_sentence - end - end - - strings = strings.compact.join(" ").tr("_", " ") + strings = "#{characters} #{copyrights} #{artists}" strings.blank? ? default : strings end diff --git a/config/danbooru_default_config.rb b/config/danbooru_default_config.rb index e8054750a..4748e7023 100644 --- a/config/danbooru_default_config.rb +++ b/config/danbooru_default_config.rb @@ -247,7 +247,6 @@ module Danbooru "short" => "gen", "extra" => [], "header" => %{