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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +87 -0
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +2 -2
  5. data/Rakefile +4 -2
  6. data/lib/rational.rb +3 -1
  7. data/lib/usps_flags.rb +15 -17
  8. data/lib/usps_flags/config.rb +32 -29
  9. data/lib/usps_flags/core.rb +11 -9
  10. data/lib/usps_flags/core/ensign.rb +20 -17
  11. data/lib/usps_flags/core/field.rb +33 -30
  12. data/lib/usps_flags/core/footer.rb +2 -0
  13. data/lib/usps_flags/core/headers.rb +11 -8
  14. data/lib/usps_flags/core/icons.rb +14 -0
  15. data/lib/usps_flags/core/{anchor.rb → icons/anchor.rb} +7 -5
  16. data/lib/usps_flags/core/{binoculars.rb → icons/binoculars.rb} +7 -5
  17. data/lib/usps_flags/core/{lighthouse.rb → icons/lighthouse.rb} +3 -1
  18. data/lib/usps_flags/core/{star.rb → icons/star.rb} +3 -1
  19. data/lib/usps_flags/core/{trident.rb → icons/trident.rb} +29 -25
  20. data/lib/usps_flags/core/{trumpet.rb → icons/trumpet.rb} +3 -1
  21. data/lib/usps_flags/core/pennant.rb +20 -17
  22. data/lib/usps_flags/core/trident_spec.rb +62 -174
  23. data/lib/usps_flags/core/trident_specs.rb +14 -0
  24. data/lib/usps_flags/core/trident_specs/base.rb +15 -0
  25. data/lib/usps_flags/core/trident_specs/circle.rb +51 -0
  26. data/lib/usps_flags/core/trident_specs/delta.rb +68 -0
  27. data/lib/usps_flags/core/trident_specs/header.rb +65 -0
  28. data/lib/usps_flags/core/trident_specs/long.rb +54 -0
  29. data/lib/usps_flags/core/trident_specs/short.rb +176 -0
  30. data/lib/usps_flags/core/tridents.rb +16 -14
  31. data/lib/usps_flags/core/us.rb +9 -7
  32. data/lib/usps_flags/core/wheel.rb +2 -0
  33. data/lib/usps_flags/errors.rb +16 -4
  34. data/lib/usps_flags/generate.rb +48 -44
  35. data/lib/usps_flags/generate/flag.rb +33 -30
  36. data/lib/usps_flags/helpers.rb +48 -63
  37. data/lib/usps_flags/helpers/builders.rb +39 -37
  38. data/lib/usps_flags/helpers/spec_arrows.rb +16 -13
  39. data/spec/rational_spec.rb +9 -7
  40. data/spec/spec_helper.rb +5 -3
  41. data/spec/usps_flags/config_spec.rb +15 -13
  42. data/spec/usps_flags/core_spec.rb +52 -51
  43. data/spec/usps_flags/generate_spec.rb +70 -60
  44. data/spec/usps_flags/helpers_spec.rb +12 -10
  45. data/spec/usps_flags_spec.rb +22 -20
  46. data/usps_flags.gemspec +4 -2
  47. metadata +31 -21
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the file footer.
2
4
  #
3
5
  # This class should never need to be called directly.
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the file headers.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
7
  class USPSFlags::Core::Headers
6
- def initialize(width: nil, height: nil, pennant: false, scale: nil, title: "USPS Flag")
8
+ def initialize(width: nil, height: nil, pennant: false, scale: nil, title: 'USPS Flag')
7
9
  @width = width
8
10
  @height = height
9
11
  @title = title
10
12
  scale ||= 3
11
- @generated_at = Time.now.strftime("%Y%m%d.%H%S%z")
13
+ @generated_at = Time.now.strftime('%Y%m%d.%H%S%z')
12
14
 
13
15
  if @width.nil? || @height.nil?
14
16
  @width = USPSFlags::Config::BASE_FLY / scale
15
- @height = (@width*Rational(2,3)).to_i
17
+ @height = (@width * Rational(2, 3)).to_i
16
18
  @view_width = USPSFlags::Config::BASE_FLY
17
19
  @view_height = USPSFlags::Config::BASE_HOIST
18
20
  set_pennant_height(@height) if pennant
@@ -23,7 +25,7 @@ class USPSFlags::Core::Headers
23
25
  end
24
26
 
25
27
  def svg
26
- svg = ""
28
+ svg = ''
27
29
  svg << <<~SVG
28
30
  <?xml version="1.0" standalone="no"?>
29
31
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
@@ -34,7 +36,7 @@ class USPSFlags::Core::Headers
34
36
  <desc id="generated-at">#{@generated_at}</desc>
35
37
  SVG
36
38
 
37
- unless @title == "US Ensign"
39
+ unless @title == 'US Ensign'
38
40
  svg << <<~SVG
39
41
  <desc id="trademark-desc">This image is a registered trademark of United States Power Squadrons.</desc>
40
42
  <desc id="trademark-link">https://www.usps.org/images/secretary/itcom/trademark.pdf</desc>
@@ -48,9 +50,10 @@ class USPSFlags::Core::Headers
48
50
  svg
49
51
  end
50
52
 
51
- private
53
+ private
54
+
52
55
  def set_pennant_height(height)
53
- @height = height/4
54
- @view_height = USPSFlags::Config::BASE_HOIST/4
56
+ @height = height / 4
57
+ @view_height = USPSFlags::Config::BASE_HOIST / 4
55
58
  end
