Files
Redmine/lib/tasks/icons.rake

143 lines
4.3 KiB
Ruby
Raw Normal View History

# 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?
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, '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)
require "svg_sprite"
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