usps_flags 0.1.25 → 0.1.26

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,468 +1,391 @@
1
1
  # Controller class for generating files.
2
2
  class USPSFlags::Generate
3
- # The primary controller method. Generates an SVG file or SVG data.
4
- #
5
- # @param [String] flag The flag type to generate.
6
- # @param [String] outfile The path to save the SVG file to. If not set, prints to console.
7
- # @param [Boolean] field Whether to generate the flag field (including any border).
8
- # @param [String] scale The image scale divisor factor.
9
- # @return [String] Returns the SVG data.
10
- def self.get(flag, outfile: nil, scale: nil, field: true)
11
- flag = flag.upcase.gsub("/", "").gsub("_", "").gsub("PENNANT", "")
12
- if ["CRUISE", "OIC"].include?(flag)
13
- self.pennant(type: flag, outfile: outfile, scale: scale)
14
- elsif flag.upcase == "ENSIGN"
15
- self.ensign(outfile: outfile, scale: scale)
16
- elsif flag.upcase == "US"
17
- self.us(outfile: outfile, scale: scale)
18
- elsif flag.upcase == "WHEEL"
19
- self.wheel(outfile: outfile, scale: scale)
20
- else
21
- self.flag(rank: flag, outfile: outfile, scale: scale, field: field)
3
+ class << self
4
+ # The primary controller method. Generates an SVG file or SVG data.
5
+ #
6
+ # @param [String] flag The flag type to generate.
7
+ # @param [String] outfile The path to save the SVG file to. If not set, prints to console.
8
+ # @param [Boolean] field Whether to generate the flag field (including any border).
9
+ # @param [String] scale The image scale divisor factor.
10
+ # @return [String] Returns the SVG data.
11
+ def get(flag, outfile: nil, scale: nil, field: true)
12
+ flag = flag.upcase.delete("/", "_", "PENNANT")
13
+ if ["CRUISE", "OIC"].include?(flag)
14
+ pennant(type: flag, outfile: outfile, scale: scale)
15
+ elsif flag == "ENSIGN"
16
+ ensign(outfile: outfile, scale: scale)
17
+ elsif flag == "US"
18
+ us(outfile: outfile, scale: scale)
19
+ elsif flag == "WHEEL"
20
+ wheel(outfile: outfile, scale: scale)
21
+ else
22
+ flag(rank: flag, outfile: outfile, scale: scale, field: field)
23
+ end
22
24
  end
23
- end
24
25
 
25
- # Convert SVG data into a PNG file.
26
- #
27
- # @param [String] svg The SVG data.
28
- # @param [String] outfile The path to save the PNG file to. (File is not accessible if this is left blank.)
29
- # @param [Boolean] trim Whether to trim the generated PNG file of excess transparency.
30
- def self.png(svg, outfile: nil, trim: false)
31
- outfile = "temp.png" if outfile.nil?
32
- temp_svg = ::File.new("temp.svg", "w+")
33
- temp_svg.write(svg)
34
- temp_svg.flush
35
-
36
- MiniMagick::Tool::Convert.new do |convert|
37
- convert << "-background" << "none"
38
- convert << "-format" << "png"
39
- convert << "-trim" if trim
40
- convert << temp_svg.path
41
- convert << outfile
26
+ # Convert SVG data into a PNG file.
27
+ #
28
+ # @param [String] svg The SVG data.
29
+ # @param [String] outfile The path to save the PNG file to. (File is not accessible if this is left blank.)
30
+ # @param [Boolean] trim Whether to trim the generated PNG file of excess transparency.
31
+ def png(svg, outfile: nil, trim: false)
32
+ outfile = "temp.png" if outfile.nil?
33
+ temp_svg = ::File.new("temp.svg", "w+")
34
+ temp_svg.write(svg)
35
+ temp_svg.flush
36
+
37
+ MiniMagick::Tool::Convert.new do |convert|
38
+ convert << "-background" << "none"
39
+ convert << "-format" << "png"
40
+ convert << "-trim" if trim
41
+ convert << temp_svg.path
42
+ convert << outfile
43
+ end
44
+ ensure
45
+ ::File.delete(temp_svg) if ::File.exist?(temp_svg)
46
+ ::File.delete("temp.png") if ::File.exist?("temp.png")
42
47
  end
43
- ensure
44
- ::File.delete(temp_svg) if ::File.exists?(temp_svg)
45
- ::File.delete("temp.png") if ::File.exists?("temp.png")
46
- end
47
48
 