56
59
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: false
2
+
3
+ # Base module for Icons.
4
+ #
5
+ # These methods should never need to be called directly.
6
+ # @private
7
+ module USPSFlags::Core::Icons
8
+ require 'usps_flags/core/icons/anchor'
9
+ require 'usps_flags/core/icons/binoculars'
10
+ require 'usps_flags/core/icons/lighthouse'
11
+ require 'usps_flags/core/icons/star'
12
+ require 'usps_flags/core/icons/trident'
13
+ require 'usps_flags/core/icons/trumpet'
14
+ end
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the anchor insignia.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
- class USPSFlags::Core::Anchor
7
+ class USPSFlags::Core::Icons::Anchor
6
8
  def initialize(color: :red)
7
9
  @color_code = case color
8
- when :red
9
- USPSFlags::Config::RED
10
- when :white
11
- "#FFFFFF"
10
+ when :red
11
+ USPSFlags::Config::RED
12
+ when :white
13
+ '#FFFFFF'
12
14
  end
13
15
  end
14
16
 
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the binoculars insignia.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
- class USPSFlags::Core::Binoculars
7
+ class USPSFlags::Core::Icons::Binoculars
6
8
  def initialize(type: :d)
7
9
  @color = case type
8
- when :d
9
- USPSFlags::Config::RED
10
- when :n
11
- USPSFlags::Config::BLUE
10
+ when :d
11
+ USPSFlags::Config::RED
12
+ when :n
13
+ USPSFlags::Config::BLUE
12
14
  end
13
15
  end
14
16
 
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the lighthouse insignia.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
- class USPSFlags::Core::Lighthouse
7
+ class USPSFlags::Core::Icons::Lighthouse
6
8
  def svg
7
9
  <<~SVG
8
10
  <mask id="lighthouse-mask">
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for stars.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
- class USPSFlags::Core::Star
7
+ class USPSFlags::Core::Icons::Star
6
8
  def svg
