lib/usps_flags/generate.rb in usps_flags-0.4.1 vs lib/usps_flags/generate.rb in usps_flags-0.5.0

- old
+ new

@@ -1,10 +1,13 @@ # frozen_string_literal: false # Controller class for generating files. class USPSFlags::Generate + require 'usps_flags/generate/private' + class << self + include USPSFlags::Generate::Private # The primary controller method. Generates an SVG file or SVG data. # # @param [String] flag The flag type to generate. # @param [String] outfile The path to save the SVG file to. If not set, prints to console. # @param [Boolean] field Whether to generate the flag field (including any border). @@ -13,21 +16,13 @@ def svg(flag, outfile: nil, scale: nil, field: true) flag = flag.upcase.delete('/', '_', 'PENNANT') USPSFlags::Helpers.ensure_dir_for_file(outfile) - if ['CRUISE', 'OIC'].include?(flag) - USPSFlags::Generate::Flag.pennant(type: flag, outfile: outfile, scale: scale) - elsif flag == 'ENSIGN' - USPSFlags::Generate::Flag.ensign(outfile: outfile, scale: scale) - elsif flag == 'US' - USPSFlags::Generate::Flag.us(outfile: outfile, scale: scale) - elsif flag == 'WHEEL' - USPSFlags::Generate::Flag.wheel(outfile: outfile, scale: scale) - else - USPSFlags::Generate::Flag.officer(rank: flag, outfile: outfile, scale: scale, field: field) - end + output = special_flag(flag, outfile, scale) + output ||= USPSFlags::Generate::Flag.officer(rank: flag, outfile: outfile, scale: scale, field: field) + output end # Convert SVG data into a PNG file. # # @param [String] svg The SVG data. @@ -39,17 +34,11 @@ set_temp_svg(svg) USPSFlags::Helpers.ensure_dir_for_file(outfile) - MiniMagick::Tool::Convert.new do |convert| - convert << '-background' << background - convert << '-format' << 'png' - convert << '-trim' if trim - convert << @temp_svg_path - convert << outfile - end + generate_png(background, trim, outfile) ensure ::File.delete(@temp_svg_path) if delete_temp_svg? end # Generate all static SVG and PNG files, and automaticall generates zip archives for download. @@ -57,25 +46,30 @@ # @param [Boolean] svg Whether to generate SVG images. # @param [Boolean] png Whether to generate PNG images. # @param [Boolean] zips Whether to create zip archives for all images created. Does not create a zip for skipped formats. # @param [Boolean] reset Whether to delete all previous files before generating new files. def all(svg: true, png: true, zips: true, reset: true) - raise USPSFlags::Errors::StaticFilesGenerationError, 'At least one argument switch must be true out of [svg, png, zips, reset].' unless svg || png || zips || reset + all_arg_error unless any_all_arg?(svg, png, zips, reset) - overall_start_time = Time.now - remove_static_files if reset - images(svg: svg, png: png) if svg || png - zips(svg: svg, png: png) if zips - USPSFlags::Helpers.log "\nTotal run time: #{Time.now - overall_start_time} s\n\n" + track_time do + remove_static_files if reset + images(svg: svg, png: png) if svg || png + zips(svg: svg, png: png) if zips + end end # Generate zip archives of current static image files. # # @param [Boolean] svg Generate zip archive of SVG images. # @param [Boolean] png Generate zip archive of PNG images. def zips(svg: true, png: true) - raise USPSFlags::Errors::ZipGenerationError, 'At least one argument switch must be true out of [svg, png].' unless svg || png + unless svg || png + raise( + USPSFlags::Errors::ZipGenerationError, + 'At least one argument switch must be true out of [svg, png].' + ) + end generate_zip('svg') if svg generate_zip('png') if png end @@ -96,181 +90,39 @@ # @param [Integer] fly The nominal fly length of an appropriate flag field for the generated tridents. Size labels scale to this size. # @param [String] outfile The unit to append to all trident measurements. # @param [String] scale The image scale divisor factor. # @return [String] Returns the SVG data. def spec(outfile: nil, fly: USPSFlags::Config::BASE_FLY, unit: nil, scale: nil, scaled_border: false) - svg = '' + svg = +'' svg << USPSFlags::Core.headers(scale: scale, title: 'USPS Trident Specifications') svg << USPSFlags::Core.trident_spec(fly: fly, unit: unit, scaled_border: scaled_border) svg << USPSFlags::Core.footer USPSFlags::Helpers.output(svg, outfile: outfile) end private - def remove_static_files - ['SVG', 'PNG', 'ZIP'].each do |dir| - dir_path = "#{USPSFlags.configuration.flags_dir}/#{dir}" - ::FileUtils.rm_rf(::Dir.glob("#{dir_path}/*")) if ::Dir.exist?(dir_path) + def special_flag(flag, outfile, scale) + case flag + when 'CRUISE', 'OIC' + USPSFlags::Generate::Flag.pennant(type: flag, outfile: outfile, scale: scale) + when 'ENSIGN' + USPSFlags::Generate::Flag.ensign(outfile: outfile, scale: scale) + when 'US' + USPSFlags::Generate::Flag.us(outfile: outfile, scale: scale) + when 'WHEEL' + USPSFlags::Generate::Flag.wheel(outfile: outfile, scale: scale) end - ['SVG/insignia', 'PNG/insignia'].each { |dir| ::FileUtils.mkdir_p("#{USPSFlags.configuration.flags_dir}/#{dir}") } - USPSFlags::Helpers.log "\n - Cleared previous files.\n" end - def set_file_paths - @svg_file = "#{USPSFlags.configuration.flags_dir}/SVG/#{@flag}.svg" - @png_file = @svg_file.gsub('/SVG/', '/PNG/').gsub('.svg', '.png') - @svg_ins_file = @svg_file.gsub('/SVG/', '/SVG/insignia/') - @png_ins_file = @svg_file.gsub('/SVG/', '/PNG/insignia/').gsub('.svg', '.png') - [@svg_file, @png_file, @svg_ins_file, @png_ins_file] - end - - def static_generation_header - puts "\nSVGs generate a single file.", - 'PNGs generate full-res, 1500w, 1000w, 500w, and thumbnail files.', - 'Corresponding rank insignia (including smaller sizes) are also generated, as appropriate.' - USPSFlags::Helpers.log "\nGeneration location: #{USPSFlags.configuration.flags_dir}\n" - USPSFlags::Helpers.log "\n#{Time.now.strftime('%Y%m%d.%H%M%S%z')} – Generating static files...\n\n" - USPSFlags::Helpers.log "Flag | SVG | PNG | Run time\n".rjust(USPSFlags::Helpers.max_flag_name_length + 31), - "\n".rjust(USPSFlags::Helpers.max_flag_name_length + 32, '-') - end - - def generate_zip(type) - raise USPSFlags::Errors::ZipGenerationError, 'Flags directory not found.' unless ::Dir.exist?("#{USPSFlags.configuration.flags_dir}/ZIP") - - zip = "#{USPSFlags.configuration.flags_dir}/ZIP/USPS_Flags.#{type}.zip" - ::File.delete(zip) if ::File.exist?(zip) - - ::Zip::File.open(zip, Zip::File::CREATE) do |z| - ::Dir.glob("#{USPSFlags.configuration.flags_dir}/#{type.upcase}/**/*").each do |f| - add_to_zip(z, f) - end + def generate_png(background, trim, outfile) + MiniMagick::Tool::Convert.new do |convert| + convert << '-background' << background + convert << '-format' << 'png' + convert << '-trim' if trim + convert << @temp_svg_path + convert << outfile end - puts "Generated #{type.upcase} Zip" - end - - def add_to_zip(z, f) - filename = f.split('/').last - filename = "insignia/#{filename}" if f.split('/').last(2).first == 'insignia' - z.add(filename, f) - end - - def generate_static_images_for(flag, svg: true, png: true) - start_time = Time.now - @flag = flag.upcase - USPSFlags::Helpers.log "#{@flag.rjust(USPSFlags::Helpers.max_flag_name_length)} |" - - set_file_paths - - svg ? generate_static_svg : USPSFlags::Helpers.log('-') - png ? generate_static_png : USPSFlags::Helpers.log('- ') - - run_time = (Time.now - start_time).round(4).to_s[(0..5)].ljust(6, '0') - USPSFlags::Helpers.log " | #{run_time} s\n" - end - - def generate_static_svg - USPSFlags::Helpers.log ' ' - - generate_regular_svg - generate_insignia_svg - end - - def generate_regular_svg - return if file_found?(@svg_file) - - svg @flag, outfile: @svg_file, scale: 1 - USPSFlags::Helpers.log 'S' - end - - def generate_insignia_svg - return if no_insignia? - - svg @flag, field: false, outfile: @svg_ins_file, scale: 1 - USPSFlags::Helpers.log 'I' - end - - def set_temp_svg(svg) - @temp_svg_path = "#{USPSFlags.configuration.flags_dir}/temp.svg" - temp_svg = ::File.new(@temp_svg_path, 'w+') - temp_svg.write(svg) - temp_svg.flush - @temp_svg_path - end - - def delete_temp_svg? - !@temp_svg_path.to_s.empty? && ::File.exist?(@temp_svg_path) - end - - def generate_static_png - USPSFlags::Helpers.log ' | ' - generate_fullsize_png - generate_fullsize_png_insignia - generate_reduced_size_pngs - end - - def generate_fullsize_png - return if file_found?(@png_file) - - png(File.read(@svg_file), outfile: @png_file) - USPSFlags::Helpers.log 'F' - end - - def generate_fullsize_png_insignia - return if no_insignia? - return if file_found?(@png_ins_file) - - png(File.read(@svg_ins_file), outfile: @png_ins_file, trim: true) - USPSFlags::Helpers.log 'I' - end - - def generate_reduced_size_pngs - USPSFlags::Helpers.png_sizes.keys.each do |size| - size, size_key = USPSFlags::Helpers.size_and_key(size: size, flag: @flag) - @sized_png_file = "#{USPSFlags.configuration.flags_dir}/PNG/#{@flag}.#{size_key}.png" - @sized_png_ins_file = @sized_png_file.gsub('/PNG/', '/PNG/insignia/') - - generate_smaller_png(size, size_key) - generate_smaller_png_insignia(size, size_key) - end - end - - def generate_smaller_png(size, size_key) - return if file_found?(@sized_png_file) - return if too_big?(@png_file, size) - - USPSFlags::Helpers.resize_png(@png_file, file: @flag, size: size, size_key: size_key) - USPSFlags::Helpers.log USPSFlags::Helpers.png_sizes[size_key] - end - - def generate_smaller_png_insignia(size, size_key) - return if no_insignia? - return if file_found?(@sized_png_ins_file) - return if too_big?(@png_ins_file, size) - - USPSFlags::Helpers.resize_png(@png_ins_file, file: "insignia/#{@flag}", size: size, size_key: size_key) - USPSFlags::Helpers.log 'i' - end - - def no_insignia? - return false if USPSFlags::Helpers.valid_flags(:insignia).include?(@flag) - - USPSFlags::Helpers.log '-' - true - end - - def file_found?(file) - return false unless ::File.exist?(file) - - USPSFlags::Helpers.log '.' - true - end - - def too_big?(file, size) - return false unless size > MiniMagick::Image.open(file)[:width] - - USPSFlags::Helpers.log '+' - true end end end