usps_flags 0.1.25 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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