48
- # Generate all static SVG and PNG files, and automaticall generates zip archives for download.
49
- #
50
- # @param [Boolean] svg Whether to generate SVG images.
51
- # @param [Boolean] png Whether to generate PNG images.
52
- # @param [Boolean] zips Whether to create zip archives for all images created. Does not create a zip for skipped formats.
53
- # @param [Boolean] reset Whether to delete all previous files before generating new files.
54
- def self.all(svg: true, png: true, zips: true, reset: true)
55
- self.remove_static_files if reset
56
-
57
- max_length = USPSFlags::Helpers.valid_flags(:all).map(&:length).max
58
- puts "\nSVGs generate a single file.",
59
- "PNGs generate full-res, 1500w, 1000w, 500w, and thumbnail files.",
60
- "Corresponding rank insignia (including smaller sizes) are also generated, as appropriate."
61
- USPSFlags::Helpers.log "\n#{Time.now.strftime('%Y%m%d.%H%M%S%z')} – Generating static files...\n\n"
62
- USPSFlags::Helpers.log "Flag | SVG | PNG | Run time\n".rjust(max_length+31),
63
- "\n".rjust(max_length+32, "-")
64
-
65
- overall_start_time = Time.now
66
-
67
- USPSFlags::Helpers.valid_flags(:all).each do |flag|
68
- self.generate_static_images_for(flag, svg: svg, png: png)
69
- end
49
+ # Generate all static SVG and PNG files, and automaticall generates zip archives for download.
50
+ #
51
+ # @param [Boolean] svg Whether to generate SVG images.
52
+ # @param [Boolean] png Whether to generate PNG images.
53
+ # @param [Boolean] zips Whether to create zip archives for all images created. Does not create a zip for skipped formats.
54
+ # @param [Boolean] reset Whether to delete all previous files before generating new files.
55
+ def all(svg: true, png: true, zips: true, reset: true)
56
+ remove_static_files if reset
57
+
58
+ max_length = USPSFlags::Helpers.valid_flags(:all).map(&:length).max
59
+ puts "\nSVGs generate a single file.",
60
+ "PNGs generate full-res, 1500w, 1000w, 500w, and thumbnail files.",
61
+ "Corresponding rank insignia (including smaller sizes) are also generated, as appropriate."
62
+ USPSFlags::Helpers.log "\n#{Time.now.strftime('%Y%m%d.%H%M%S%z')} – Generating static files...\n\n"
63
+ USPSFlags::Helpers.log "Flag | SVG | PNG | Run time\n".rjust(max_length+31),
64
+ "\n".rjust(max_length+32, "-")
65
+
66
+ overall_start_time = Time.now
67
+
68
+ USPSFlags::Helpers.valid_flags(:all).each do |flag|
69
+ generate_static_images_for(flag, svg: svg, png: png)
70
+ end
70
71
 
71
- self.zips(svg: svg, png: png) if zips
72
+ zips(svg: svg, png: png) if zips
72
73
 
73
- USPSFlags::Helpers.log "\nTotal run time: #{Time.now - overall_start_time} s\n\n"
74
+ USPSFlags::Helpers.log "\nTotal run time: #{Time.now - overall_start_time} s\n\n"
74
75
 
75
- nil
76
- end
76
+ nil
77
+ end
77
78
 
78
- # Generate zip archives of current static image files.
79
- #
80
- # @param [Boolean] svg Generate zip archive of SVG images.
81
- # @param [Boolean] png Generate zip archive of PNG images.
82
- def self.zips(svg: true, png: true)
83
- ["svg", "png"].each do |format|
84
- begin
85
- if binding.local_variable_get(format)
86
- zip = "#{USPSFlags::Config.flags_dir}/ZIP/USPS_Flags.#{format}.zip"
87
- ::File.delete(zip) if ::File.exists?(zip)
88
- Zip::File.open(zip, Zip::File::CREATE) do |z|
89
- Dir.glob("#{USPSFlags::Config.flags_dir}/#{format.upcase}/**/*").each do |f|
90
- if f.split("/").last(2).first == "insignia"
91
- filename = "insignia/#{f.split("/").last}"
92
- z.add(filename, f)
93
- else
94
- z.add(f.split("/").last, f)
79
+ # Generate zip archives of current static image files.
80
+ #
81
+ # @param [Boolean] svg Generate zip archive of SVG images.
82
+ # @param [Boolean] png Generate zip archive of PNG images.
83
+ def zips(svg: true, png: true)
84
+ ["svg", "png"].each do |format|
85
+ begin
86
+ if binding.local_variable_get(format)
87
+ zip = "#{USPSFlags::Config.flags_dir}/ZIP/USPS_Flags.#{format}.zip"
88
+ ::File.delete(zip) if ::File.exist?(zip)
89
+ Zip::File.open(zip, Zip::File::CREATE) do |z|
90
+ Dir.glob("#{USPSFlags::Config.flags_dir}/#{format.upcase}/**/*").each do |f|
91
+ if f.split("/").last(2).first == "insignia"
92
+ filename = "insignia/#{f.split("/").last}"
93
+ z.add(filename, f)
94
+ else
95
+ z.add(f.split("/").last, f)
96
+ end
95
97
  end
96
98
  end
99
+ puts "Generated #{format.upcase} Zip"
97
100
  end
