From 3a544ba5e0fe8c909fc02646deae103ccda7aa74 Mon Sep 17 00:00:00 2001 From: evazion Date: Sat, 26 Oct 2019 02:26:43 -0500 Subject: [PATCH] Fix tag ordering in humanized_essential_tag_string. * Pick the largest character or copyright tags by post count. Previously we picked the tags with the longest names, which was nonsensical. * Remove tag cateogory logic from config file. We can't avoid hardcoding some knowledge about tag categories here, so there's no point in trying. This affects tab titles on post show pages as well as filenames in downloaded images. --- app/logical/tag_category.rb | 9 ---- app/models/tag.rb | 71 +++++++++++++++-------------- app/presenters/tag_set_presenter.rb | 37 ++++++--------- config/danbooru_default_config.rb | 25 ---------- 4 files changed, 51 insertions(+), 91 deletions(-) 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"]