diff options
author | Marius Balteanu <marius.balteanu@zitec.com> | 2024-10-08 21:53:53 +0000 |
---|---|---|
committer | Marius Balteanu <marius.balteanu@zitec.com> | 2024-10-08 21:53:53 +0000 |
commit | 5d67308977050bbc77941ca1bfc86ba20d08f29d (patch) | |
tree | 9e722764ca35e2dc75aaa422cddce590b340bcee /lib | |
parent | a8c9e9124578858963167cd02d99025812b2a8ff (diff) | |
download | redmine-5d67308977050bbc77941ca1bfc86ba20d08f29d.tar.gz redmine-5d67308977050bbc77941ca1bfc86ba20d08f29d.zip |
Adds rake task to download SVG icons from Tabler Github repository using config/icon_source.yml as source and to generate a sprite file with all the SVG icons (#23980):
* @icons:download@: downloads the default icons
* @icons:sprite@: generates the SVG sprite file for the default icons
* @icons:generate@: runs @icons:download@ and @icons:sprite@ tasks
* @icons:plugin:download@: downloads the icons for a specific plugin if the plugin provides a @icon_source.yaml@ in plugin config directory.
* @icons:plugin:sprite@: generates the SVG sprite for the plugin.
* @icons:plugin:generate@: runs @icons:plugin:download@ and @icons:plugin:sprite@ tasks
git-svn-id: https://svn.redmine.org/redmine/trunk@23105 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'lib')
-rw-r--r-- | lib/tasks/icons.rake | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/lib/tasks/icons.rake b/lib/tasks/icons.rake new file mode 100644 index 000000000..bda10f2a2 --- /dev/null +++ b/lib/tasks/icons.rake @@ -0,0 +1,142 @@ +# Redmine - project management software +# Copyright (C) 2006- Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +unless Rails.env.production? + require "svg_sprite" + + ICON_RELEASE_VERSION = "v3.19.0" + ICON_DEFAULT_STYLE = "outline" + SOURCE = URI.parse("https://raw.githubusercontent.com/tabler/tabler-icons/#{ICON_RELEASE_VERSION}/icons") + + namespace :icons do + + desc 'Downloads default SVG icons' + task :download do + icons_mapping = YAML.load_file(Rails.root.join('config/icon_source.yml')) + destination_path = Rails.root.join("tmp", "icons", "default") + + download_sgv_icons(icons_mapping, destination_path) + end + + desc "Generates SVG sprite file default SVG icons" + task :sprite do + input_path = Rails.root.join("tmp", "icons", "default") + sprite_path = Rails.root.join('app', 'assets', 'images', 'icons.svg') + + generate_svg_sprite(input_path, sprite_path) + end + + desc 'Downloads default SVG icons and generates a SVG sprite from the icons' + task :generate do + Rake::Task["icons:download"].execute + Rake::Task["icons:sprite"].execute + end + + namespace :plugin do + desc 'Downloads SVG icons for plugin' + task :download do + name = ENV['NAME'] + + if name.nil? + abort "The VERSION argument requires a plugin NAME." + end + + icons_mapping_path = Rails.root.join('plugins', name, 'config', 'icon_source.yml') + unless File.file?(icons_mapping_path) + abort "Icon source file for #{name} plugin not found in #{icons_mapping_path}." + end + + icons_mapping = YAML.load_file(icons_mapping_path) + destination_path = Rails.root.join("tmp", "icons", name) + + download_sgv_icons(icons_mapping, destination_path) + end + + desc "Generates SVG sprite for plugin" + task :sprite do + name = ENV['NAME'] + + if name.nil? + abort "The VERSION argument requires a plugin NAME." + end + + input_path = Rails.root.join("tmp", "icons", name) + sprite_path = Rails.root.join('plugins', name, 'app', 'assets', 'images', 'icons.svg') + + generate_svg_sprite(input_path, sprite_path) + end + + desc 'Downloads SVG icons and generates sprite for plugin' + task :generate do + Rake::Task["icons:plugin:download"].execute + Rake::Task["icons:plugin:sprite"].execute + end + end + end + + def download_sgv_icons(icons_mapping, destination) + http = Net::HTTP.new(SOURCE.host, SOURCE.port) + http.use_ssl = true + + FileUtils.rm_rf(destination) + FileUtils.mkdir_p(destination) + + icons_mapping.each do |v| + name = v['name'] + svg = v['svg'] + style = v['style'] || ICON_DEFAULT_STYLE + + http.start do |h| + source = "#{SOURCE}/#{style}/#{svg}.svg" + + puts "Downloading #{name} from #{source}..." + req = Net::HTTP::Get.new(source) + res = h.request(req) + + case res + when Net::HTTPSuccess + target = File.join(destination, "#{name}.svg") + File.open(target, 'w') do |f| + f.write res.body + end + else + abort "Error when trying to download the icon for #{name}" + end + end + end + end + + def generate_svg_sprite(input_path, sprite_path) + SvgSprite.call( + input: input_path, + name: 'icon', + css_path: File.join(input_path, 'icons.css'), + sprite_path: sprite_path, + optimize: true + ) + + doc = Nokogiri::XML(sprite_path) + + doc.traverse do |node| + node.keys.each do |attribute| + node.delete attribute if ["fill", "stroke", "stroke-width"].include?(attribute) + end + end + + File.write(sprite_path, doc.to_xml) + end +end |