98
- puts "Generated #{format.upcase} Zip"
101
+ rescue Errno::EACCES => e
102
+ puts "Error: Failed to generate #{format.upcase} Zip -> #{e.message}"
99
103
  end
100
- rescue Errno::EACCES => e
101
- puts "Error: Failed to generate #{format.upcase} Zip -> #{e.message}"
102
104
  end
103
105
  end
104
- end
105
-
106
- # Generate trident spec sheet as an SVG image.
107
- #
108
- # @param [String] outfile The path to save the SVG file to. If not set, prints to console.
109
- # @param [Integer] fly The nominal fly length of an appropriate flag field for the generated tridents. Size labels scale to this size.
110
- # @param [String] outfile The unit to append to all trident measurements.
111
- # @param [String] scale The image scale divisor factor.
112
- # @return [String] Returns the SVG data.
113
- def self.spec(outfile: nil, fly: nil, unit: nil, scale: nil)
114
- fly = fly.nil? ? USPSFlags::Config::BASE_FLY : fly
115
- final_svg = ""
116
- final_svg << USPSFlags::Core.headers(scale: scale, title: "USPS Trident Specifications")
117
- final_svg << USPSFlags::Core.trident_spec(fly: fly, unit: unit)
118
- final_svg << USPSFlags::Core.footer
119
-
120
- if outfile.nil?
121
- puts final_svg, "\n"
122
- else
123
- f = ::File.new(outfile, "w+")
124
- f.write(final_svg)
125
- f.close
126
- end
127
- final_svg
128
- end
129
-
130
- private
131
- def self.flag(rank: nil, width: USPSFlags::Config::BASE_FLY, outfile: nil, scale: nil, field: true)
132
- raise "Error: No rank specified." if rank.nil?
133
- final_svg = ""
134
- final_svg << USPSFlags::Core.headers(scale: scale, title: rank)
135
-
136
- rank = rank.to_s.upcase
137
- rank.slice!(0) if !field && USPSFlags::Helpers.valid_flags(:past).include?(rank)
138
- rank = "CDR" if rank == "C"
139
-
140
- style = if USPSFlags::Helpers.valid_flags(:past).include?(rank)
141
- :past
142
- elsif USPSFlags::Helpers.valid_flags(:swallowtail).include?(rank)
143
- :swallowtail
144
- else
145
- :regular
146
- end
147
106
 
148
- color = if USPSFlags::Helpers.valid_flags(:command).include?(rank)
149
- count = 3
150
- :blue
151
- elsif USPSFlags::Helpers.valid_flags(:bridge).include?(rank)
152
- count = 2
153
- :red
154
- else
155
- :white
107
+ # Generate trident spec sheet as an SVG image.
108
+ #
109
+ # @param [String] outfile The path to save the SVG file to. If not set, prints to console.
110
+ # @param [Integer] fly The nominal fly length of an appropriate flag field for the generated tridents. Size labels scale to this size.
111
+ # @param [String] outfile The unit to append to all trident measurements.
112
+ # @param [String] scale The image scale divisor factor.
113
+ # @return [String] Returns the SVG data.
114
+ def spec(outfile: nil, fly: nil, unit: nil, scale: nil)
115
+ fly = fly.nil? ? USPSFlags::Config::BASE_FLY : fly
116
+ final_svg = ""
117
+ final_svg << USPSFlags::Core.headers(scale: scale, title: "USPS Trident Specifications")
118
+ final_svg << USPSFlags::Core.trident_spec(fly: fly, unit: unit)
119
+ final_svg << USPSFlags::Core.footer
120
+
121
+ if outfile.nil?
122
+ puts final_svg, "\n"
123
+ else
124
+ f = ::File.new(outfile, "w+")
125
+ f.write(final_svg)
126
+ f.close
127
+ end
128
+ final_svg
156
129
  end
157
130
 