7
9
  points = [
8
10
  [117.555, 81.805],
@@ -1,11 +1,14 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the trident insignia.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
- class USPSFlags::Core::Trident
7
+ class USPSFlags::Core::Icons::Trident
6
8
  def initialize(type, color: :blue, field_color: nil)
7
9
  valid_types = [:s, :d, :stf, :n]
8
10
  raise "Error: Invalid trident type. Options are #{valid_types}." unless valid_types.include? type
11
+
9
12
  @type = type
10
13
 
11
14
  load_config
@@ -14,9 +17,9 @@ class USPSFlags::Core::Trident
14
17
  end
15
18
 
16
19
  def svg
17
- svg = ""
18
- svg << "<g mask=\"url(#delta-mask)\">" if @type == :d
19
- svg << "<g mask=\"url(#circle-mask-for-main-spike)\">" if @type == :stf
20
+ svg = ''
21
+ svg << '<g mask="url(#delta-mask)">' if @type == :d
22
+ svg << '<g mask="url(#circle-mask-for-main-spike)">' if @type == :stf
20
23
 
21
24
  @trident_segments.each do |segment|
22
25
  start = segment.keys.first
@@ -25,7 +28,7 @@ class USPSFlags::Core::Trident
25
28
  points.each { |x, y| svg << "l #{x} #{y}\n" }
26
29
  svg << "\" fill=\"#{@color_code}\" />\n"
27
30
  end
28
- svg << "</g>" if [:d, :stf].include?(@type)
31
+ svg << '</g>' if [:d, :stf].include?(@type)
29
32
 
30
33
  case @type
31
34
  when :d
@@ -39,7 +42,8 @@ class USPSFlags::Core::Trident
39
42
  svg
40
43
  end
41
44
 
42
- private
45
+ private
46
+
43
47
  def load_config
44
48
  @trident_config = USPSFlags.configuration.trident
45
49
  @main_spike_overhang = @trident_config[:bar_width] / 2
@@ -47,7 +51,7 @@ class USPSFlags::Core::Trident
47
51
  @top_point = ((USPSFlags::Config::BASE_HOIST - @trident_config[:height][@type]) / 2)
48
52
  @crossbar_top = @top_point + @trident_config[:crossbar_from_top]
49
53
  @hash_from_top = @trident_config[:crossbar_from_top] + (@trident_config[:bar_width] * 2)
50
- @circle_from_top = @trident_config[:crossbar_from_top] + @trident_config[:bar_width]*123/128 + @trident_config[:width]/2
54
+ @circle_from_top = @trident_config[:crossbar_from_top] + @trident_config[:bar_width] * 123 / 128 + @trident_config[:width] / 2
51
55
  @main_length = @trident_config[:height][@type] - (@trident_config[:center_point_height] - @trident_config[:main_point_barb])
52
56
  end
53
57
 
@@ -73,7 +77,7 @@ class USPSFlags::Core::Trident
73
77
 
74
78
  def crossbar
75
79
  {
76
- [(@trident_config[:center_point] - @trident_config[:width]/2), (@crossbar_top)] =>
80
+ [(@trident_config[:center_point] - @trident_config[:width] / 2), (@crossbar_top)] =>
77
81
  [
78
82
  [@trident_config[:width], 0],
79
83
  [0, @trident_config[:bar_width]],
@@ -85,10 +89,10 @@ class USPSFlags::Core::Trident
85
89
 
86
90
  def left_spike
87
91
  {
88
- [(@trident_config[:center_point] - @trident_config[:width]/2), (@crossbar_top + 1)] =>
92
+ [(@trident_config[:center_point] - @trident_config[:width] / 2), (@crossbar_top + 1)] =>
89
93
  [
90
- [0, -(@trident_config[:side_spike_height]+@trident_config[:side_point_height])],
91
- [(@trident_config[:bar_width]+@side_spike_overhang), @trident_config[:side_point_height]],
94
+ [0, -(@trident_config[:side_spike_height] + @trident_config[:side_point_height])],
95
+ [(@trident_config[:bar_width] + @side_spike_overhang), @trident_config[:side_point_height]],
92
96
  [-@side_spike_overhang, 0],
93
97
  [0, @trident_config[:side_spike_height]]
94
98
  ]
@@ -97,10 +101,10 @@ class USPSFlags::Core::Trident
97
101
 
98
102
  def right_spike
99
103
  {
100
- [(@trident_config[:center_point] + @trident_config[:width]/2), (@crossbar_top + 1)] =>
104
+ [(@trident_config[:center_point] + @trident_config[:width] / 2), (@crossbar_top + 1)] =>
101
105
  [
102
- [0, -(@trident_config[:side_spike_height]+@trident_config[:side_point_height])],
103
- [-(@trident_config[:bar_width]+@side_spike_overhang), @trident_config[:side_point_height]],
106
+ [0, -(@trident_config[:side_spike_height] + @trident_config[:side_point_height])],
107
+ [-(@trident_config[:bar_width] + @side_spike_overhang), @trident_config[:side_point_height]],
104
108
  [@side_spike_overhang, 0],
105
109
  [0, @trident_config[:side_spike_height]]
106
110
  ]
@@ -117,13 +121,13 @@ class USPSFlags::Core::Trident
117
121
  end
118
122
 
119
123
  def configure_colors(color, field_color)
120
- @color_code = "#FFFFFF"
124
+ @color_code = '#FFFFFF'
121
125
  if color == :red
122
126
  @color_code = USPSFlags::Config::RED
123
- @field_color_code = "#FFFFFF"
127
+ @field_color_code = '#FFFFFF'
124
128
  elsif color == :blue
125
129
  @color_code = USPSFlags::Config::BLUE
126
- @field_color_code = "#FFFFFF"
130
+ @field_color_code = '#FFFFFF'
127
131
  elsif field_color == :red
128
132
  @field_color_code = USPSFlags::Config::RED
129
133
  elsif field_color == :blue
@@ -135,16 +139,16 @@ class USPSFlags::Core::Trident
135
139
  <<~SVG
136
140
  <polyline mask="url(#delta-mask)" fill="#{@color_code}" points="
137
141
  #{@trident_config[:center_point]}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom] - @trident_config[:delta_height]}
138
- #{@trident_config[:center_point] + @trident_config[:width]/2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom]}
139
- #{@trident_config[:center_point] - @trident_config[:width]/2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom]}
142
+ #{@trident_config[:center_point] + @trident_config[:width] / 2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom]}
143
+ #{@trident_config[:center_point] - @trident_config[:width] / 2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom]}
140
144
  #{@trident_config[:center_point]}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom] - @trident_config[:delta_height]}" />
141
145
  <mask id="delta-mask">
142
146
  <g>
143
147
  <rect x="0" y="0" width="#{USPSFlags::Config::BASE_FLY}" height="#{USPSFlags::Config::BASE_FLY}" fill="#FFFFFF" />
144
148
  <polyline transform="scale(#{@trident_config[:delta_gap_scale]}) translate(#{@trident_config[:delta_gap_x]},#{@trident_config[:delta_gap_y]})" fill="#000000" points="
145
149
  #{@trident_config[:center_point]}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom] - @trident_config[:delta_height]}
146
- #{@trident_config[:center_point] + @trident_config[:width]/2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom]*17/20}
147
- #{@trident_config[:center_point] - @trident_config[:width]/2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom]*17/20}
150
+ #{@trident_config[:center_point] + @trident_config[:width] / 2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom] * 17 / 20}
151
+ #{@trident_config[:center_point] - @trident_config[:width] / 2}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom] * 17 / 20}
148
152
  #{@trident_config[:center_point]}, #{@top_point + @trident_config[:height][:d] - @trident_config[:delta_from_bottom] - @trident_config[:delta_height]}" />
149
153
  </g>
150
154
  </mask>
@@ -153,24 +157,24 @@ class USPSFlags::Core::Trident
153
157
 
154
158
  def circle_hash
155
159
  <<~SVG
156
- <circle cx="#{@trident_config[:center_point]}" cy="#{@top_point + @circle_from_top}" r="#{@trident_config[:width]/2}" fill="#{@color_code}" mask="url(#circle-mask)" />
160
+ <circle cx="#{@trident_config[:center_point]}" cy="#{@top_point + @circle_from_top}" r="#{@trident_config[:width] / 2}" fill="#{@color_code}" mask="url(#circle-mask)" />
157
161
  <mask id="circle-mask">
158
162
  <g>
159
163
  <rect x="0" y="0" width="#{USPSFlags::Config::BASE_FLY}" height="#{USPSFlags::Config::BASE_FLY}" fill="#FFFFFF" />
160
- <circle cx="#{@trident_config[:center_point]}" cy="#{@top_point + @circle_from_top}" r="#{@trident_config[:width]/2-@trident_config[:bar_width]}" fill="#000000" />
164
+ <circle cx="#{@trident_config[:center_point]}" cy="#{@top_point + @circle_from_top}" r="#{@trident_config[:width] / 2 - @trident_config[:bar_width]}" fill="#000000" />
161
165
  </g>
162
166
  </mask>
163
167
  <mask id="circle-mask-for-main-spike">
164
168
  <g transform="scale(1.05) translate(-@trident_config[:br_width], -@trident_config[:br_width]/2)">
165
169
  <rect x="0" y="0" width="#{USPSFlags::Config::BASE_FLY}" height="#{USPSFlags::Config::BASE_FLY}" fill="#FFFFFF" />
166
- <circle cx="#{@trident_config[:center_point]}" cy="#{@top_point + @circle_from_top}" r="#{@trident_config[:width]/2-@trident_config[:bar_width]}" fill="#000000" />
170
+ <circle cx="#{@trident_config[:center_point]}" cy="#{@top_point + @circle_from_top}" r="#{@trident_config[:width] / 2 - @trident_config[:bar_width]}" fill="#000000" />
167
171
  </g>
168
172
  </mask>
169
173
  SVG
170
174
  end
171
175
 
172
176
  def standard_hash
173
- svg = "<path d=\"M #{(@trident_config[:center_point] - @trident_config[:hash_width]/2)} #{(@top_point + @hash_from_top)}\n"
177
+ svg = "<path d=\"M #{(@trident_config[:center_point] - @trident_config[:hash_width] / 2)} #{(@top_point + @hash_from_top)}\n"
174
178
  @lower_hash.each { |x, y| svg << "l #{x} #{y}\n" }
175
179
  svg << "\" fill=\"#{@color_code}\" />\n"
176
180
 
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the trumpet insignia.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
- class USPSFlags::Core::Trumpet
7
+ class USPSFlags::Core::Icons::Trumpet
6
8
  def initialize(type: :s)
7
9
  @color = type == :n ? USPSFlags::Config::BLUE : USPSFlags::Config::RED
8
10
  @count = type == :s ? 1 : 2
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the pennants.
2
4
  #
3
5
  # This class should never need to be called directly.
@@ -6,13 +8,13 @@ class USPSFlags::Core::Pennant
6
8
  def initialize(type: :cruise)
7
9
  @type = type.to_s.upcase
8
10
  @fly = USPSFlags::Config::BASE_FLY
9
- @hoist = USPSFlags::Config::BASE_HOIST/4
11
+ @hoist = USPSFlags::Config::BASE_HOIST / 4
10
12
  end
11
13
 
12
14
  def svg
13
- if @type == "OIC"
15
+ if @type == 'OIC'
14
16
  oic
15
- elsif @type == "CRUISE"
17
+ elsif @type == 'CRUISE'
16
18
  <<~SVG
17
19
  #{cruise}
18
20
  <g transform=\"translate(385, 340)\">
@@ -22,32 +24,33 @@ class USPSFlags::Core::Pennant
22
24
  end
23
25
  end
24
26
 
25
- private
27
+ private
28
+
26
29
  def oic
27
30
  <<~SVG
28
- <polyline fill="#{USPSFlags::Config::BLUE}" points="0 0 #{USPSFlags::Config::BASE_FLY} #{USPSFlags::Config::BASE_HOIST/8} 0 #{USPSFlags::Config::BASE_HOIST/4}" />
31
+ <polyline fill="#{USPSFlags::Config::BLUE}" points="0 0 #{USPSFlags::Config::BASE_FLY} #{USPSFlags::Config::BASE_HOIST / 8} 0 #{USPSFlags::Config::BASE_HOIST / 4}" />
29
32
  SVG
30
33
  end
31
34
 
32
35
  def cruise
33
36
  <<~SVG
34
37
  <path d="M 0 0
35
- l #{@fly*10/36} #{@hoist*5/36}
36
- l 0 #{@hoist*26/36}
37
- l -#{@fly*10/36} #{@hoist*5/36}
38
+ l #{@fly * 10 / 36} #{@hoist * 5 / 36}
39
+ l 0 #{@hoist * 26 / 36}
40
+ l -#{@fly * 10 / 36} #{@hoist * 5 / 36}
38
41
  " fill="#{USPSFlags::Config::RED}" />
39
- <path d="M #{@fly*10/36} #{@hoist*5/36}
40
- l #{@fly*11/36} #{@hoist*5.5/36}
41
- l 0 #{@hoist*15/36}
42
- l -#{@fly*11/36} #{@hoist*5.5/36}
42
+ <path d="M #{@fly * 10 / 36} #{@hoist * 5 / 36}
43
+ l #{@fly * 11 / 36} #{@hoist * 5.5 / 36}
44
+ l 0 #{@hoist * 15 / 36}
45
+ l -#{@fly * 11 / 36} #{@hoist * 5.5 / 36}
43
46
  " fill="#FFFFFF" />
44
- <path d="M #{@fly*21/36} #{@hoist*10.5/36}
45
- l #{@fly*15/36} #{@hoist*7.5/36}
46
- l -#{@fly*15/36} #{@hoist*7.5/36}
47
+ <path d="M #{@fly * 21 / 36} #{@hoist * 10.5 / 36}
48
+ l #{@fly * 15 / 36} #{@hoist * 7.5 / 36}
49
+ l -#{@fly * 15 / 36} #{@hoist * 7.5 / 36}
47
50
  " fill="#{USPSFlags::Config::BLUE}" />
48
51
  <path d="M 0 0
49
- l #{@fly} #{@hoist/2}
50
- l -#{@fly} #{@hoist/2}
52
+ l #{@fly} #{@hoist / 2}
53
+ l -#{@fly} #{@hoist / 2}
51
54
  " fill="none" stroke="#000000" stroke-width="2" />
52
55
  SVG
53
56
  end
@@ -1,10 +1,16 @@
1
+ # frozen_string_literal: false
2
+
1
3
  # Core SVG data for the trident specification sheet.
2
4
  #
3
5
  # This class should never need to be called directly.
4
6
  # @private
5
7
  class USPSFlags::Core::TridentSpec
6
- def initialize(fly: 24, unit: "in", scaled_border: false)
7
- @trident_config = USPSFlags.configuration.trident
8
+ SA = USPSFlags::Helpers::SpecArrows
9
+ BF = USPSFlags::Config::BASE_FLY
10
+ BH = USPSFlags::Config::BASE_HOIST
11
+
12
+ def initialize(fly: 24, unit: 'in', scaled_border: false)
13
+ @config = USPSFlags.configuration.trident
8
14
  @scaled_border = scaled_border
9
15
  configure_sizes(fly)
10
16
  configure_labels(unit)
@@ -12,26 +18,42 @@ class USPSFlags::Core::TridentSpec
12
18
 
13
19
  def svg
14
20
  svg = spec_header
21
+ svg << add_short_trident
22
+ svg << add_delta_trident
23
+ svg << add_national_tridents
15
24
 
16
- box_left = (USPSFlags::Config::BASE_FLY*27/32)/2
17
- box_right = (USPSFlags::Config::BASE_FLY*37/32)/2
18
- box_top = USPSFlags::Config::BASE_HOIST/4
19
- box_bottom = USPSFlags::Config::BASE_HOIST*3/4
20
- svg << short_trident(box_top, box_bottom, box_left, box_right)
25
+ svg
26
+ end
21
27
 
22
- box_top = USPSFlags::Config::BASE_HOIST*3/16
23
- box_bottom = USPSFlags::Config::BASE_HOIST*13/16
24
- svg << delta_trident(box_top, box_bottom, box_left, box_right)
28
+ private
25
29
 
26
- box_top = USPSFlags::Config::BASE_HOIST/8
27
- box_bottom = USPSFlags::Config::BASE_HOIST*7/8
28
- svg << circle_trident(box_top, box_bottom, box_left, box_right)
29
- svg << long_trident(box_top, box_bottom, box_left, box_right)
30
+ def box_left
31
+ (BF * 27 / 32) / 2
32
+ end
30
33
 
31
- svg
34
+ def box_right
35
+ (BF * 37 / 32) / 2
36
+ end
37
+
38
+ def add_short_trident
39
+ box_top = BH / 4
40
+ box_bottom = BH * 3 / 4
41
+ add_trident(:Short, box_top, box_bottom, box_left, box_right)
42
+ end
43
+
44
+ def add_delta_trident
45
+ box_top = BH * 3 / 16
46
+ box_bottom = BH * 13 / 16
47
+ add_trident(:Delta, box_top, box_bottom, box_left, box_right)
48
+ end
49
+
50
+ def add_national_tridents
51
+ box_top = BH / 8
52
+ box_bottom = BH * 7 / 8
53
+ add_trident(:Circle, box_top, box_bottom, box_left, box_right) +
54
+ add_trident(:Long, box_top, box_bottom, box_left, box_right)
32
55
  end
33
56
 
34
- private
35
57
  def configure_sizes(fly)
36
58
  @fly = Rational(fly)
37
59
  get_hoist_from_fly(@fly)
@@ -40,7 +62,7 @@ class USPSFlags::Core::TridentSpec
40
62
  end
41
63
 
42
64
  def get_hoist_from_fly(fly)
43
- hoist = (fly*Rational(2,3))
65
+ hoist = (fly * Rational(2, 3))
44
66
  @hoist = if hoist == hoist.to_i
45
67
  hoist.to_i
46
68
  else
@@ -49,7 +71,7 @@ class USPSFlags::Core::TridentSpec
49
71
  end
50
72
 
51
73
  def configure_hoist_fraction
52
- @hoist_fraction = ""
74
+ @hoist_fraction = ''
53
75
  if @hoist == @hoist.to_i
54
76
  @hoist = @hoist.to_i
55
77
  else
@@ -58,7 +80,7 @@ class USPSFlags::Core::TridentSpec
58
80
  end
59
81
 
60
82
  def configure_fly_fraction
61
- @fly_fraction = ""
83
+ @fly_fraction = ''
62
84
  if @fly == @fly.to_i
63
85
  @fly = @fly.to_i
64
86
  else
@@ -68,19 +90,19 @@ class USPSFlags::Core::TridentSpec
68
90
 
69
91
  def configure_labels(unit)
70
92
  @label_font_size = if Math.sqrt(@fly) > 24
71
- USPSFlags::Config::BASE_FLY * Math.log(24, Math.sqrt(@fly)) / 60
93
+ BF * Math.log(24, Math.sqrt(@fly)) / 60
72
94
  else
73
- USPSFlags::Config::BASE_FLY / 60
95
+ BF / 60
74
96
  end
75
97
 
76
- @unit_text = unit.nil? ? "" : "#{unit}"
98
+ @unit_text = unit.nil? ? '' : "#{unit}"
77
99
  @unit = unit
78
100
 
79
101
  configure_barb_label
80
102
  end
81
103
 
82
104
  def configure_barb_label
83
- barb_label = Rational(@trident_config[:main_point_barb]) * @fly / USPSFlags::Config::BASE_FLY
105
+ barb_label = Rational(@config[:main_point_barb]) * @fly / BF
84
106
  @barb_label = if barb_label == barb_label.to_i
85
107
  "#{barb_label.to_i}#{@unit_text}"
86
108
  else
@@ -89,164 +111,30 @@ class USPSFlags::Core::TridentSpec
89
111
  end
90
112
 
91
113
  def spec_header
92
- <<~SVG
93
- <!-- Field -->
94
- #{USPSFlags::Core.field}
95
-
96
- <!-- Specification Heading Information -->
97
- <g>
98
- <style><![CDATA[tspan.heading{font-size: 50%;}]]></style>
99
- <text x="#{USPSFlags::Config::BASE_FLY/2}" y="#{USPSFlags::Config::BASE_HOIST*3/40}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/20}px" font-weight="bold" fill="#041E42" text-anchor="middle">United States Power Squadrons<tspan class="heading" dy ="-#{USPSFlags::Config::BASE_HOIST/50}">®</tspan></text>
100
- </g>
101
- <text x="#{USPSFlags::Config::BASE_FLY/2}" y="#{USPSFlags::Config::BASE_HOIST/8}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/30}px" fill="#041E42" text-anchor="middle">Officer Flag Trident Specification</text>
102
- <text x="#{USPSFlags::Config::BASE_FLY/2}" y="#{USPSFlags::Config::BASE_HOIST*2/11}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/40}px" fill="#041E42" text-anchor="middle">All measurements are relative to a field with</text>
103
- <g>
104
- <style><![CDATA[tspan.title{font-size: #{USPSFlags::Config::FRACTION_SCALE*9/10}%;}]]></style>
105
- <text x="#{USPSFlags::Config::BASE_FLY/2}" y="#{USPSFlags::Config::BASE_HOIST*4/19}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/40}px" fill="#041E42" text-anchor="middle">fly of #{@fly} <tspan class="title">#{@fly_fraction}</tspan> #{@unit_text} and hoist of #{@hoist} <tspan class="title">#{@hoist_fraction}</tspan> #{@unit_text}.</text>
106
- </g>
107
- <text x="#{USPSFlags::Config::BASE_FLY/2}" y="#{USPSFlags::Config::BASE_HOIST/4}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/40}px" fill="#041E42" text-anchor="middle">Measurements not specified are the same as on the short trident.</text>
108
- #{scaled_border if @scaled_border}
109
- SVG
114
+ USPSFlags::Core::TridentSpecs::Header.new(
115
+ fly: @fly, fly_fraction: @fly_fraction, hoist: @hoist, hoist_fraction: @hoist_fraction,
116
+ unit_text: @unit_text, scaled_border: @scaled_border
117
+ ).p
110
118
  end
111
119
 
112
- def scaled_border
113
- <<~SVG
114
- <!-- Flag border scaled to spec trident size -->
115
- <rect x="#{USPSFlags::Config::BASE_FLY*0.41}" y="#{USPSFlags::Config::BASE_HOIST*0.38}" width="#{USPSFlags::Config::BASE_FLY}" height="#{USPSFlags::Config::BASE_HOIST}" transform="scale(0.7)" style="fill: none; stroke: #E0E0E0; stroke-width: 5px;" />
116
- <text x="#{USPSFlags::Config::BASE_FLY*0.64}" y="#{USPSFlags::Config::BASE_HOIST*0.96}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/60}px" fill="#CCCCCC" text-anchor="middle">Scale size of a flag.</text>
117
- SVG
118
- end
120
+ def add_trident(type, box_top, box_bottom, box_left, box_right)
121
+ sym = { Short: :s, Delta: :d, Circle: :stf, Long: :n }[type]
119
122
 
120
- def short_trident(box_top, box_bottom, box_left, box_right)
121
- <<~SVG
122
- <!-- Short Trident -->
123
- <g transform="translate(-#{USPSFlags::Config::BASE_FLY*14/80},#{USPSFlags::Config::BASE_HOIST*9/32})"><g transform="scale(0.7)">
124
- #{trident_heading(:s)}
125
-
126
- #{USPSFlags::Core::Trident.new(:s).svg}
127
-
128
- <!-- Boundary box -->
129
- <rect x="#{box_left}" y="#{box_top}" width="#{box_right-box_left}" height="#{USPSFlags::Config::BASE_HOIST/2}" stroke="#666666" stroke-width="#{USPSFlags::Config::BASE_FLY/600}" stroke-dasharray="15, 15" fill="none" />
130
-
131
- <!-- Right -->
132
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top, box_top+@trident_config[:bar_width]*4/5, box_right, box_right, fly: @fly, unit: @unit)} <!-- Side spike top gap -->
133
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:bar_width]*4/5, box_top+@trident_config[:bar_width]*9/10*2+@trident_config[:side_point_height]+@trident_config[:side_spike_height], nil, box_right, fly: @fly, unit: @unit)} <!-- Top gap to hash gap -->
134
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:bar_width]*18/10+@trident_config[:side_point_height]+@trident_config[:side_spike_height], box_top+@trident_config[:bar_width]*28/10+@trident_config[:side_point_height]+@trident_config[:side_spike_height], nil, @trident_config[:center_point]+@trident_config[:hash_width]/2, fly: @fly, unit: @unit)} <!-- Crossbar to hash gap -->
135
-
136
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:bar_width]*28/10+@trident_config[:side_point_height]+@trident_config[:side_spike_height], box_top+@trident_config[:bar_width]*38/10+@trident_config[:side_point_height]+@trident_config[:side_spike_height], nil, @trident_config[:center_point]+@trident_config[:hash_width]/2, fly: @fly, unit: @unit)} <!-- Hash -->
137
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:bar_width]*38/10+@trident_config[:side_point_height]+@trident_config[:side_spike_height], box_bottom, nil, box_right, fly: @fly, unit: @unit)} <!-- Hash to bottom -->
138
-
139
- <!-- Left -->
140
- #{USPSFlags::Helpers::SpecArrows.vertical(box_left-@trident_config[:bar_width]*5.25, box_top, box_bottom, box_left, box_left, fly: @fly, unit: @unit)} <!-- Boundary height -->
141
- #{USPSFlags::Helpers::SpecArrows.vertical(box_left-@trident_config[:bar_width]*0.75, box_top, box_top+@trident_config[:center_point_height], nil, @trident_config[:center_point]-@trident_config[:bar_width], label_offset: -USPSFlags::Config::BASE_FLY/24, label_offset_y: -USPSFlags::Config::BASE_FLY/60, label_align: "middle", fly: @fly, unit: @unit)} <!-- Main point height -->
142
- #{USPSFlags::Helpers::SpecArrows.vertical(box_left-@trident_config[:bar_width]*1.5, box_top+@trident_config[:bar_width]*4/5, box_top+@trident_config[:bar_width]*4/5+@trident_config[:side_point_height], box_left, box_left+@trident_config[:bar_width], label_offset: -USPSFlags::Config::BASE_FLY/24, label_align: "middle", fly: @fly, unit: @unit)} <!-- Side point height -->
143
-
144
- <!-- Bottom -->
145
- #{USPSFlags::Helpers::SpecArrows.horizontal(box_bottom+@trident_config[:bar_width], @trident_config[:center_point]-@trident_config[:bar_width]/2, @trident_config[:center_point]+@trident_config[:bar_width]/2, box_bottom, box_bottom, fly: @fly, unit: @unit)} <!-- Bar width -->
146
- #{USPSFlags::Helpers::SpecArrows.horizontal(box_bottom+@trident_config[:bar_width]*2.5, @trident_config[:center_point]-@trident_config[:hash_width]/2, @trident_config[:center_point]+@trident_config[:hash_width]/2, box_top+@trident_config[:bar_width]*4+@trident_config[:center_point_height]+@trident_config[:side_spike_height], box_top+@trident_config[:bar_width]*4+@trident_config[:center_point_height]+@trident_config[:side_spike_height], fly: @fly, unit: @unit)} <!-- Hash width -->
147
- #{USPSFlags::Helpers::SpecArrows.horizontal(box_bottom+@trident_config[:bar_width]*4, box_left, box_right, box_bottom, box_bottom, fly: @fly, unit: @unit)} <!-- Boundary width -->
148
-
149
- <!-- Top -->
150
- #{USPSFlags::Helpers::SpecArrows.horizontal(box_top-@trident_config[:bar_width], box_left, box_left+@trident_config[:bar_width]*3/2, box_top, box_top+@trident_config[:bar_width]*4/5+@trident_config[:side_point_height], label_offset: -USPSFlags::Config::BASE_FLY/60, fly: @fly, unit: @unit)} <!-- Side point width -->
151
- #{USPSFlags::Helpers::SpecArrows.horizontal(box_top-@trident_config[:bar_width]*2.5, @trident_config[:center_point]-@trident_config[:bar_width], @trident_config[:center_point]+@trident_config[:bar_width], box_top+@trident_config[:center_point_height], box_top+@trident_config[:center_point_height], label_offset: -USPSFlags::Config::BASE_FLY/60, fly: @fly, unit: @unit)} <!-- Main point width -->
152
-
153
- <!-- Overlay -->
154
- <!-- Main point barb -->
155
- <line x1="#{@trident_config[:center_point]+@trident_config[:bar_width]/2}" y1="#{box_top+@trident_config[:center_point_height]-@trident_config[:main_point_barb]}" x2="#{@trident_config[:center_point]+@trident_config[:bar_width]*3/2}" y2="#{box_top+@trident_config[:center_point_height]-@trident_config[:main_point_barb]*5}" stroke="#666666" stroke-width="2" stroke-dasharray="5, 5" />
156
- <line x1="#{@trident_config[:center_point]+@trident_config[:bar_width]/2}" y1="#{box_top+@trident_config[:center_point_height]}" x2="#{@trident_config[:center_point]+@trident_config[:bar_width]*3/2}" y2="#{box_top+@trident_config[:center_point_height]}" stroke="#666666" stroke-width="2" stroke-dasharray="5, 5" />
157
- <text x="#{@trident_config[:center_point]+@trident_config[:bar_width]*9/8}" y="#{box_top+@trident_config[:center_point_height]-@trident_config[:main_point_barb]}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_FLY/100}px" fill="#041E42" text-anchor="left">#{@barb_label}</text>
158
- </g></g>
159
- SVG
123
+ Object.const_get("USPSFlags::Core::TridentSpecs::#{type}").new(
124
+ bt: box_top, bb: box_bottom, bl: box_left, br: box_right,
125
+ fly: @fly, unit: @unit, heading: heading(sym), config: @config
126
+ ).p
160
127
  end
