usps_flags 0.3.26 → 0.4.0
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
- data/.rubocop.yml +87 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +2 -2
- data/Rakefile +4 -2
- data/lib/rational.rb +3 -1
- data/lib/usps_flags.rb +15 -17
- data/lib/usps_flags/config.rb +32 -29
- data/lib/usps_flags/core.rb +11 -9
- data/lib/usps_flags/core/ensign.rb +20 -17
- data/lib/usps_flags/core/field.rb +33 -30
- data/lib/usps_flags/core/footer.rb +2 -0
- data/lib/usps_flags/core/headers.rb +11 -8
- data/lib/usps_flags/core/icons.rb +14 -0
- data/lib/usps_flags/core/{anchor.rb → icons/anchor.rb} +7 -5
- data/lib/usps_flags/core/{binoculars.rb → icons/binoculars.rb} +7 -5
- data/lib/usps_flags/core/{lighthouse.rb → icons/lighthouse.rb} +3 -1
- data/lib/usps_flags/core/{star.rb → icons/star.rb} +3 -1
- data/lib/usps_flags/core/{trident.rb → icons/trident.rb} +29 -25
- data/lib/usps_flags/core/{trumpet.rb → icons/trumpet.rb} +3 -1
- data/lib/usps_flags/core/pennant.rb +20 -17
- data/lib/usps_flags/core/trident_spec.rb +62 -174
- data/lib/usps_flags/core/trident_specs.rb +14 -0
- data/lib/usps_flags/core/trident_specs/base.rb +15 -0
- data/lib/usps_flags/core/trident_specs/circle.rb +51 -0
- data/lib/usps_flags/core/trident_specs/delta.rb +68 -0
- data/lib/usps_flags/core/trident_specs/header.rb +65 -0
- data/lib/usps_flags/core/trident_specs/long.rb +54 -0
- data/lib/usps_flags/core/trident_specs/short.rb +176 -0
- data/lib/usps_flags/core/tridents.rb +16 -14
- data/lib/usps_flags/core/us.rb +9 -7
- data/lib/usps_flags/core/wheel.rb +2 -0
- data/lib/usps_flags/errors.rb +16 -4
- data/lib/usps_flags/generate.rb +48 -44
- data/lib/usps_flags/generate/flag.rb +33 -30
- data/lib/usps_flags/helpers.rb +48 -63
- data/lib/usps_flags/helpers/builders.rb +39 -37
- data/lib/usps_flags/helpers/spec_arrows.rb +16 -13
- data/spec/rational_spec.rb +9 -7
- data/spec/spec_helper.rb +5 -3
- data/spec/usps_flags/config_spec.rb +15 -13
- data/spec/usps_flags/core_spec.rb +52 -51
- data/spec/usps_flags/generate_spec.rb +70 -60
- data/spec/usps_flags/helpers_spec.rb +12 -10
- data/spec/usps_flags_spec.rb +22 -20
- data/usps_flags.gemspec +4 -2
- metadata +31 -21
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
# SVG generators for multiple tridents.
|
2
4
|
#
|
3
5
|
# These methods should never need to be called directly.
|
@@ -7,33 +9,33 @@ class USPSFlags::Core::Tridents
|
|
7
9
|
def cc(type, trident_color:)
|
8
10
|
# The side C/C tridents are angled 45 degrees, and intersect the central one at 1/3 up from the bottom
|
9
11
|
trident = USPSFlags::Core.trident(type, color: trident_color)
|
10
|
-
x_distance = USPSFlags::Config::BASE_FLY*4/39
|
11
|
-
y_distance = USPSFlags::Config::BASE_FLY*5/78
|
12
|
+
x_distance = USPSFlags::Config::BASE_FLY * 4 / 39
|
13
|
+
y_distance = USPSFlags::Config::BASE_FLY * 5 / 78
|
12
14
|
<<~SVG
|
13
|
-
<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>
|
15
|
+
<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>
|
14
16
|
\n#{trident}
|
15
|
-
<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>
|
17
|
+
<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>
|
16
18
|
SVG
|
17
19
|
end
|
18
20
|
|
19
21
|
def vc(type, trident_color:)
|
20
22
|
# V/C tridents are angled 45 degrees, and intersect at 15/32 up from the bottom
|
21
23
|
trident = USPSFlags::Core.trident(type, color: trident_color)
|
22
|
-
x_distance = USPSFlags::Config::BASE_FLY*4/55
|
24
|
+
x_distance = USPSFlags::Config::BASE_FLY * 4 / 55
|
23
25
|
<<~SVG
|
24
|
-
<g transform="translate(-#{x_distance})"><g transform="rotate(-45, #{USPSFlags::Config::BASE_FLY/2}, #{USPSFlags::Config::BASE_HOIST/2})">\n#{trident}</g></g>
|
25
|
-
<g transform="translate(#{x_distance})"><g transform="rotate(45, #{USPSFlags::Config::BASE_FLY/2}, #{USPSFlags::Config::BASE_HOIST/2})">\n#{trident}</g></g>
|
26
|
+
<g transform="translate(-#{x_distance})"><g transform="rotate(-45, #{USPSFlags::Config::BASE_FLY / 2}, #{USPSFlags::Config::BASE_HOIST / 2})">\n#{trident}</g></g>
|
27
|
+
<g transform="translate(#{x_distance})"><g transform="rotate(45, #{USPSFlags::Config::BASE_FLY / 2}, #{USPSFlags::Config::BASE_HOIST / 2})">\n#{trident}</g></g>
|
26
28
|
SVG
|
27
29
|
end
|
28
30
|
|
29
31
|
def three(type, trident_color:, field_color:)
|
30
32
|
# Cdr and D/C tridents are spaced 1/2 the fly apart with the central one 1/4 the fly above the sides
|
31
33
|
trident = USPSFlags::Core.trident(type, color: trident_color, field_color: field_color)
|
32
|
-
x_distance = USPSFlags::Config::BASE_FLY/4
|
33
|
-
y_distance = USPSFlags::Config::BASE_FLY/16
|
34
|
+
x_distance = USPSFlags::Config::BASE_FLY / 4
|
35
|
+
y_distance = USPSFlags::Config::BASE_FLY / 16
|
34
36
|
<<~SVG
|
35
37
|
<g transform="translate(-#{x_distance}, #{y_distance})">\n#{trident}</g>
|
36
|
-
<g transform="translate(0, -#{y_distance+1})">\n#{trident}</g>
|
38
|
+
<g transform="translate(0, -#{y_distance + 1})">\n#{trident}</g>
|
37
39
|
<g transform="translate(#{x_distance}, #{y_distance})">\n#{trident}</g>
|
38
40
|
SVG
|
39
41
|
end
|
@@ -41,7 +43,7 @@ class USPSFlags::Core::Tridents
|
|
41
43
|
def two(type, trident_color:, field_color:)
|
42
44
|
# Lt/C and D/Lt/C tridents are spaced 1/3 the fly apart
|
43
45
|
trident = USPSFlags::Core.trident(type, color: trident_color, field_color: field_color)
|
44
|
-
x_distance = USPSFlags::Config::BASE_FLY/6
|
46
|
+
x_distance = USPSFlags::Config::BASE_FLY / 6
|
45
47
|
<<~SVG
|
46
48
|
<g transform="translate(-#{x_distance})">\n#{trident}</g>
|
47
49
|
<g transform="translate(#{x_distance})">\n#{trident}</g>
|
@@ -50,11 +52,11 @@ class USPSFlags::Core::Tridents
|
|
50
52
|
|
51
53
|
def offset(type, field_color:, field: true)
|
52
54
|
# Swallowtail tridents need to move towards the hoist due to the tails
|
53
|
-
x_distance = USPSFlags::Config::BASE_FLY/10 if field
|
54
|
-
svg =
|
55
|
+
x_distance = USPSFlags::Config::BASE_FLY / 10 if field
|
56
|
+
svg = ''
|
55
57
|
svg << "<g transform=\"translate(-#{x_distance})\">" if field
|
56
58
|
svg << USPSFlags::Core.trident(type, field_color: field_color, color: :red)
|
57
|
-
svg <<
|
59
|
+
svg << '</g>' if field
|
58
60
|
svg
|
59
61
|
end
|
60
62
|
end
|
data/lib/usps_flags/core/us.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
# Core SVG data for the US Ensign.
|
2
4
|
#
|
3
5
|
# This class should never need to be called directly.
|
@@ -5,10 +7,10 @@
|
|
5
7
|
class USPSFlags::Core::US
|
6
8
|
def svg
|
7
9
|
@base_hoist = 2000.to_f
|
8
|
-
@base_fly = @base_hoist*1.91
|
10
|
+
@base_fly = @base_hoist * 1.91
|
9
11
|
|
10
|
-
@canton_hoist = @base_hoist*7/13
|
11
|
-
@canton_fly = @canton_hoist*Math.sqrt(2)
|
12
|
+
@canton_hoist = @base_hoist * 7 / 13
|
13
|
+
@canton_fly = @canton_hoist * Math.sqrt(2)
|
12
14
|
|
13
15
|
@star_offset = 20 # Half of scaled star height
|
14
16
|
|
@@ -24,7 +26,7 @@ class USPSFlags::Core::US
|
|
24
26
|
svg
|
25
27
|
end
|
26
28
|
|
27
|
-
|
29
|
+
private
|
28
30
|
|
29
31
|
def defs
|
30
32
|
File.read("#{File.dirname(__dir__)}/core/us_defs.svg.partial").gsub('STAR', USPSFlags::Core.star)
|
@@ -40,12 +42,12 @@ class USPSFlags::Core::US
|
|
40
42
|
even: (2..10).step(2).to_a
|
41
43
|
}
|
42
44
|
|
43
|
-
svg =
|
45
|
+
svg = ''
|
44
46
|
%i[odd even].each do |type|
|
45
47
|
rows[type].each do |r|
|
46
48
|
columns[type].each do |c|
|
47
49
|
svg << <<~SVG
|
48
|
-
<g transform="translate(#{@canton_fly*c/12}, #{@star_offset
|
50
|
+
<g transform="translate(#{@canton_fly * c / 12}, #{@star_offset + @canton_hoist * r / 10})"><g><use href="#star" /></g></g>
|
49
51
|
SVG
|
50
52
|
end
|
51
53
|
end
|
@@ -56,7 +58,7 @@ class USPSFlags::Core::US
|
|
56
58
|
def stripes
|
57
59
|
s = (0..12).map do |i|
|
58
60
|
color = i.even? ? 'red' : 'white'
|
59
|
-
"<use href=\"##{color}-stripe\" y=\"#{@base_hoist*i/13}\" />"
|
61
|
+
"<use href=\"##{color}-stripe\" y=\"#{@base_hoist * i / 13}\" />"
|
60
62
|
end
|
61
63
|
|
62
64
|
s.join("\n") + "\n<rect y=\"0\" width=\"#{@canton_fly}\" height=\"#{@canton_hoist}\" fill=\"#{USPSFlags::Config::OLD_GLORY_BLUE}\" />\n"
|
data/lib/usps_flags/errors.rb
CHANGED
@@ -1,28 +1,40 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
# Custom errors.
|
2
4
|
#
|
3
5
|
# @private
|
4
6
|
module USPSFlags::Errors
|
5
7
|
class PNGGenerationError < StandardError
|
6
|
-
|
8
|
+
attr_reader :svg
|
9
|
+
|
10
|
+
def initialize(msg = 'There was an error generating the PNG file.', svg: '')
|
7
11
|
super(msg)
|
12
|
+
@svg = svg
|
8
13
|
end
|
9
14
|
end
|
10
15
|
|
11
16
|
class PNGConversionError < StandardError
|
12
|
-
def initialize(msg =
|
17
|
+
def initialize(msg = 'There was an error converting the PNG file.')
|
13
18
|
super(msg)
|
14
19
|
end
|
15
20
|
end
|
16
21
|
|
17
22
|
class StaticFilesGenerationError < StandardError
|
18
|
-
|
23
|
+
attr_reader :cause
|
24
|
+
|
25
|
+
def initialize(msg = 'There was an error generating the static files.', cause: nil)
|
19
26
|
super(msg)
|
27
|
+
@cause = cause
|
20
28
|
end
|
21
29
|
end
|
22
30
|
|
23
31
|
class ZipGenerationError < StandardError
|
24
|
-
|
32
|
+
attr_reader :type, :cause
|
33
|
+
|
34
|
+
def initialize(msg = 'There was an error generating the zip file.', type: nil, cause: nil)
|
25
35
|
super(msg)
|
36
|
+
@type = type
|
37
|
+
@cause = cause
|
26
38
|
end
|
27
39
|
end
|
28
40
|
end
|
data/lib/usps_flags/generate.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
# Controller class for generating files.
|
2
4
|
class USPSFlags::Generate
|
3
5
|
class << self
|
@@ -9,17 +11,17 @@ class USPSFlags::Generate
|
|
9
11
|
# @param [String] scale The image scale divisor factor.
|
10
12
|
# @return [String] Returns the SVG data.
|
11
13
|
def svg(flag, outfile: nil, scale: nil, field: true)
|
12
|
-
flag = flag.upcase.delete(
|
14
|
+
flag = flag.upcase.delete('/', '_', 'PENNANT')
|
13
15
|
|
14
16
|
USPSFlags::Helpers.ensure_dir_for_file(outfile)
|
15
17
|
|
16
|
-
if [
|
18
|
+
if ['CRUISE', 'OIC'].include?(flag)
|
17
19
|
USPSFlags::Generate::Flag.pennant(type: flag, outfile: outfile, scale: scale)
|
18
|
-
elsif flag ==
|
20
|
+
elsif flag == 'ENSIGN'
|
19
21
|
USPSFlags::Generate::Flag.ensign(outfile: outfile, scale: scale)
|
20
|
-
elsif flag ==
|
22
|
+
elsif flag == 'US'
|
21
23
|
USPSFlags::Generate::Flag.us(outfile: outfile, scale: scale)
|
22
|
-
elsif flag ==
|
24
|
+
elsif flag == 'WHEEL'
|
23
25
|
USPSFlags::Generate::Flag.wheel(outfile: outfile, scale: scale)
|
24
26
|
else
|
25
27
|
USPSFlags::Generate::Flag.officer(rank: flag, outfile: outfile, scale: scale, field: field)
|
@@ -33,16 +35,16 @@ class USPSFlags::Generate
|
|
33
35
|
# @param [Boolean] trim Whether to trim the generated PNG file of excess transparency.
|
34
36
|
# @param [String] background Background color. Defaults to 'none' (transparent).
|
35
37
|
def png(svg, outfile: nil, trim: false, background: 'none')
|
36
|
-
raise USPSFlags::Errors::PNGGenerationError
|
38
|
+
raise USPSFlags::Errors::PNGGenerationError.new(svg: svg) if outfile.nil? || outfile.empty?
|
37
39
|
|
38
40
|
set_temp_svg(svg)
|
39
41
|
|
40
42
|
USPSFlags::Helpers.ensure_dir_for_file(outfile)
|
41
43
|
|
42
44
|
MiniMagick::Tool::Convert.new do |convert|
|
43
|
-
convert <<
|
44
|
-
convert <<
|
45
|
-
convert <<
|
45
|
+
convert << '-background' << background
|
46
|
+
convert << '-format' << 'png'
|
47
|
+
convert << '-trim' if trim
|
46
48
|
convert << @temp_svg_path
|
47
49
|
convert << outfile
|
48
50
|
end
|
@@ -57,7 +59,7 @@ class USPSFlags::Generate
|
|
57
59
|
# @param [Boolean] zips Whether to create zip archives for all images created. Does not create a zip for skipped formats.
|
58
60
|
# @param [Boolean] reset Whether to delete all previous files before generating new files.
|
59
61
|
def all(svg: true, png: true, zips: true, reset: true)
|
60
|
-
raise USPSFlags::Errors::StaticFilesGenerationError,
|
62
|
+
raise USPSFlags::Errors::StaticFilesGenerationError, 'At least one argument switch must be true out of [svg, png, zips, reset].' unless svg || png || zips || reset
|
61
63
|
|
62
64
|
overall_start_time = Time.now
|
63
65
|
remove_static_files if reset
|
@@ -71,9 +73,10 @@ class USPSFlags::Generate
|
|
71
73
|
# @param [Boolean] svg Generate zip archive of SVG images.
|
72
74
|
# @param [Boolean] png Generate zip archive of PNG images.
|
73
75
|
def zips(svg: true, png: true)
|
74
|
-
raise USPSFlags::Errors::ZipGenerationError,
|
75
|
-
|
76
|
-
generate_zip(
|
76
|
+
raise USPSFlags::Errors::ZipGenerationError, 'At least one argument switch must be true out of [svg, png].' unless svg || png
|
77
|
+
|
78
|
+
generate_zip('svg') if svg
|
79
|
+
generate_zip('png') if png
|
77
80
|
end
|
78
81
|
|
79
82
|
# Generate static image files.
|
@@ -95,44 +98,45 @@ class USPSFlags::Generate
|
|
95
98
|
# @param [String] scale The image scale divisor factor.
|
96
99
|
# @return [String] Returns the SVG data.
|
97
100
|
def spec(outfile: nil, fly: USPSFlags::Config::BASE_FLY, unit: nil, scale: nil, scaled_border: false)
|
98
|
-
svg =
|
99
|
-
svg << USPSFlags::Core.headers(scale: scale, title:
|
101
|
+
svg = ''
|
102
|
+
svg << USPSFlags::Core.headers(scale: scale, title: 'USPS Trident Specifications')
|
100
103
|
svg << USPSFlags::Core.trident_spec(fly: fly, unit: unit, scaled_border: scaled_border)
|
101
104
|
svg << USPSFlags::Core.footer
|
102
105
|
|
103
106
|
USPSFlags::Helpers.output(svg, outfile: outfile)
|
104
107
|
end
|
105
108
|
|
106
|
-
|
109
|
+
private
|
110
|
+
|
107
111
|
def remove_static_files
|
108
|
-
[
|
112
|
+
['SVG', 'PNG', 'ZIP'].each do |dir|
|
109
113
|
dir_path = "#{USPSFlags.configuration.flags_dir}/#{dir}"
|
110
114
|
::FileUtils.rm_rf(::Dir.glob("#{dir_path}/*")) if ::Dir.exist?(dir_path)
|
111
115
|
end
|
112
|
-
[
|
116
|
+
['SVG/insignia', 'PNG/insignia'].each { |dir| ::FileUtils.mkdir_p("#{USPSFlags.configuration.flags_dir}/#{dir}") }
|
113
117
|
USPSFlags::Helpers.log "\n - Cleared previous files.\n"
|
114
118
|
end
|
115
119
|
|
116
120
|
def set_file_paths
|
117
121
|
@svg_file = "#{USPSFlags.configuration.flags_dir}/SVG/#{@flag}.svg"
|
118
|
-
@png_file = @svg_file.gsub(
|
119
|
-
@svg_ins_file = @svg_file.gsub(
|
120
|
-
@png_ins_file = @svg_file.gsub(
|
122
|
+
@png_file = @svg_file.gsub('/SVG/', '/PNG/').gsub('.svg', '.png')
|
123
|
+
@svg_ins_file = @svg_file.gsub('/SVG/', '/SVG/insignia/')
|
124
|
+
@png_ins_file = @svg_file.gsub('/SVG/', '/PNG/insignia/').gsub('.svg', '.png')
|
121
125
|
[@svg_file, @png_file, @svg_ins_file, @png_ins_file]
|
122
126
|
end
|
123
127
|
|
124
128
|
def static_generation_header
|
125
129
|
puts "\nSVGs generate a single file.",
|
126
|
-
|
127
|
-
|
130
|
+
'PNGs generate full-res, 1500w, 1000w, 500w, and thumbnail files.',
|
131
|
+
'Corresponding rank insignia (including smaller sizes) are also generated, as appropriate.'
|
128
132
|
USPSFlags::Helpers.log "\nGeneration location: #{USPSFlags.configuration.flags_dir}\n"
|
129
133
|
USPSFlags::Helpers.log "\n#{Time.now.strftime('%Y%m%d.%H%M%S%z')} – Generating static files...\n\n"
|
130
|
-
USPSFlags::Helpers.log "Flag | SVG | PNG | Run time\n".rjust(USPSFlags::Helpers.max_flag_name_length+31),
|
131
|
-
"\n".rjust(USPSFlags::Helpers.max_flag_name_length+32,
|
134
|
+
USPSFlags::Helpers.log "Flag | SVG | PNG | Run time\n".rjust(USPSFlags::Helpers.max_flag_name_length + 31),
|
135
|
+
"\n".rjust(USPSFlags::Helpers.max_flag_name_length + 32, '-')
|
132
136
|
end
|
133
137
|
|
134
138
|
def generate_zip(type)
|
135
|
-
raise USPSFlags::Errors::ZipGenerationError,
|
139
|
+
raise USPSFlags::Errors::ZipGenerationError, 'Flags directory not found.' unless ::Dir.exist?("#{USPSFlags.configuration.flags_dir}/ZIP")
|
136
140
|
|
137
141
|
zip = "#{USPSFlags.configuration.flags_dir}/ZIP/USPS_Flags.#{type}.zip"
|
138
142
|
::File.delete(zip) if ::File.exist?(zip)
|
@@ -146,8 +150,8 @@ class USPSFlags::Generate
|
|
146
150
|
end
|
147
151
|
|
148
152
|
def add_to_zip(z, f)
|
149
|
-
filename = f.split(
|
150
|
-
filename = "insignia/#{filename}" if f.split(
|
153
|
+
filename = f.split('/').last
|
154
|
+
filename = "insignia/#{filename}" if f.split('/').last(2).first == 'insignia'
|
151
155
|
z.add(filename, f)
|
152
156
|
end
|
153
157
|
|
@@ -158,16 +162,16 @@ class USPSFlags::Generate
|
|
158
162
|
|
159
163
|
set_file_paths
|
160
164
|
|
161
|
-
svg ? generate_static_svg : USPSFlags::Helpers.log(
|
162
|
-
png ? generate_static_png : USPSFlags::Helpers.log(
|
165
|
+
svg ? generate_static_svg : USPSFlags::Helpers.log('-')
|
166
|
+
png ? generate_static_png : USPSFlags::Helpers.log('- ')
|
163
167
|
|
164
|
-
run_time = (Time.now - start_time).round(4).to_s[(0..5)].ljust(6,
|
168
|
+
run_time = (Time.now - start_time).round(4).to_s[(0..5)].ljust(6, '0')
|
165
169
|
USPSFlags::Helpers.log " | #{run_time} s\n"
|
166
170
|
end
|
167
171
|
|
168
172
|
def generate_static_svg
|
169
|
-
USPSFlags::Helpers.log
|
170
|
-
|
173
|
+
USPSFlags::Helpers.log ' '
|
174
|
+
|
171
175
|
generate_regular_svg
|
172
176
|
generate_insignia_svg
|
173
177
|
end
|
@@ -176,19 +180,19 @@ class USPSFlags::Generate
|
|
176
180
|
return if file_found?(@svg_file)
|
177
181
|
|
178
182
|
svg @flag, outfile: @svg_file, scale: 1
|
179
|
-
USPSFlags::Helpers.log
|
183
|
+
USPSFlags::Helpers.log 'S'
|
180
184
|
end
|
181
185
|
|
182
186
|
def generate_insignia_svg
|
183
187
|
return if no_insignia?
|
184
188
|
|
185
189
|
svg @flag, field: false, outfile: @svg_ins_file, scale: 1
|
186
|
-
USPSFlags::Helpers.log
|
190
|
+
USPSFlags::Helpers.log 'I'
|
187
191
|
end
|
188
192
|
|
189
193
|
def set_temp_svg(svg)
|
190
194
|
@temp_svg_path = "#{USPSFlags.configuration.flags_dir}/temp.svg"
|
191
|
-
temp_svg = ::File.new(@temp_svg_path,
|
195
|
+
temp_svg = ::File.new(@temp_svg_path, 'w+')
|
192
196
|
temp_svg.write(svg)
|
193
197
|
temp_svg.flush
|
194
198
|
@temp_svg_path
|
@@ -199,7 +203,7 @@ class USPSFlags::Generate
|
|
199
203
|
end
|
200
204
|
|
201
205
|
def generate_static_png
|
202
|
-
USPSFlags::Helpers.log
|
206
|
+
USPSFlags::Helpers.log ' | '
|
203
207
|
generate_fullsize_png
|
204
208
|
generate_fullsize_png_insignia
|
205
209
|
generate_reduced_size_pngs
|
@@ -209,7 +213,7 @@ class USPSFlags::Generate
|
|
209
213
|
return if file_found?(@png_file)
|
210
214
|
|
211
215
|
png(File.read(@svg_file), outfile: @png_file)
|
212
|
-
USPSFlags::Helpers.log
|
216
|
+
USPSFlags::Helpers.log 'F'
|
213
217
|
end
|
214
218
|
|
215
219
|
def generate_fullsize_png_insignia
|
@@ -217,14 +221,14 @@ class USPSFlags::Generate
|
|
217
221
|
return if file_found?(@png_ins_file)
|
218
222
|
|
219
223
|
png(File.read(@svg_ins_file), outfile: @png_ins_file, trim: true)
|
220
|
-
USPSFlags::Helpers.log
|
224
|
+
USPSFlags::Helpers.log 'I'
|
221
225
|
end
|
222
226
|
|
223
227
|
def generate_reduced_size_pngs
|
224
228
|
USPSFlags::Helpers.png_sizes.keys.each do |size|
|
225
229
|
size, size_key = USPSFlags::Helpers.size_and_key(size: size, flag: @flag)
|
226
230
|
@sized_png_file = "#{USPSFlags.configuration.flags_dir}/PNG/#{@flag}.#{size_key}.png"
|
227
|
-
@sized_png_ins_file = @sized_png_file.gsub(
|
231
|
+
@sized_png_ins_file = @sized_png_file.gsub('/PNG/', '/PNG/insignia/')
|
228
232
|
|
229
233
|
generate_smaller_png(size, size_key)
|
230
234
|
generate_smaller_png_insignia(size, size_key)
|
@@ -245,27 +249,27 @@ class USPSFlags::Generate
|
|
245
249
|
return if too_big?(@png_ins_file, size)
|
246
250
|
|
247
251
|
USPSFlags::Helpers.resize_png(@png_ins_file, file: "insignia/#{@flag}", size: size, size_key: size_key)
|
248
|
-
USPSFlags::Helpers.log
|
252
|
+
USPSFlags::Helpers.log 'i'
|
249
253
|
end
|
250
254
|
|
251
255
|
def no_insignia?
|
252
256
|
return false if USPSFlags::Helpers.valid_flags(:insignia).include?(@flag)
|
253
257
|
|
254
|
-
USPSFlags::Helpers.log
|
258
|
+
USPSFlags::Helpers.log '-'
|
255
259
|
true
|
256
260
|
end
|
257
261
|
|
258
262
|
def file_found?(file)
|
259
263
|
return false unless ::File.exist?(file)
|
260
264
|
|
261
|
-
USPSFlags::Helpers.log
|
265
|
+
USPSFlags::Helpers.log '.'
|
262
266
|
true
|
263
267
|
end
|
264
268
|
|
265
269
|
def too_big?(file, size)
|
266
270
|
return false unless size > MiniMagick::Image.open(file)[:width]
|
267
271
|
|
268
|
-
USPSFlags::Helpers.log
|
272
|
+
USPSFlags::Helpers.log '+'
|
269
273
|
true
|
270
274
|
end
|
271
275
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
# SVG generators for special flags.
|
2
4
|
#
|
3
5
|
# These methods should never need to be called directly.
|
@@ -5,11 +7,12 @@
|
|
5
7
|
class USPSFlags::Generate::Flag
|
6
8
|
class << self
|
7
9
|
def officer(rank: nil, width: USPSFlags::Config::BASE_FLY, outfile: nil, scale: nil, field: true)
|
8
|
-
raise ArgumentError,
|
10
|
+
raise ArgumentError, 'No rank specified.' if rank.nil?
|
11
|
+
|
9
12
|
@rank = rank.to_s.upcase
|
10
13
|
@field = field
|
11
14
|
|
12
|
-
svg =
|
15
|
+
svg = ''
|
13
16
|
svg << USPSFlags::Core.headers(scale: scale, title: @rank)
|
14
17
|
modify_rank_for_insignia
|
15
18
|
@flag_details = USPSFlags::Helpers.flag_details(@rank)
|
@@ -21,29 +24,29 @@ class USPSFlags::Generate::Flag
|
|
21
24
|
|
22
25
|
def special(type, level:, field: true)
|
23
26
|
# Paths were designed for a base fly of 3000 pixels, but the base was changed for more useful fractions.
|
24
|
-
svg =
|
25
|
-
svg << "<g transform=\"translate(#{USPSFlags::Config::BASE_FLY/10})\">" unless field
|
26
|
-
svg << "<g transform=\"scale(#{Rational(USPSFlags::Config::BASE_FLY,3000).to_f})\">"
|
27
|
+
svg = ''
|
28
|
+
svg << "<g transform=\"translate(#{USPSFlags::Config::BASE_FLY / 10})\">" unless field
|
29
|
+
svg << "<g transform=\"scale(#{Rational(USPSFlags::Config::BASE_FLY, 3000).to_f})\">"
|
27
30
|
svg << case type
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
when :a
|
32
|
+
USPSFlags::Core.binoculars(level)
|
33
|
+
when :f
|
34
|
+
USPSFlags::Core.trumpet(level)
|
35
|
+
when :fc
|
36
|
+
USPSFlags::Core.anchor
|
37
|
+
when :pc
|
38
|
+
USPSFlags::Core.lighthouse
|
36
39
|
end
|
37
|
-
svg <<
|
38
|
-
svg <<
|
40
|
+
svg << '</g>'
|
41
|
+
svg << '</g>' unless field
|
39
42
|
|
40
43
|
svg
|
41
44
|
end
|
42
45
|
|
43
|
-
def pennant(type:
|
46
|
+
def pennant(type: 'CRUISE', outfile: nil, scale: nil)
|
44
47
|
type = type.upcase
|
45
|
-
svg =
|
46
|
-
title = {
|
48
|
+
svg = ''
|
49
|
+
title = { 'CRUISE' => 'Cruise Pennant', 'OIC' => 'Officer-in-Charge Pennant' }[type]
|
47
50
|
svg << USPSFlags::Core.headers(pennant: true, scale: scale, title: title)
|
48
51
|
svg << USPSFlags::Core.pennant(type)
|
49
52
|
svg << USPSFlags::Core.footer
|
@@ -52,8 +55,8 @@ class USPSFlags::Generate::Flag
|
|
52
55
|
end
|
53
56
|
|
54
57
|
def ensign(outfile: nil, scale: nil)
|
55
|
-
svg =
|
56
|
-
svg << USPSFlags::Core.headers(scale: scale, title:
|
58
|
+
svg = ''
|
59
|
+
svg << USPSFlags::Core.headers(scale: scale, title: 'USPS Ensign')
|
57
60
|
svg << USPSFlags::Core.ensign
|
58
61
|
svg << USPSFlags::Core.footer
|
59
62
|
|
@@ -63,8 +66,8 @@ class USPSFlags::Generate::Flag
|
|
63
66
|
def wheel(outfile: nil, scale: nil)
|
64
67
|
width = 4327.4667
|
65
68
|
height = 4286.9333
|
66
|
-
svg =
|
67
|
-
svg << USPSFlags::Core.headers(width: width, height: height, scale: scale, title:
|
69
|
+
svg = ''
|
70
|
+
svg << USPSFlags::Core.headers(width: width, height: height, scale: scale, title: 'USPS Ensign Wheel')
|
68
71
|
svg << USPSFlags::Core.wheel
|
69
72
|
svg << USPSFlags::Core.footer
|
70
73
|
|
@@ -73,18 +76,18 @@ class USPSFlags::Generate::Flag
|
|
73
76
|
|
74
77
|
def us(outfile: nil, scale: nil)
|
75
78
|
base_hoist = 2000.to_f
|
76
|
-
base_fly = base_hoist * 1.91
|
77
79
|
hoist = scale.nil? ? base_hoist : (base_hoist / scale)
|
78
80
|
fly = hoist * 1.91
|
79
|
-
svg =
|
80
|
-
svg << USPSFlags::Core.headers(width: fly, height: hoist, scale: scale, title:
|
81
|
+
svg = ''
|
82
|
+
svg << USPSFlags::Core.headers(width: fly, height: hoist, scale: scale, title: 'US Ensign')
|
81
83
|
svg << USPSFlags::Core.us
|
82
84
|
svg << USPSFlags::Core.footer
|
83
85
|
|
84
86
|
USPSFlags::Helpers.output(svg, outfile: outfile)
|
85
87
|
end
|
86
88
|
|
87
|
-
|
89
|
+
private
|
90
|
+
|
88
91
|
def get_officer_flag
|
89
92
|
if cc?
|
90
93
|
USPSFlags::Core::Tridents.cc(@flag_details[:type], trident_color: @trident_color)
|
@@ -104,18 +107,18 @@ class USPSFlags::Generate::Flag
|
|
104
107
|
end
|
105
108
|
|
106
109
|
def officer_flag_body
|
107
|
-
svg =
|
110
|
+
svg = ''
|
108
111
|
svg << USPSFlags::Core.field(style: @flag_details[:style], color: @flag_details[:color]) if @field
|
109
|
-
svg <<
|
112
|
+
svg << '<g transform="translate(-150, 400)"><g transform="scale(0.58333)">' if @flag_details[:style] == :past
|
110
113
|
svg << get_officer_flag
|
111
|
-
svg <<
|
114
|
+
svg << '</g></g>' if @flag_details[:style] == :past
|
112
115
|
svg << USPSFlags::Core.footer
|
113
116
|
svg
|
114
117
|
end
|
115
118
|
|
116
119
|
def modify_rank_for_insignia
|
117
120
|
@rank.slice!(0) if !@field && USPSFlags::Helpers.valid_flags(:past).include?(@rank)
|
118
|
-
@rank =
|
121
|
+
@rank = 'CDR' if @rank == 'C'
|
119
122
|
end
|
120
123
|
|
121
124
|
def cc?
|