158
- trident_color = field ? :white : color
159
-
160
- type = if USPSFlags::Helpers.valid_flags(:squadron).include?(rank)
161
- :s
162
- elsif USPSFlags::Helpers.valid_flags(:district).include?(rank)
163
- :d
164
- elsif rank == "STFC"
165
- :stf
166
- elsif USPSFlags::Helpers.valid_flags(:national).include?(rank)
167
- :n
168
- elsif rank == "PORTCAP"
169
- :pc
170
- elsif rank == "FLEETCAP"
171
- :fc
172
- elsif rank == "DAIDE"
173
- count = 1
174
- level = :d
175
- :a
176
- elsif rank == "NAIDE"
177
- count = 2
178
- level = :n
179
- :a
180
- elsif rank == "FLT"
181
- count = 1
182
- level = :s
183
- :f
184
- elsif rank == "DFLT"
185
- count = 2
186
- level = :d
187
- :f
188
- elsif rank == "NFLT"
189
- count = 3
190
- level = :n
191
- :f
192
- end
193
- count ||= 1
194
-
195
- final_svg << USPSFlags::Core.field(style: style, color: color) if field
196
-
197
- final_svg << "<g transform=\"translate(-150, 400)\"><g transform=\"scale(0.58333)\">" if style == :past
198
-
199
- if type == :n && count == 3
200
- # The side C/C tridents are angled 45 degrees, and intersect the central one at 1/3 up from the bottom
201
- trident = USPSFlags::Core.trident(type, color: trident_color)
202
- x_distance = USPSFlags::Config::BASE_FLY*4/39
203
- y_distance = USPSFlags::Config::BASE_FLY*5/78
204
- 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>"
205
- final_svg << "\n#{trident}"
206
- 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>"
207
- elsif type == :n && count == 2
208
- # V/C tridents are angled 45 degrees, and intersect at 15/32 up from the bottom
209
- trident = USPSFlags::Core.trident(type, color: trident_color)
210
- x_distance = USPSFlags::Config::BASE_FLY*4/55
211
- 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>"
212
- 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>"
213
- elsif [:s, :d].include?(type) && count == 3
214
- # Cdr and D/C tridents are spaced 1/2 the fly apart with the central one 1/4 the fly above the sides
215
- trident = USPSFlags::Core.trident(type, color: trident_color, field_color: color)
216
- x_distance = USPSFlags::Config::BASE_FLY/4
217
- y_distance = USPSFlags::Config::BASE_FLY/16
218
- final_svg << "<g transform=\"translate(-#{x_distance}, #{y_distance})\">\n#{trident}</g>"
219
- final_svg << "<g transform=\"translate(0, -#{y_distance+1})\">\n#{trident}</g>"
220
- final_svg << "<g transform=\"translate(#{x_distance}, #{y_distance})\">\n#{trident}</g>"
221
- elsif [:s, :d].include?(type) && count == 2
222
- # Lt/C and D/Lt/C tridents are spaced 1/3 the fly apart
223
- trident = USPSFlags::Core.trident(type, color: trident_color, field_color: color)
224
- x_distance = USPSFlags::Config::BASE_FLY/6
225
- final_svg << "<g transform=\"translate(-#{x_distance})\">\n#{trident}</g>"
226
- final_svg << "<g transform=\"translate(#{x_distance})\">\n#{trident}</g>"
227
- elsif [:s, :d, :stf, :n].include?(type)
228
- if %w[LT DLT].include?(rank.upcase)
131
+ private
132
+ def flag(rank: nil, width: USPSFlags::Config::BASE_FLY, outfile: nil, scale: nil, field: true)
133
+ raise "Error: No rank specified." if rank.nil?
134
+ rank = rank.to_s.upcase
135
+
136
+ final_svg = ""
137
+ final_svg << USPSFlags::Core.headers(scale: scale, title: rank)
138
+
139
+ rank.slice!(0) if !field && USPSFlags::Helpers.valid_flags(:past).include?(rank)
140
+ rank = "CDR" if rank == "C"
141
+
142
+ flag_details = USPSFlags::Helpers.flag_details(rank)
143
+ trident_color = field ? :white : flag_details[:color]
144
+
145
+ final_svg << USPSFlags::Core.field(style: flag_details[:style], color: flag_details[:color]) if field
146
+
147
+ final_svg << "<g transform=\"translate(-150, 400)\"><g transform=\"scale(0.58333)\">" if flag_details[:style] == :past
148
+
149
+ if flag_details[:type] == :n && flag_details[:count] == 3
150
+ # The side C/C tridents are angled 45 degrees, and intersect the central one at 1/3 up from the bottom
151
+ trident = USPSFlags::Core.trident(flag_details[:type], color: trident_color)
152
+ x_distance = USPSFlags::Config::BASE_FLY*4/39
153
+ y_distance = USPSFlags::Config::BASE_FLY*5/78
154
+ 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>"
155
+ final_svg << "\n#{trident}"
156
+ 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>"
157
+ elsif flag_details[:type] == :n && flag_details[:count] == 2
158
+ # V/C tridents are angled 45 degrees, and intersect at 15/32 up from the bottom
159
+ trident = USPSFlags::Core.trident(flag_details[:type], color: trident_color)
160
+ x_distance = USPSFlags::Config::BASE_FLY*4/55
161
+ 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>"
162
+ 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>"
163
+ elsif [:s, :d].include?(flag_details[:type]) && flag_details[:count] == 3
164
+ # Cdr and D/C tridents are spaced 1/2 the fly apart with the central one 1/4 the fly above the sides
165
+ trident = USPSFlags::Core.trident(flag_details[:type], color: trident_color, field_color: flag_details[:color])
166
+ x_distance = USPSFlags::Config::BASE_FLY/4
167
+ y_distance = USPSFlags::Config::BASE_FLY/16
168
+ final_svg << "<g transform=\"translate(-#{x_distance}, #{y_distance})\">\n#{trident}</g>"
169
+ final_svg << "<g transform=\"translate(0, -#{y_distance+1})\">\n#{trident}</g>"
170
+ final_svg << "<g transform=\"translate(#{x_distance}, #{y_distance})\">\n#{trident}</g>"
171
+ elsif [:s, :d].include?(flag_details[:type]) && flag_details[:count] == 2
172
+ # Lt/C and D/Lt/C tridents are spaced 1/3 the fly apart
173
+ trident = USPSFlags::Core.trident(flag_details[:type], color: trident_color, field_color: flag_details[:color])
174
+ x_distance = USPSFlags::Config::BASE_FLY/6
175
+ final_svg << "<g transform=\"translate(-#{x_distance})\">\n#{trident}</g>"
176
+ final_svg << "<g transform=\"translate(#{x_distance})\">\n#{trident}</g>"
177
+ elsif [:s, :d, :stf, :n].include?(flag_details[:type]) && %w[LT DLT].include?(rank)
229
178
  # Swallowtail tridents need to move towards the hoist due to the tails
