lib/usps_flags/generate.rb in usps_flags-0.1.24 vs lib/usps_flags/generate.rb in usps_flags-0.1.25
- old
+ new
@@ -50,134 +50,24 @@
# @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 self.all(svg: true, png: true, zips: true, reset: true)
- if reset
- ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/SVG/*"))
- ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/PNG/*"))
- ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/ZIP/*"))
- ::FileUtils.mkdir_p("#{USPSFlags::Config.flags_dir}/SVG/insignia")
- ::FileUtils.mkdir_p("#{USPSFlags::Config.flags_dir}/PNG/insignia")
- puts "Cleared previous files."
- end
+ self.remove_static_files if reset
- flags = USPSFlags::Helpers.valid_flags(:all)
- insignia_flags = USPSFlags::Helpers.valid_flags(:insignia)
-
- max_length = flags.map(&:length).max
+ max_length = USPSFlags::Helpers.valid_flags(:all).map(&:length).max
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 "\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(max_length+31),
"\n".rjust(max_length+32, "-")
overall_start_time = Time.now
- flags.each do |flag|
- start_time = Time.now
- USPSFlags::Helpers.log " | | _ _ _ _ _ | \r".rjust(max_length+31, " ")
- flag = flag.upcase
- USPSFlags::Helpers.log "#{flag.rjust(max_length)} |"
-
- svg_file = "#{USPSFlags::Config.flags_dir}/SVG/#{flag}.svg"
- png_file = "#{USPSFlags::Config.flags_dir}/PNG/#{flag}.png"
-
- svg_ins_file = "#{USPSFlags::Config.flags_dir}/SVG/insignia/#{flag}.svg"
- png_ins_file = "#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.png"
-
- past = (flag[0] == "P" && flag != "PORTCAP")
-
- if svg
- begin
- USPSFlags::Helpers.log " "
- self.get flag, outfile: svg_file, scale: 1
- USPSFlags::Helpers.log "S"
- if past || !insignia_flags.include?(flag)
- USPSFlags::Helpers.log "-"
- else
- self.get flag, field: false, outfile: svg_ins_file, scale: 1
- USPSFlags::Helpers.log "I"
- end
- rescue => e
- USPSFlags::Helpers.log "x -> #{e.message}"
- end
- else
- USPSFlags::Helpers.log "-"
- end
-
- if png
- USPSFlags::Helpers.log " | "
- begin
- USPSFlags::Helpers.log "…\b"
- USPSFlags::Generate.png(File.read(svg_file), outfile: png_file) unless ::File.exists?(png_file)
- USPSFlags::Helpers.log "F"
- if past || !insignia_flags.include?(flag)
- USPSFlags::Helpers.log "-"
- else
- USPSFlags::Helpers.log "…\b"
- USPSFlags::Generate.png(File.read(svg_ins_file), outfile: png_ins_file, trim: true) unless ::File.exists?(png_ins_file)
- USPSFlags::Helpers.log "I"
- end
- sizes = {1500 => "H", 1000 => "K", 500 => "D", "thumb" => "T"}
- sizes.keys.each do |size|
- if ::File.exists?("#{USPSFlags::Config.flags_dir}/PNG/#{flag}.#{size}.png")
- USPSFlags::Helpers.log "."
- else
- USPSFlags::Helpers.log "…\b"
- if size == "thumb"
- size_key = size
- size = case flag
- when "ENSIGN"
- 200
- when "US"
- 300
- else
- 150
- end
- else
- size_key = size
- end
- MiniMagick::Tool::Convert.new do |convert|
- convert << "-background" << "none"
- convert << "-format" << "png"
- convert << "-resize" << "#{size}"
- convert << png_file
- convert << "#{USPSFlags::Config.flags_dir}/PNG/#{flag}.#{size_key}.png"
- end
- USPSFlags::Helpers.log sizes[size_key]
-
- if ::File.exists?(png_ins_file)
- if ::File.exists?("#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.#{size}.png")
- USPSFlags::Helpers.log "."
- elsif MiniMagick::Image.open(png_ins_file)[:width] > size
- USPSFlags::Helpers.log "…\b"
- MiniMagick::Tool::Convert.new do |convert|
- convert << "-background" << "none"
- convert << "-format" << "png"
- convert << "-resize" << "#{size}"
- convert << png_ins_file
- convert << "#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.#{size_key}.png"
- end
- USPSFlags::Helpers.log "i"
- else
- USPSFlags::Helpers.log "+"
- end
- else
- USPSFlags::Helpers.log "-"
- end
- end
- end
- rescue => e
- USPSFlags::Helpers.log "x -> #{e.message}"
- end
- else
- USPSFlags::Helpers.log "- "
- end
- run_time = (Time.now - start_time).round(4).to_s[(0..5)].ljust(6, "0")
- USPSFlags::Helpers.log " | #{run_time} s\n"
+ USPSFlags::Helpers.valid_flags(:all).each do |flag|
+ self.generate_static_images_for(flag, svg: svg, png: png)
end
self.zips(svg: svg, png: png) if zips
USPSFlags::Helpers.log "\nTotal run time: #{Time.now - overall_start_time} s\n\n"
@@ -239,185 +129,100 @@
private
def self.flag(rank: nil, width: USPSFlags::Config::BASE_FLY, outfile: nil, scale: nil, field: true)
raise "Error: No rank specified." if rank.nil?
final_svg = ""
-
final_svg << USPSFlags::Core.headers(scale: scale, title: rank)
- rank.slice!(0) if !field && rank[0].upcase == "P" && rank != "PORTCAP"
+ rank = rank.to_s.upcase
+ rank.slice!(0) if !field && USPSFlags::Helpers.valid_flags(:past).include?(rank)
rank = "CDR" if rank == "C"
- case rank.upcase
- when "PLTC"
- style = :past
- color = :red
- type = :s
- count = 2
- when "PC"
- style = :past
- color = :blue
- type = :s
- count = 3
- when "PORTCAP"
- style = :swallowtail
- color = :white
- type = :pc
- count = 1
- when "FLEETCAP"
- style = :swallowtail
- color = :white
- type = :fc
- count = 1
- when "LT"
- style = :swallowtail
- color = :white
- type = :s
- count = 1
- when "FLT"
- style = :swallowtail
- color = :white
- type = :f
- count = 1
- when "1LT"
- style = :regular
- color = :white
- type = :s
- count = 1
- when "LTC"
- style = :regular
- color = :red
- type = :s
- count = 2
- when "CDR"
- style = :regular
- color = :blue
- type = :s
- count = 3
+ style = if USPSFlags::Helpers.valid_flags(:past).include?(rank)
+ :past
+ elsif USPSFlags::Helpers.valid_flags(:swallowtail).include?(rank)
+ :swallowtail
+ else
+ :regular
+ end
- when "PDLTC"
- style = :past
- color = :red
- type = :d
- count = 2
- when "PDC"
- style = :past
- color = :blue
- type = :d
+ color = if USPSFlags::Helpers.valid_flags(:command).include?(rank)
count = 3
- when "DLT"
- style = :swallowtail
- color = :white
- type = :d
- count = 1
- when "DAIDE"
- style = :swallowtail
- color = :white
- type = :a
- count = 1
- when "DFLT"
- style = :swallowtail
- color = :white
- type = :f
+ :blue
+ elsif USPSFlags::Helpers.valid_flags(:bridge).include?(rank)
count = 2
- when "D1LT"
- style = :regular
- color = :white
- type = :d
- count = 1
- when "DLTC"
- style = :regular
- color = :red
- type = :d
- count = 2
- when "DC"
- style = :regular
- color = :blue
- type = :d
- count = 3
+ :red
+ else
+ :white
+ end
- when "PSTFC"
- style = :past
- color = :white
- type = :stf
+ trident_color = field ? :white : color
+
+ type = if USPSFlags::Helpers.valid_flags(:squadron).include?(rank)
+ :s
+ elsif USPSFlags::Helpers.valid_flags(:district).include?(rank)
+ :d
+ elsif rank == "STFC"
+ :stf
+ elsif USPSFlags::Helpers.valid_flags(:national).include?(rank)
+ :n
+ elsif rank == "PORTCAP"
+ :pc
+ elsif rank == "FLEETCAP"
+ :fc
+ elsif rank == "DAIDE"
count = 1
- when "PRC"
- style = :past
- color = :white
- type = :n
- count = 1
- when "PVC"
- style = :past
- color = :red
- type = :n
+ level = :d
+ :a
+ elsif rank == "NAIDE"
count = 2
- when "PCC"
- style = :past
- color = :blue
- type = :n
- count = 3
- when "NAIDE"
- style = :swallowtail
- color = :white
- type = :a
- count = 2
- when "NFLT"
- style = :swallowtail
- color = :white
- type = :f
- count = 3
- when "STFC"
- style = :regular
- color = :white
- type = :stf
+ level = :n
+ :a
+ elsif rank == "FLT"
count = 1
- when "RC"
- style = :regular
- color = :white
- type = :n
- count = 1
- when "VC"
- style = :regular
- color = :red
- type = :n
+ level = :s
+ :f
+ elsif rank == "DFLT"
count = 2
- when "CC"
- style = :regular
- color = :blue
- type = :n
+ level = :d
+ :f
+ elsif rank == "NFLT"
count = 3
+ level = :n
+ :f
end
+ count ||= 1
final_svg << USPSFlags::Core.field(style: style, color: color) if field
final_svg << "<g transform=\"translate(-150, 400)\"><g transform=\"scale(0.58333)\">" if style == :past
if type == :n && count == 3
# The side C/C tridents are angled 45 degrees, and intersect the central one at 1/3 up from the bottom
- trident = USPSFlags::Core.trident(type, color: (field ? :white : :blue))
+ trident = USPSFlags::Core.trident(type, color: trident_color)
x_distance = USPSFlags::Config::BASE_FLY*4/39
y_distance = USPSFlags::Config::BASE_FLY*5/78
final_svg << "<g transform=\"translate(-#{x_distance}, #{y_distance})\"><g transform=\"rotate(-45, #{USPSFlags::Config::BASE_FLY/2}, #{USPSFlags::Config::BASE_HOIST/2})\">\n#{trident}</g></g>"
final_svg << "\n#{trident}"
final_svg << "<g transform=\"translate(#{x_distance}, #{y_distance})\"><g transform=\"rotate(45, #{USPSFlags::Config::BASE_FLY/2}, #{USPSFlags::Config::BASE_HOIST/2})\">\n#{trident}</g></g>"
elsif type == :n && count == 2
# V/C tridents are angled 45 degrees, and intersect at 15/32 up from the bottom
- trident = USPSFlags::Core.trident(type, color: (field ? :white : :red))
+ trident = USPSFlags::Core.trident(type, color: trident_color)
x_distance = USPSFlags::Config::BASE_FLY*4/55
final_svg << "<g transform=\"translate(-#{x_distance})\"><g transform=\"rotate(-45, #{USPSFlags::Config::BASE_FLY/2}, #{USPSFlags::Config::BASE_HOIST/2})\">\n#{trident}</g></g>"
final_svg << "<g transform=\"translate(#{x_distance})\"><g transform=\"rotate(45, #{USPSFlags::Config::BASE_FLY/2}, #{USPSFlags::Config::BASE_HOIST/2})\">\n#{trident}</g></g>"
elsif [:s, :d].include?(type) && count == 3
# Cdr and D/C tridents are spaced 1/2 the fly apart with the central one 1/4 the fly above the sides
- trident = USPSFlags::Core.trident(type, color: (field ? :white : :blue), field_color: color)
+ trident = USPSFlags::Core.trident(type, color: trident_color, field_color: color)
x_distance = USPSFlags::Config::BASE_FLY/4
y_distance = USPSFlags::Config::BASE_FLY/16
final_svg << "<g transform=\"translate(-#{x_distance}, #{y_distance})\">\n#{trident}</g>"
final_svg << "<g transform=\"translate(0, -#{y_distance+1})\">\n#{trident}</g>"
final_svg << "<g transform=\"translate(#{x_distance}, #{y_distance})\">\n#{trident}</g>"
elsif [:s, :d].include?(type) && count == 2
# Lt/C and D/Lt/C tridents are spaced 1/3 the fly apart
- trident = USPSFlags::Core.trident(type, color: (field ? :white : :red), field_color: color)
+ trident = USPSFlags::Core.trident(type, color: trident_color, field_color: color)
x_distance = USPSFlags::Config::BASE_FLY/6
final_svg << "<g transform=\"translate(-#{x_distance})\">\n#{trident}</g>"
final_svg << "<g transform=\"translate(#{x_distance})\">\n#{trident}</g>"
elsif [:s, :d, :stf, :n].include?(type)
if %w[LT DLT].include?(rank.upcase)
@@ -435,26 +240,12 @@
# Paths were designed for a base fly of 3000 pixels, but the base was changed for more useful fractions.
final_svg << "<g transform=\"translate(#{USPSFlags::Config::BASE_FLY/10})\">" unless field
final_svg << "<g transform=\"scale(#{Rational(USPSFlags::Config::BASE_FLY/3000).to_f})\">"
case type
when :a
- level = case count
- when 1
- :d
- when 2
- :n
- end
final_svg << USPSFlags::Core.binoculars(level)
when :f
- level = case count
- when 1
- :s
- when 2
- :d
- when 3
- :n
- end
final_svg << USPSFlags::Core.trumpet(level)
when :fc
final_svg << USPSFlags::Core.anchor
when :pc
final_svg << USPSFlags::Core.lighthouse
@@ -549,7 +340,129 @@
f = ::File.new(outfile, "w+")
f.write(final_svg)
f.close
end
final_svg
+ end
+
+ private
+ def self.remove_static_files
+ ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/SVG/*"))
+ ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/PNG/*"))
+ ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/ZIP/*"))
+ ::FileUtils.mkdir_p("#{USPSFlags::Config.flags_dir}/SVG/insignia")
+ ::FileUtils.mkdir_p("#{USPSFlags::Config.flags_dir}/PNG/insignia")
+ puts "Cleared previous files."
+ end
+
+ def self.generate_static_images_for(flag, svg: true, png: true)
+ start_time = Time.now
+ USPSFlags::Helpers.log " | | _ _ _ _ _ | \r".rjust(max_length+31, " ")
+ flag = flag.upcase
+ USPSFlags::Helpers.log "#{flag.rjust(max_length)} |"
+
+ svg_file = "#{USPSFlags::Config.flags_dir}/SVG/#{flag}.svg"
+ png_file = "#{USPSFlags::Config.flags_dir}/PNG/#{flag}.png"
+
+ svg_ins_file = "#{USPSFlags::Config.flags_dir}/SVG/insignia/#{flag}.svg"
+ png_ins_file = "#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.png"
+
+ past = (flag[0] == "P" && flag != "PORTCAP")
+
+ if svg
+ self.generate_static_svg(flag, svg_file)
+ else
+ USPSFlags::Helpers.log "-"
+ end
+
+ if png
+ self.generate_static_png(flag, png_file)
+ else
+ USPSFlags::Helpers.log "- "
+ end
+ run_time = (Time.now - start_time).round(4).to_s[(0..5)].ljust(6, "0")
+ USPSFlags::Helpers.log " | #{run_time} s\n"
+ end
+
+ def self.generate_static_svg(flag, svg_file)
+ begin
+ USPSFlags::Helpers.log " "
+ self.get flag, outfile: svg_file, scale: 1
+ USPSFlags::Helpers.log "S"
+ if past || !USPSFlags::Helpers.valid_flags(:insignia).include?(flag)
+ USPSFlags::Helpers.log "-"
+ else
+ self.get flag, field: false, outfile: svg_ins_file, scale: 1
+ USPSFlags::Helpers.log "I"
+ end
+ rescue => e
+ USPSFlags::Helpers.log "x -> #{e.message}"
+ end
+ end
+
+ def self.generate_static_png(flag, png_file)
+ USPSFlags::Helpers.log " | "
+ begin
+ USPSFlags::Helpers.log "…\b"
+ USPSFlags::Generate.png(File.read(svg_file), outfile: png_file) unless ::File.exists?(png_file)
+ USPSFlags::Helpers.log "F"
+ if past || !insignia_flags.include?(flag)
+ USPSFlags::Helpers.log "-"
+ else
+ USPSFlags::Helpers.log "…\b"
+ USPSFlags::Generate.png(File.read(svg_ins_file), outfile: png_ins_file, trim: true) unless ::File.exists?(png_ins_file)
+ USPSFlags::Helpers.log "I"
+ end
+ sizes = {1500 => "H", 1000 => "K", 500 => "D", "thumb" => "T"}
+ sizes.keys.each do |size|
+ if ::File.exists?("#{USPSFlags::Config.flags_dir}/PNG/#{flag}.#{size}.png")
+ USPSFlags::Helpers.log "."
+ else
+ USPSFlags::Helpers.log "…\b"
+ if size == "thumb"
+ size_key = size
+ size = case flag
+ when "ENSIGN"
+ 200
+ when "US"
+ 300
+ else
+ 150
+ end
+ else
+ size_key = size
+ end
+ MiniMagick::Tool::Convert.new do |convert|
+ convert << "-background" << "none"
+ convert << "-format" << "png"
+ convert << "-resize" << "#{size}"
+ convert << png_file
+ convert << "#{USPSFlags::Config.flags_dir}/PNG/#{flag}.#{size_key}.png"
+ end
+ USPSFlags::Helpers.log sizes[size_key]
+
+ if ::File.exists?(png_ins_file)
+ if ::File.exists?("#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.#{size}.png")
+ USPSFlags::Helpers.log "."
+ elsif MiniMagick::Image.open(png_ins_file)[:width] > size
+ USPSFlags::Helpers.log "…\b"
+ MiniMagick::Tool::Convert.new do |convert|
+ convert << "-background" << "none"
+ convert << "-format" << "png"
+ convert << "-resize" << "#{size}"
+ convert << png_ins_file
+ convert << "#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.#{size_key}.png"
+ end
+ USPSFlags::Helpers.log "i"
+ else
+ USPSFlags::Helpers.log "+"
+ end
+ else
+ USPSFlags::Helpers.log "-"
+ end
+ end
+ end
+ rescue => e
+ USPSFlags::Helpers.log "x -> #{e.message}"
+ end
end
end