161
128
 
162
- def delta_trident(box_top, box_bottom, box_left, box_right)
163
- <<~SVG
164
- <!-- Delta Trident -->
165
- <g transform="translate(#{USPSFlags::Config::BASE_FLY*5/80},#{USPSFlags::Config::BASE_HOIST*9/32})"><g transform="scale(0.7)">
166
- #{trident_heading(:d)}
167
-
168
- #{USPSFlags::Core::Trident.new(:d).svg}
169
-
170
- <!-- Boundary box -->
171
- <rect x="#{box_left}" y="#{box_top}" width="#{box_right-box_left}" height="#{USPSFlags::Config::BASE_HOIST*5/8}" stroke="#666666" stroke-width="#{USPSFlags::Config::BASE_FLY/600}" stroke-dasharray="15, 15" fill="none" />
172
-
173
- <!-- Right -->
174
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_bottom-@trident_config[:delta_from_bottom]-@trident_config[:bar_width]-@trident_config[:delta_gap_height], box_bottom-@trident_config[:delta_from_bottom]-@trident_config[:bar_width], @trident_config[:center_point], @trident_config[:center_point]+@trident_config[:delta_gap_width], fly: @fly, unit: @unit)} <!-- Delta gap height -->
175
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_bottom-@trident_config[:delta_from_bottom]-@trident_config[:bar_width], box_bottom-@trident_config[:delta_from_bottom], nil, box_right, fly: @fly, unit: @unit)} <!-- Delta width -->
176
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_bottom-@trident_config[:delta_from_bottom], box_bottom, nil, box_right, fly: @fly, unit: @unit)} <!-- Delta to bottom -->
177
-
178
- <!-- Left -->
179
- #{USPSFlags::Helpers::SpecArrows.vertical(box_left-@trident_config[:bar_width]*1.5, box_top, box_bottom, box_left, box_left, label_offset: -USPSFlags::Config::BASE_FLY/30, label_offset_y: -USPSFlags::Config::BASE_FLY*2/11, label_align: "middle", fly: @fly, unit: @unit)} <!-- Boundary height -->
180
- </g></g>
181
- SVG
182
- end
183
-
184
- def circle_trident(box_top, box_bottom, box_left, box_right)
185
- <<~SVG
186
- <!-- Circle Trident -->
187
- <g transform="translate(#{USPSFlags::Config::BASE_FLY*23/80},#{USPSFlags::Config::BASE_HOIST*9/32})"><g transform="scale(0.7)">
188
- #{trident_heading(:stf)}
189
-
190
- #{USPSFlags::Core::Trident.new(:stf).svg}
191
-
192
- #{long_trident_boundary_box(box_top, box_left, box_right)}
193
-
194
- <!-- Right -->
195
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:crossbar_from_top]+@trident_config[:bar_width]*2, box_top+@trident_config[:crossbar_from_top]+@trident_config[:width], @trident_config[:center_point], @trident_config[:center_point], fly: @fly, unit: @unit)} <!-- Inner circle diameter -->
196
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:crossbar_from_top]+@trident_config[:width], box_top+@trident_config[:crossbar_from_top]+@trident_config[:bar_width]+@trident_config[:width], nil, @trident_config[:center_point]+@trident_config[:bar_width]/2, fly: @fly, unit: @unit)} <!-- Outer circle diameter -->
197
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:crossbar_from_top]+@trident_config[:bar_width]+@trident_config[:width], box_bottom, nil, box_right, fly: @fly, unit: @unit)} <!-- Circle to bottom -->
198
-
199
- #{long_trident_left_arrow(box_top, box_bottom, box_left, box_right)}
200
- </g></g>
201
- SVG
202
- end
203
-
204
- def long_trident(box_top, box_bottom, box_left, box_right)
205
- <<~SVG
206
- <!-- Long Trident -->
207
- <g transform="translate(#{USPSFlags::Config::BASE_FLY*40/80},#{USPSFlags::Config::BASE_HOIST*9/32})"><g transform="scale(0.7)">
208
- #{trident_heading(:n)}
209
-
210
- #{USPSFlags::Core::Trident.new(:n).svg}
211
-
212
- #{long_trident_boundary_box(box_top, box_left, box_right)}
213
-
214
- <!-- Right -->
215
- #{USPSFlags::Helpers::SpecArrows.vertical(box_right+@trident_config[:bar_width], box_top+@trident_config[:crossbar_from_top]+@trident_config[:bar_width]*3, box_bottom, @trident_config[:center_point]+@trident_config[:hash_width]/2, box_right, fly: @fly, unit: @unit)} <!-- Hash to bottom -->
216
-
217
- #{long_trident_left_arrow(box_top, box_bottom, box_left, box_right)}
218
- </g></g>
219
- SVG
220
- end
221
-
222
- def trident_heading(type_sym)
223
- type, description = case type_sym
224
- when :s
225
- ["Short", "Squadron Officers"]
226
- when :d
227
- ["Delta", "District Officers"]
228
- when :stf
229
- ["Circle", "Staff Commanders Only"]
230
- when :n
231
- ["Long", "National Officers"]
232
- end
233
- <<~SVG
234
- <text x="#{USPSFlags::Config::BASE_FLY/2}" y="#{USPSFlags::Config::BASE_HOIST*1/40}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/30}px" font-weight="bold" fill="#BF0D3E" text-anchor="middle">#{type}</text>
235
- <text x="#{USPSFlags::Config::BASE_FLY/2}" y="#{USPSFlags::Config::BASE_HOIST*5/80}" font-family="sans-serif" font-size="#{USPSFlags::Config::BASE_HOIST/40}px" fill="#BF0D3E" text-anchor="middle">#{description}</text>
236
- SVG
237
- end
238
-
239
- def long_trident_boundary_box(box_top, box_left, box_right)
240
- <<~SVG
241
- <!-- Boundary box -->
242
- <rect x="#{box_left}" y="#{box_top}" width="#{box_right-box_left}" height="#{USPSFlags::Config::BASE_HOIST*3/4}" stroke="#666666" stroke-width="#{USPSFlags::Config::BASE_FLY/600}" stroke-dasharray="15, 15" fill="none" />
243
- SVG
244
- end
129
+ def heading(type_sym)
130
+ type, description = {
131
+ s: ['Short', 'Squadron Officers'], d: ['Delta', 'District Officers'],
132
+ stf: ['Circle', 'Staff Commanders Only'], n: ['Long', 'National Officers']
133
+ }[type_sym]
245
134
 
246
- def long_trident_left_arrow(box_top, box_bottom, box_left, box_right)
247
135
  <<~SVG
248
- <!-- Left -->
249
- #{USPSFlags::Helpers::SpecArrows.vertical(box_left-@trident_config[:bar_width]*1.5, box_top, box_bottom, box_left, box_left, label_offset: -USPSFlags::Config::BASE_FLY/30, label_offset_y: -USPSFlags::Config::BASE_FLY/4.5, label_align: "middle", fly: @fly, unit: @unit)} <!-- Boundary height -->
136
+ <text x="#{BF / 2}" y="#{BH * 1 / 40}" font-family="sans-serif" font-size="#{BH / 30}px" font-weight="bold" fill="#BF0D3E" text-anchor="middle">#{type}</text>
137
+ <text x="#{BF / 2}" y="#{BH * 5 / 80}" font-family="sans-serif" font-size="#{BH / 40}px" fill="#BF0D3E" text-anchor="middle">#{description}</text>
250
138
  SVG
251
139
  end
252
140
  end