230
179
  x_distance = USPSFlags::Config::BASE_FLY/10 if field
231
180
  final_svg << "<g transform=\"translate(-#{x_distance})\">" if field
232
- final_svg << USPSFlags::Core.trident(type, field_color: color, color: :red)
181
+ final_svg << USPSFlags::Core.trident(flag_details[:type], field_color: flag_details[:color], color: :red)
233
182
  final_svg << "</g>" if field
234
- else
183
+ elsif [:s, :d, :stf, :n].include?(flag_details[:type])
235
184
  # All other tridents are centered on the field
236
- final_svg << USPSFlags::Core.trident(type, field_color: color)
237
- end
238
- else
239
- # Special Flags
240
- # Paths were designed for a base fly of 3000 pixels, but the base was changed for more useful fractions.
241
- final_svg << "<g transform=\"translate(#{USPSFlags::Config::BASE_FLY/10})\">" unless field
242
- final_svg << "<g transform=\"scale(#{Rational(USPSFlags::Config::BASE_FLY/3000).to_f})\">"
243
- case type
244
- when :a
245
- final_svg << USPSFlags::Core.binoculars(level)
246
- when :f
247
- final_svg << USPSFlags::Core.trumpet(level)
248
- when :fc
249
- final_svg << USPSFlags::Core.anchor
250
- when :pc
251
- final_svg << USPSFlags::Core.lighthouse
185
+ final_svg << USPSFlags::Core.trident(flag_details[:type], field_color: flag_details[:color])
186
+ else
187
+ # Special Flags
188
+ # Paths were designed for a base fly of 3000 pixels, but the base was changed for more useful fractions.
189
+ final_svg << "<g transform=\"translate(#{USPSFlags::Config::BASE_FLY/10})\">" unless field
190
+ final_svg << "<g transform=\"scale(#{Rational(USPSFlags::Config::BASE_FLY,3000).to_f})\">"
191
+ case flag_details[:type]
192
+ when :a
193
+ final_svg << USPSFlags::Core.binoculars(flag_details[:level])
194
+ when :f
195
+ final_svg << USPSFlags::Core.trumpet(flag_details[:level])
196
+ when :fc
197
+ final_svg << USPSFlags::Core.anchor
198
+ when :pc
199
+ final_svg << USPSFlags::Core.lighthouse
200
+ end
201
+ final_svg << "</g>"
202
+ final_svg << "</g>" unless field
252
203
  end
253
- final_svg << "</g>"
254
- final_svg << "</g>" unless field
255
- end
256
204
 
257
- final_svg << "</g></g>" if style == :past
205
+ final_svg << "</g></g>" if flag_details[:style] == :past
258
206
 
259
- final_svg << USPSFlags::Core.footer
207
+ final_svg << USPSFlags::Core.footer
260
208
 
261
- if outfile.nil?
262
- puts final_svg, "\n"
263
- elsif outfile != ""
264
- f = ::File.new(outfile, "w+")
265
- f.write(final_svg)
266
- f.close
209
+ if outfile.nil?
210
+ puts final_svg, "\n"
211
+ elsif outfile != ""
212
+ f = ::File.new(outfile, "w+")
213
+ f.write(final_svg)
214
+ f.close
215
+ end
216
+ final_svg
267
217
  end
268
- final_svg
269
- end
270
218
 
