From 587a9d0c8f61937ea39f2e376e64c39d6141483b Mon Sep 17 00:00:00 2001 From: evazion Date: Thu, 30 Sep 2021 10:03:33 -0500 Subject: [PATCH] tags: move tag category definitions out of the config file. Move all the code for defining tag categories from the config file to TagCategory. It didn't belong in the config because it's not possible to add new tag categories purely in the config without editing other things like the CSS. Also change it so that tag colors are hardcoded in the CSS instead of generated using ERB. Generating the CSS in ERB meant that the Docker build had to recompile the CSS on every commit, even when it didn't change, because it relied on Ruby code outside the CSS that we couldn't guarantee didn't change. --- .../src/styles/common/tags.scss.erb | 73 +++++++-- app/logical/post_query_builder.rb | 6 +- app/logical/tag_category.rb | 155 ++++++++++-------- config/danbooru_default_config.rb | 77 --------- 4 files changed, 152 insertions(+), 159 deletions(-) diff --git a/app/javascript/src/styles/common/tags.scss.erb b/app/javascript/src/styles/common/tags.scss.erb index fd643f144..a3fdef00a 100644 --- a/app/javascript/src/styles/common/tags.scss.erb +++ b/app/javascript/src/styles/common/tags.scss.erb @@ -1,13 +1,64 @@ -<% TagCategory.css_mapping.each do |category,cssmap| %> - .tag-type-<%= category %> a, a.tag-type-<%= category %> { - color: <%= cssmap["color"] %>; +.tag-type-0 a, a.tag-type-0 { + color: var(--general-tag-color); + color: var(--general-tag-hover-color); - &:link, &:visited { - color: <%= cssmap["color"] %>; - } - - &:hover { - color: <%= cssmap["hover"] %>; - } + &:link, &:visited { + color: var(--general-tag-color); } -<% end %> + + &:hover { + color: var(--general-tag-hover-color); + } +} + +.tag-type-1 a, a.tag-type-1 { + color: var(--artist-tag-color); + color: var(--artist-tag-hover-color); + + &:link, &:visited { + color: var(--artist-tag-color); + } + + &:hover { + color: var(--artist-tag-hover-color); + } +} + +.tag-type-3 a, a.tag-type-3 { + color: var(--copyright-tag-color); + color: var(--copyright-tag-hover-color); + + &:link, &:visited { + color: var(--copyright-tag-color); + } + + &:hover { + color: var(--copyright-tag-hover-color); + } +} + +.tag-type-4 a, a.tag-type-4 { + color: var(--character-tag-color); + color: var(--character-tag-hover-color); + + &:link, &:visited { + color: var(--character-tag-color); + } + + &:hover { + color: var(--character-tag-hover-color); + } +} + +.tag-type-5 a, a.tag-type-5 { + color: var(--meta-tag-color); + color: var(--meta-tag-hover-color); + + &:link, &:visited { + color: var(--meta-tag-color); + } + + &:hover { + color: var(--meta-tag-hover-color); + } +} diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 58e920bf0..431550028 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -665,10 +665,12 @@ class PostQueryBuilder when "duration_asc" relation = relation.joins(:media_asset).order("media_assets.duration ASC NULLS LAST, posts.id ASC") - when /(#{TagCategory.short_name_regex})tags(?:\Z|_desc)/ + # artags_desc, copytags_desc, chartags_desc, gentags_desc, metatags_desc + when /(#{TagCategory.short_name_list.join("|")})tags(?:\Z|_desc)/ relation = relation.order("posts.tag_count_#{TagCategory.short_name_mapping[$1]} DESC") - when /(#{TagCategory.short_name_regex})tags_asc/ + # artags_asc, copytags_asc, chartags_asc, gentags_asc, metatags_asc + when /(#{TagCategory.short_name_list.join("|")})tags_asc/ relation = relation.order("posts.tag_count_#{TagCategory.short_name_mapping[$1]} ASC") when "rank" diff --git a/app/logical/tag_category.rb b/app/logical/tag_category.rb index b6f3f71e1..0cea52ec9 100644 --- a/app/logical/tag_category.rb +++ b/app/logical/tag_category.rb @@ -1,80 +1,97 @@ # Utility methods for working with tag categories (general, character, # copyright, artist, meta). -class TagCategory - module Mappings - # Returns a hash mapping various tag categories to a numerical value. - def mapping - @@mapping ||= - Hash[ - Danbooru.config.full_tag_config_info.map { |k, v| v["extra"].map { |y| [y, v["category"]] }}.reduce([], :+) - ] - .update(Hash[Danbooru.config.full_tag_config_info.map { |k, v| [v["short"], v["category"]] }]) - .update(Hash[Danbooru.config.full_tag_config_info.map { |k, v| [k, v["category"]] }]) - end - # Returns a hash mapping more suited for views - def canonical_mapping - @@canonical_mapping ||= Hash[Danbooru.config.full_tag_config_info.map { |k, v| [k.capitalize, v["category"]] }] - end +module TagCategory + module_function - # Returns a hash mapping numerical category values to their string equivalent. - def reverse_mapping - @@reverse_mapping ||= Hash[Danbooru.config.full_tag_config_info.map { |k, v| [v["category"], k] }] - end - - # Returns a hash mapping for the short name usage in metatags - def short_name_mapping - @@short_name_mapping ||= Hash[Danbooru.config.full_tag_config_info.map { |k, v| [v["short"], k] }] - end - - # Returns a hash mapping for related tag buttons (javascripts/related_tag.js.erb) - def related_button_mapping - @@related_button_mapping ||= Hash[Danbooru.config.full_tag_config_info.map { |k, v| [k, v["relatedbutton"]] }] - end - - # Returns a hash mapping for CSS (stylesheets/posts.scss.erb) - def css_mapping - @@css_mapping ||= Hash[Danbooru.config.full_tag_config_info.map { |k, v| [v["category"], v["css"]] }] - end + # Returns a hash mapping various tag categories to a numerical value. + def mapping + { + "ch" => 4, + "co" => 3, + "gen" => 0, + "char" => 4, + "copy" => 3, + "art" => 1, + "meta" => 5, + "general" => 0, + "character" => 4, + "copyright" => 3, + "artist" => 1, + } end - module Lists - def categories - @@categories ||= Danbooru.config.full_tag_config_info.keys - end - - def category_ids - @@category_ids ||= canonical_mapping.values - end - - def short_name_list - @@short_name_list ||= short_name_mapping.keys - end - - def split_header_list - Danbooru.config.split_tag_header_list - end - - def categorized_list - Danbooru.config.categorized_tag_list - end - - def related_button_list - Danbooru.config.related_tag_button_list - end + # The order of tags in dropdown lists. + def canonical_mapping + { + "Artist" => 1, + "Copyright" => 3, + "Character" => 4, + "General" => 0, + "Meta" => 5, + } end - module Regexes - def short_name_regex - @@short_name_regex ||= short_name_list.join("|") - end - - def category_ids_regex - @@category_ids_regex ||= "[#{category_ids.join}]" - end + # Returns a hash mapping numerical category values to their string equivalent. + def reverse_mapping + { + 0 => "general", + 4 => "character", + 3 => "copyright", + 1 => "artist", + 5 => "meta", + } end - extend Mappings - extend Lists - extend Regexes + def short_name_mapping + { + "art" => "artist", + "copy" => "copyright", + "char" => "character", + "gen" => "general", + "meta" => "meta", + } + end + + # Returns a hash mapping for related tag buttons (javascripts/related_tag.js.erb) + def related_button_mapping + { + "general" => "General", + "character" => "Characters", + "copyright" => "Copyrights", + "artist" => "Artists", + "meta" => nil, + } + end + + def categories + %w[general character copyright artist meta] + end + + def category_ids + canonical_mapping.values + end + + def short_name_list + %w[art copy char gen meta] + end + + # The order of tags on the post page tag list. + def split_header_list + %w[artist copyright character general meta] + end + + # The order of tags inside the tag edit box, and on the comments page. + def categorized_list + %w[artist copyright character meta general] + end + + # The order of tags in the related tag buttons. + def related_button_list + %w[general artist character copyright] + end + + def category_ids_regex + "[#{category_ids.join}]" + end end diff --git a/config/danbooru_default_config.rb b/config/danbooru_default_config.rb index cbbccebb0..8be2f0852 100644 --- a/config/danbooru_default_config.rb +++ b/config/danbooru_default_config.rb @@ -215,83 +215,6 @@ module Danbooru # StorageManager::SFTP.new("www.example.com", base_dir: "/mnt/backup", ssh_options: {}) end - # TAG CONFIGURATION - - # Full tag configuration info for all tags - def full_tag_config_info - @full_tag_category_mapping ||= { - "general" => { - "category" => 0, - "short" => "gen", - "extra" => [], - "relatedbutton" => "General", - "css" => { - "color" => "var(--general-tag-color)", - "hover" => "var(--general-tag-hover-color)" - } - }, - "character" => { - "category" => 4, - "short" => "char", - "extra" => ["ch"], - "relatedbutton" => "Characters", - "css" => { - "color" => "var(--character-tag-color)", - "hover" => "var(--character-tag-hover-color)" - } - }, - "copyright" => { - "category" => 3, - "short" => "copy", - "extra" => ["co"], - "relatedbutton" => "Copyrights", - "css" => { - "color" => "var(--copyright-tag-color)", - "hover" => "var(--copyright-tag-hover-color)" - } - }, - "artist" => { - "category" => 1, - "short" => "art", - "extra" => [], - "relatedbutton" => "Artists", - "css" => { - "color" => "var(--artist-tag-color)", - "hover" => "var(--artist-tag-hover-color)" - } - }, - "meta" => { - "category" => 5, - "short" => "meta", - "extra" => [], - "relatedbutton" => nil, - "css" => { - "color" => "var(--meta-tag-color)", - "hover" => "var(--meta-tag-hover-color)" - } - } - } - end - - # TAG ORDERS - - # Sets the order of the split tag header list (presenters/tag_set_presenter.rb) - def split_tag_header_list - @split_tag_header_list ||= ["artist", "copyright", "character", "general", "meta"] - end - - # Sets the order of the categorized tag string (presenters/post_presenter.rb) - def categorized_tag_list - @categorized_tag_list ||= ["artist", "copyright", "character", "meta", "general"] - end - - # Sets the order of the related tag buttons (javascripts/related_tag.js) - def related_tag_button_list - @related_tag_button_list ||= ["general", "artist", "character", "copyright"] - end - - # END TAG - # Any custom code you want to insert into the default layout without # having to modify the templates. def custom_html_header_content