Class: USPSFlags::Generate

Inherits:
Object
  • Object
show all
Defined in:
lib/usps_flags/generate.rb

Overview

Controller class for generating files.

Since:

  • 0.1.5

Class Method Summary collapse

Class Method Details

.all(svg: true, png: true, zips: true, reset: true) ⇒ Object

Generate all static SVG and PNG files, and automaticall generates zip archives for download.

Parameters:

  • svg (Boolean) (defaults to: true)

    Whether to generate SVG images.

  • png (Boolean) (defaults to: true)

    Whether to generate PNG images.

  • zips (Boolean) (defaults to: true)

    Whether to create zip archives for all images created. Does not create a zip for skipped formats.

  • reset (Boolean) (defaults to: true)

    Whether to delete all previous files before generating new files.

Since:

  • 0.1.5



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/usps_flags/generate.rb', line 55

def all(svg: true, png: true, zips: true, reset: true)
  remove_static_files if reset

  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

  USPSFlags::Helpers.valid_flags(:all).each do |flag|
    generate_static_images_for(flag, svg: svg, png: png)
  end

  zips(svg: svg, png: png) if zips

  USPSFlags::Helpers.log "\nTotal run time: #{Time.now - overall_start_time} s\n\n"

  nil
end

.get(flag, outfile: nil, scale: nil, field: true) ⇒ String

The primary controller method. Generates an SVG file or SVG data.

Parameters:

  • flag (String)

    The flag type to generate.

  • outfile (String) (defaults to: nil)

    The path to save the SVG file to. If not set, prints to console.

  • field (Boolean) (defaults to: true)

    Whether to generate the flag field (including any border).

  • scale (String) (defaults to: nil)

    The image scale divisor factor.

Returns:

  • (String)

    Returns the SVG data.

Since:

  • 0.1.5



11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/usps_flags/generate.rb', line 11

def get(flag, outfile: nil, scale: nil, field: true)
  flag = flag.upcase.delete("/", "_", "PENNANT")
  if ["CRUISE", "OIC"].include?(flag)
    pennant(type: flag, outfile: outfile, scale: scale)
  elsif flag == "ENSIGN"
    ensign(outfile: outfile, scale: scale)
  elsif flag == "US"
    us(outfile: outfile, scale: scale)
  elsif flag == "WHEEL"
    wheel(outfile: outfile, scale: scale)
  else
    flag(rank: flag, outfile: outfile, scale: scale, field: field)
  end
end

.png(svg, outfile: nil, trim: false) ⇒ Object

Convert SVG data into a PNG file.

Parameters:

  • svg (String)

    The SVG data.

  • outfile (String) (defaults to: nil)

    The path to save the PNG file to. (File is not accessible if this is left blank.)

  • trim (Boolean) (defaults to: false)

    Whether to trim the generated PNG file of excess transparency.

Since:

  • 0.1.5



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/usps_flags/generate.rb', line 31

def png(svg, outfile: nil, trim: false)
  outfile = "temp.png" if outfile.nil?
  temp_svg = ::File.new("temp.svg", "w+")
  temp_svg.write(svg)
  temp_svg.flush

  MiniMagick::Tool::Convert.new do |convert|
    convert << "-background" << "none"
    convert << "-format" << "png"
    convert << "-trim" if trim
    convert << temp_svg.path
    convert << outfile
  end
ensure
  ::File.delete(temp_svg) if ::File.exist?(temp_svg)
  ::File.delete("temp.png") if ::File.exist?("temp.png")
end

.spec(outfile: nil, fly: nil, unit: nil, scale: nil) ⇒ String

Generate trident spec sheet as an SVG image.

Parameters:

  • outfile (String) (defaults to: nil)

    The path to save the SVG file to. If not set, prints to console.

  • fly (Integer) (defaults to: nil)

    The nominal fly length of an appropriate flag field for the generated tridents. Size labels scale to this size.

  • outfile (String) (defaults to: nil)

    The unit to append to all trident measurements.

  • scale (String) (defaults to: nil)

    The image scale divisor factor.

Returns:

  • (String)

    Returns the SVG data.

Since:

  • 0.1.5



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/usps_flags/generate.rb', line 114

def spec(outfile: nil, fly: nil, unit: nil, scale: nil)
  fly = fly.nil? ? USPSFlags::Config::BASE_FLY : fly
  final_svg = ""
  final_svg << USPSFlags::Core.headers(scale: scale, title: "USPS Trident Specifications")
  final_svg << USPSFlags::Core.trident_spec(fly: fly, unit: unit)
  final_svg << USPSFlags::Core.footer

  if outfile.nil?
    puts final_svg, "\n"
  else
    f = ::File.new(outfile, "w+")
    f.write(final_svg)
    f.close
  end
  final_svg
end

.zips(svg: true, png: true) ⇒ Object

Generate zip archives of current static image files.

Parameters:

  • svg (Boolean) (defaults to: true)

    Generate zip archive of SVG images.

  • png (Boolean) (defaults to: true)

    Generate zip archive of PNG images.

Since:

  • 0.1.5



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/usps_flags/generate.rb', line 83

def zips(svg: true, png: true)
  ["svg", "png"].each do |format|
    begin
      if binding.local_variable_get(format)
        zip = "#{USPSFlags::Config.flags_dir}/ZIP/USPS_Flags.#{format}.zip"
        ::File.delete(zip) if ::File.exist?(zip)
        Zip::File.open(zip, Zip::File::CREATE) do |z|
          Dir.glob("#{USPSFlags::Config.flags_dir}/#{format.upcase}/**/*").each do |f|
            if f.split("/").last(2).first == "insignia"
              filename = "insignia/#{f.split("/").last}"
              z.add(filename, f)
            else
              z.add(f.split("/").last, f)
            end
          end
        end
        puts "Generated #{format.upcase} Zip"
      end
    rescue Errno::EACCES => e
      puts "Error: Failed to generate #{format.upcase} Zip -> #{e.message}"
    end
  end
end