271
- def self.pennant(type: "cruise", outfile: nil, scale: nil)
272
- final_svg = ""
273
- title = case type.upcase
274
- when "CRUISE"
275
- "Cruise Pennant"
276
- when "OIC"
277
- "Officer-in-Charge Pennant"
278
- end
279
- final_svg << USPSFlags::Core.headers(pennant: true, scale: scale, title: title)
280
- final_svg << USPSFlags::Core.pennant(type)
281
- final_svg << USPSFlags::Core.footer
282
-
283
- if outfile.nil?
284
- puts final_svg, "\n"
285
- elsif outfile != ""
286
- f = ::File.new(outfile, "w+")
287
- f.write(final_svg)
288
- f.close
219
+ def pennant(type: "CRUISE", outfile: nil, scale: nil)
220
+ type = type.upcase
221
+ final_svg = ""
222
+ title = case type
223
+ when "CRUISE"
224
+ "Cruise Pennant"
225
+ when "OIC"
226
+ "Officer-in-Charge Pennant"
227
+ end
228
+ final_svg << USPSFlags::Core.headers(pennant: true, scale: scale, title: title)
229
+ final_svg << USPSFlags::Core.pennant(type)
230
+ final_svg << USPSFlags::Core.footer
231
+
232
+ if outfile.nil?
233
+ puts final_svg, "\n"
234
+ elsif outfile != ""
235
+ f = ::File.new(outfile, "w+")
236
+ f.write(final_svg)
237
+ f.close
238
+ end
239
+ final_svg
289
240
  end
290
- final_svg
291
- end
292
241
 
293
- def self.ensign(outfile: nil, scale: nil)
294
- final_svg = ""
295
- final_svg << USPSFlags::Core.headers(scale: scale, title: "USPS Ensign")
296
- final_svg << USPSFlags::Core.ensign
297
- final_svg << USPSFlags::Core.footer
298
-
299
- if outfile.nil?
300
- puts final_svg, "\n"
301
- elsif outfile != ""
302
- f = ::File.new(outfile, "w+")
303
- f.write(final_svg)
304
- f.close
242
+ def ensign(outfile: nil, scale: nil)
243
+ final_svg = ""
244
+ final_svg << USPSFlags::Core.headers(scale: scale, title: "USPS Ensign")
245
+ final_svg << USPSFlags::Core.ensign
246
+ final_svg << USPSFlags::Core.footer
247
+
248
+ if outfile.nil?
249
+ puts final_svg, "\n"
250
+ elsif outfile != ""
251
+ f = ::File.new(outfile, "w+")
252
+ f.write(final_svg)
253
+ f.close
254
+ end
255
+ final_svg
305
256
  end
306
- final_svg
307
- end
308
257
 
309
- def self.wheel(outfile: nil, scale: nil)
310
- width = 4327.4667
311
- height = 4286.9333
312
- final_svg = ""
313
- final_svg << USPSFlags::Core.headers(width: width, height: height, scale: scale, title: "USPS Ensign Wheel")
314
- final_svg << USPSFlags::Core.wheel
315
- final_svg << USPSFlags::Core.footer
316
-
317
- if outfile.nil?
318
- puts final_svg, "\n"
319
- elsif outfile != ""
320
- f = ::File.new(outfile, "w+")
321
- f.write(final_svg)
322
- f.close
258
+ def wheel(outfile: nil, scale: nil)
259
+ width = 4327.4667
260
+ height = 4286.9333
261
+ final_svg = ""
262
+ final_svg << USPSFlags::Core.headers(width: width, height: height, scale: scale, title: "USPS Ensign Wheel")
263
+ final_svg << USPSFlags::Core.wheel
264
+ final_svg << USPSFlags::Core.footer
265
+
266
+ if outfile.nil?
267
+ puts final_svg, "\n"
268
+ elsif outfile != ""
269
+ f = ::File.new(outfile, "w+")
270
+ f.write(final_svg)
271
+ f.close
272
+ end
273
+ final_svg
323
274
  end
324
- final_svg
325
- end
326
275
 
327
- def self.us(outfile: nil, scale: nil)
328
- base_hoist = 2000.to_f
329
- base_fly = base_hoist * 1.91
330
- hoist = scale.nil? ? base_hoist : (base_hoist / scale)
331
- fly = hoist * 1.91
332
- final_svg = ""
333
- final_svg << USPSFlags::Core.headers(width: fly, height: hoist, scale: scale, title: "US Ensign")
334
- final_svg << USPSFlags::Core.us
335
- final_svg << USPSFlags::Core.footer
336
-
337
- if outfile.nil?
338
- puts final_svg, "\n"
339
- elsif outfile != ""
340
- f = ::File.new(outfile, "w+")
341
- f.write(final_svg)
342
- f.close
276
+ def us(outfile: nil, scale: nil)
277
+ base_hoist = 2000.to_f
278
+ base_fly = base_hoist * 1.91
279
+ hoist = scale.nil? ? base_hoist : (base_hoist / scale)
280
+ fly = hoist * 1.91
281
+ final_svg = ""
282
+ final_svg << USPSFlags::Core.headers(width: fly, height: hoist, scale: scale, title: "US Ensign")
283
+ final_svg << USPSFlags::Core.us
284
+ final_svg << USPSFlags::Core.footer
285
+
286
+ if outfile.nil?
287
+ puts final_svg, "\n"
288
+ elsif outfile != ""
289
+ f = ::File.new(outfile, "w+")
290
+ f.write(final_svg)
291
+ f.close
292
+ end
293
+ final_svg
343
294
  end
344
- final_svg
345
- end
346
295
 
