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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.travis.yml +4 -0
- data/CONTRIBUTING.md +2 -2
- data/Gemfile.lock +1 -1
- data/lib/usps_flags/generate.rb +327 -404
- data/lib/usps_flags/helpers.rb +330 -249
- data/usps_flags.gemspec +2 -2
- data.tar.gz.sig +3 -2
- metadata +2 -2
- metadata.gz.sig +0 -0
data/lib/usps_flags/generate.rb
CHANGED
|
@@ -1,468 +1,391 @@
|
|
|
1
1
|
# Controller class for generating files.
|
|
2
2
|
class USPSFlags::Generate
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
72
|
+
zips(svg: svg, png: png) if zips
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
USPSFlags::Helpers.log "\nTotal run time: #{Time.now - overall_start_time} s\n\n"
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
nil
|
|
77
|
+
end
|
|
77
78
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
|
|
205
|
+
final_svg << "</g></g>" if flag_details[:style] == :past
|
|
258
206
|
|
|
259
|
-
|
|
207
|
+
final_svg << USPSFlags::Core.footer
|
|
260
208
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
-
|
|
364
|
-
|
|
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
|
-
|
|
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
|
-
|
|
317
|
+
past = (flag[0] == "P" && flag != "PORTCAP")
|
|
370
318
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
319
|
+
if svg
|
|
320
|
+
generate_static_svg(flag, svg_file)
|
|
321
|
+
else
|
|
322
|
+
USPSFlags::Helpers.log "-"
|
|
323
|
+
end
|
|
376
324
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
USPSFlags::Helpers.
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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
|
-
|
|
413
|
-
USPSFlags::Helpers.log "
|
|
414
|
-
|
|
415
|
-
|
|
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
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|