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" => %{

Tags

}, - "humanized" => nil, "relatedbutton" => "General", "css" => { "color" => "var(--general-tag-color)", @@ -259,12 +258,6 @@ module Danbooru "short" => "char", "extra" => ["ch"], "header" => %{

Characters

}, - "humanized" => { - "slice" => 5, - "exclusion" => [], - "regexmap" => /^(.+?)(?:_\(.+\))?$/, - "formatstr" => "%s" - }, "relatedbutton" => "Characters", "css" => { "color" => "var(--character-tag-color)", @@ -276,12 +269,6 @@ module Danbooru "short" => "copy", "extra" => ["co"], "header" => %{}, - "humanized" => { - "slice" => 1, - "exclusion" => [], - "regexmap" => //, - "formatstr" => "(%s)" - }, "relatedbutton" => "Copyrights", "css" => { "color" => "var(--copyright-tag-color)", @@ -293,12 +280,6 @@ module Danbooru "short" => "art", "extra" => [], "header" => %{

Artists

}, - "humanized" => { - "slice" => 0, - "exclusion" => %w(banned_artist), - "regexmap" => //, - "formatstr" => "drawn by %s" - }, "relatedbutton" => "Artists", "css" => { "color" => "var(--artist-tag-color)", @@ -310,7 +291,6 @@ module Danbooru "short" => "meta", "extra" => [], "header" => %{

Meta

}, - "humanized" => nil, "relatedbutton" => nil, "css" => { "color" => "var(--meta-tag-color)", @@ -322,11 +302,6 @@ module Danbooru #TAG ORDERS - #Sets the order of the humanized essential tag string (models/post.rb) - def humanized_tag_category_list - @humanized_tag_category_list ||= ["character","copyright","artist"] - end - #Sets the order of the split tag header list (presenters/tag_set_presenter.rb) def split_tag_header_list @split_tag_header_list ||= ["copyright","character","artist","general","meta"]