347
- private
348
- def self.remove_static_files
349
- ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/SVG/*"))
350
- ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/PNG/*"))
351
- ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/ZIP/*"))
352
- ::FileUtils.mkdir_p("#{USPSFlags::Config.flags_dir}/SVG/insignia")
353
- ::FileUtils.mkdir_p("#{USPSFlags::Config.flags_dir}/PNG/insignia")
354
- puts "Cleared previous files."
355
- end
296
+ def remove_static_files
297
+ ["SVG", "PNG", "ZIP"].each { |dir| ::FileUtils.rm_rf(Dir.glob("#{USPSFlags::Config.flags_dir}/#{dir}/*")) }
298
+ ["SVG/insignia", "PNG/insignia"].each { |dir| ::FileUtils.mkdir_p("#{USPSFlags::Config.flags_dir}/#{dir}") }
299
+ USPSFlags::Helpers.log "\n - Cleared previous files.\n"
300
+ end
356
301
 
357
- def self.generate_static_images_for(flag, svg: true, png: true)
358
- start_time = Time.now
359
- USPSFlags::Helpers.log " | | _ _ _ _ _ | \r".rjust(max_length+31, " ")
360
- flag = flag.upcase
361
- USPSFlags::Helpers.log "#{flag.rjust(max_length)} |"
302
+ def get_file_paths(flag)
303
+ svg_file = "#{USPSFlags::Config.flags_dir}/SVG/#{flag}.svg"
304
+ png_file = svg_file.gsub("/SVG/", "/PNG/").gsub(".svg", ".png")
305
+ svg_ins_file = svg_file.gsub("/SVG/", "/SVG/insignia/")
306
+ png_ins_file = png_file.gsub("/PNG/", "/PNG/insignia/")
307
+ end
362
308
 
363
- svg_file = "#{USPSFlags::Config.flags_dir}/SVG/#{flag}.svg"
364
- png_file = "#{USPSFlags::Config.flags_dir}/PNG/#{flag}.png"
309
+ def generate_static_images_for(flag, svg: true, png: true)
310
+ start_time = Time.now
311
+ USPSFlags::Helpers.log " | | _ _ _ _ _ | \r".rjust(max_length+31, " ")
312
+ flag = flag.upcase
313
+ USPSFlags::Helpers.log "#{flag.rjust(max_length)} |"
365
314
 
366
- svg_ins_file = "#{USPSFlags::Config.flags_dir}/SVG/insignia/#{flag}.svg"
367
- png_ins_file = "#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.png"
315
+ svg_file, png_file, svg_ins_file, png_ins_file = get_file_paths(flag)
368
316
 
369
- past = (flag[0] == "P" && flag != "PORTCAP")
317
+ past = (flag[0] == "P" && flag != "PORTCAP")
370
318
 
371
- if svg
372
- self.generate_static_svg(flag, svg_file)
373
- else
374
- USPSFlags::Helpers.log "-"
375
- end
319
+ if svg
320
+ generate_static_svg(flag, svg_file)
321
+ else
322
+ USPSFlags::Helpers.log "-"
323
+ end
376
324
 
377
- if png
378
- self.generate_static_png(flag, png_file)
379
- else
380
- USPSFlags::Helpers.log "- "
325
+ if png
326
+ generate_static_png(flag, png_file)
327
+ else
328
+ USPSFlags::Helpers.log "- "
329
+ end
330
+ run_time = (Time.now - start_time).round(4).to_s[(0..5)].ljust(6, "0")
331
+ USPSFlags::Helpers.log " | #{run_time} s\n"
381
332
  end
382
- run_time = (Time.now - start_time).round(4).to_s[(0..5)].ljust(6, "0")
383
- USPSFlags::Helpers.log " | #{run_time} s\n"
384
- end
385
333
 
386
- def self.generate_static_svg(flag, svg_file)
387
- begin
388
- USPSFlags::Helpers.log " "
389
- self.get flag, outfile: svg_file, scale: 1
390
- USPSFlags::Helpers.log "S"
391
- if past || !USPSFlags::Helpers.valid_flags(:insignia).include?(flag)
392
- USPSFlags::Helpers.log "-"
393
- else
394
- self.get flag, field: false, outfile: svg_ins_file, scale: 1
395
- USPSFlags::Helpers.log "I"
334
+ def generate_static_svg(flag)
335
+ svg_file, png_file, svg_ins_file, png_ins_file = get_file_paths(flag)
336
+ begin
337
+ USPSFlags::Helpers.log " "
338
+ get flag, outfile: svg_file, scale: 1
339
+ USPSFlags::Helpers.log "S"
340
+ if past || !USPSFlags::Helpers.valid_flags(:insignia).include?(flag)
341
+ USPSFlags::Helpers.log "-"
342
+ else
343
+ get flag, field: false, outfile: svg_ins_file, scale: 1
344
+ USPSFlags::Helpers.log "I"
345
+ end
346
+ rescue => e
347
+ USPSFlags::Helpers.log "x -> #{e.message}"
396
348
  end
397
- rescue => e
398
- USPSFlags::Helpers.log "x -> #{e.message}"
399
349
  end
400
- end
401
350
 
402
- def self.generate_static_png(flag, png_file)
403
- USPSFlags::Helpers.log " | "
404
- begin
405
- USPSFlags::Helpers.log "…\b"
406
- USPSFlags::Generate.png(File.read(svg_file), outfile: png_file) unless ::File.exists?(png_file)
407
- USPSFlags::Helpers.log "F"
408
- if past || !insignia_flags.include?(flag)
409
- USPSFlags::Helpers.log "-"
410
- else
351
+ def generate_static_png(flag)
352
+ svg_file, png_file, svg_ins_file, png_ins_file = get_file_paths(flag)
353
+ USPSFlags::Helpers.log " | "
354
+ begin
411
355
  USPSFlags::Helpers.log "…\b"
412
- USPSFlags::Generate.png(File.read(svg_ins_file), outfile: png_ins_file, trim: true) unless ::File.exists?(png_ins_file)
413
- USPSFlags::Helpers.log "I"
414
- end
415
- sizes = {1500 => "H", 1000 => "K", 500 => "D", "thumb" => "T"}
416
- sizes.keys.each do |size|
417
- if ::File.exists?("#{USPSFlags::Config.flags_dir}/PNG/#{flag}.#{size}.png")
418
- USPSFlags::Helpers.log "."
356
+ png(File.read(svg_file), outfile: png_file) unless ::File.exist?(png_file)
357
+ USPSFlags::Helpers.log "F"
358
+ if past || !insignia_flags.include?(flag)
359
+ USPSFlags::Helpers.log "-"
419
360
  else
420
361
  USPSFlags::Helpers.log "…\b"
421
- if size == "thumb"
422
- size_key = size
423
- size = case flag
424
- when "ENSIGN"
425
- 200
426
- when "US"
427
- 300
428
- else
429
- 150
430
- end
362
+ png(File.read(svg_ins_file), outfile: png_ins_file, trim: true) unless ::File.exist?(png_ins_file)
363
+ USPSFlags::Helpers.log "I"
364
+ end
365
+ USPSFlags::Helpers.png_sizes.keys.each do |size|
366
+ if ::File.exist?("#{USPSFlags::Config.flags_dir}/PNG/#{flag}.#{size}.png")
367
+ USPSFlags::Helpers.log "."
431
368
  else
432
- size_key = size
433
- end
434
- MiniMagick::Tool::Convert.new do |convert|
435
- convert << "-background" << "none"
436
- convert << "-format" << "png"
437
- convert << "-resize" << "#{size}"
438
- convert << png_file
439
- convert << "#{USPSFlags::Config.flags_dir}/PNG/#{flag}.#{size_key}.png"
440
- end
441
- USPSFlags::Helpers.log sizes[size_key]
442
-
443
- if ::File.exists?(png_ins_file)
444
- if ::File.exists?("#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.#{size}.png")
369
+ USPSFlags::Helpers.log "…\b"
370
+ size, size_key = USPSFlags::Helpers.size_and_key(size: size, flag: flag)
371
+ USPSFlags::Helpers.resize_png(png_ins_file, flag: flag, size: size, size_key: size_key)
372
+ USPSFlags::Helpers.log USPSFlags::Helpers.png_sizes[size_key]
373
+ if ::File.exist?(png_ins_file) && ::File.exist?("#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.#{size}.png")
445
374
  USPSFlags::Helpers.log "."
446
- elsif MiniMagick::Image.open(png_ins_file)[:width] > size
375
+ elsif ::File.exist?(png_ins_file) && MiniMagick::Image.open(png_ins_file)[:width] > size
447
376
  USPSFlags::Helpers.log "…\b"
448
- MiniMagick::Tool::Convert.new do |convert|
449
- convert << "-background" << "none"
450
- convert << "-format" << "png"
451
- convert << "-resize" << "#{size}"
452
- convert << png_ins_file
453
- convert << "#{USPSFlags::Config.flags_dir}/PNG/insignia/#{flag}.#{size_key}.png"
454
- end
377
+ USPSFlags::Helpers.resize_png(png_ins_file, flag: flag, size: size, size_key: size_key)
455
378
  USPSFlags::Helpers.log "i"
456
- else
379
+ elsif ::File.exist?(png_ins_file)
457
380
  USPSFlags::Helpers.log "+"
381
+ else
382
+ USPSFlags::Helpers.log "-"
458
383
  end
459
- else
460
- USPSFlags::Helpers.log "-"
461
384
  end
462
385
  end
386
+ rescue => e
387
+ USPSFlags::Helpers.log "x -> #{e.message}"
463
388
  end
464
- rescue => e
465
- USPSFlags::Helpers.log "x -> #{e.message}"
466
389
  end
467
390
  end
468
391
  end