lib/usps_flags/helpers.rb in usps_flags-0.1.26 vs lib/usps_flags/helpers.rb in usps_flags-0.2.0
- old
+ new
@@ -60,10 +60,18 @@
district_elected.last, district_past.last,
national_elected.last, national_past.last]
end
end
+ # Gets the maximum length among valid flags.
+ #
+ # This is used USPSFlags::Generate, and should never need to be called directly.
+ # @private
+ def max_flag_name_length
+ valid_flags(:all).map(&:length).max
+ end
+
# Gets the generation details for the given rank.
#
# This is used USPSFlags::Generate, and should never need to be called directly.
# @private
def flag_details(rank)
@@ -74,148 +82,10 @@
level: flag_level(rank),
count: flag_count(rank)
}
end
- # Displays an overlay grid with regularly spaced locator markers.
- #
- # This is useful for adjusting or creating new SVG data generators, but should not otherwise need to be called.
- # @private
- def grid(width: USPSFlags::Config::BASE_FLY, height: USPSFlags::Config::BASE_HOIST)
- <<~SVG
- <circle cx="0" cy="0" r="#{width/60}" fill="#000000" fill-opacity="0.4" />
- <circle cx="#{width}" cy="0" r="#{width/60}" fill="#000000" fill-opacity="0.4" />
- <circle cx="#{width}" cy="#{height}" r="#{width/60}" fill="#000000" fill-opacity="0.4" />
- <circle cx="0" cy="#{height}" r="#{width/60}" fill="#000000" fill-opacity="0.4" />
-
- <circle cx="#{width*1/4}" cy="#{height/2}" r="#{width/60}" fill="#999999" fill-opacity="0.4" />
- <circle cx="#{width*3/4}" cy="#{height/2}" r="#{width/60}" fill="#999999" fill-opacity="0.4" />
-
- <circle cx="#{width/2}" cy="#{height*1/4}" r="#{width/60}" fill="#999999" fill-opacity="0.4" />
- <circle cx="#{width/2}" cy="#{height/2}" r="#{width/60}" fill="#000000" fill-opacity="0.4" />
- <circle cx="#{width/2}" cy="#{height/2}" r="#{width/75}" fill="#CCCCCC" fill-opacity="0.4" />
- <circle cx="#{width/2}" cy="#{height/2}" r="#{width/100}" fill="#000000" fill-opacity="0.4" />
- <circle cx="#{width/2}" cy="#{height*3/4}" r="#{width/60}" fill="#999999" fill-opacity="0.4" />
-
- <line x1="0" y1="0" x2="#{width}" y2="0" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line x1="0" y1="#{height*1/4}" x2="#{width}" y2="#{height*1/4}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line x1="0" y1="#{height/2}" x2="#{width}" y2="#{height/2}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line x1="0" y1="#{height*3/4}" x2="#{width}" y2="#{height*3/4}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line x1="0" y1="#{height}" x2="#{width}" y2="#{height}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
-
- <line y1="0" x1="0" y2="#{height}" x2="0" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line y1="0" x1="#{width*1/6}" y2="#{height}" x2="#{width*1/6}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line y1="0" x1="#{width*2/6}" y2="#{height}" x2="#{width*2/6}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line y1="0" x1="#{width*3/6}" y2="#{height}" x2="#{width*3/6}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line y1="0" x1="#{width*4/6}" y2="#{height}" x2="#{width*4/6}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line y1="0" x1="#{width*5/6}" y2="#{height}" x2="#{width*5/6}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line y1="0" x1="#{width}" y2="#{height}" x2="#{width}" stroke="#333333" stroke-width="#{width/600}" stroke-opacity="0.5" />
-
- <line x1="#{width/2}" y1="#{height*1/4}" x2="#{width*3/4}" y2="#{height/2}" stroke="#999999" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line x1="#{width*3/4}" y1="#{height/2}" x2="#{width/2}" y2="#{height*3/4}" stroke="#999999" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line x1="#{width/2}" y1="#{height*3/4}" x2="#{width*1/4}" y2="#{height/2}" stroke="#999999" stroke-width="#{width/600}" stroke-opacity="0.5" />
- <line x1="#{width*1/4}" y1="#{height/2}" x2="#{width/2}" y2="#{height*1/4}" stroke="#999999" stroke-width="#{width/600}" stroke-opacity="0.5" />
-
- SVG
- end
-
- # Displays an overlay indicator of concentric circles and radiating lines.
- #
- # This is useful for adjusting or creating new SVG data generators, but should not otherwise need to be called.
- # @private
- def locator
- <<~SVG
- <circle cx="0" cy="0" r="#{USPSFlags::Config::BASE_FLY*2}" fill="#000000" fill-opacity="0.4" />
- <circle cx="0" cy="0" r="#{USPSFlags::Config::BASE_FLY}" fill="#333333" fill-opacity="0.4" />
- <circle cx="0" cy="0" r="#{USPSFlags::Config::BASE_FLY/2}" fill="#666666" fill-opacity="0.4" />
- <circle cx="0" cy="0" r="#{USPSFlags::Config::BASE_FLY/4}" fill="#999999" fill-opacity="0.4" />
- <circle cx="0" cy="0" r="#{USPSFlags::Config::BASE_FLY/8}" fill="#CCCCCC" fill-opacity="0.4" />
- <circle cx="0" cy="0" r="#{USPSFlags::Config::BASE_FLY/16}" fill="#FFFFFF" fill-opacity="0.4" />
-
- <line x1="-#{USPSFlags::Config::BASE_FLY}" y1="-#{USPSFlags::Config::BASE_HOIST}" x2="#{USPSFlags::Config::BASE_FLY}" y2="#{USPSFlags::Config::BASE_HOIST}" stroke="#FFFFFF" stroke-width="#{USPSFlags::Config::BASE_FLY/600}" />
- <line x1="-#{USPSFlags::Config::BASE_FLY}" y1="#{USPSFlags::Config::BASE_HOIST}" x2="#{USPSFlags::Config::BASE_FLY}" y2="-#{USPSFlags::Config::BASE_HOIST}" stroke="#FFFFFF" stroke-width="#{USPSFlags::Config::BASE_FLY/600}" />
- <line x1="0" y1="#{USPSFlags::Config::BASE_HOIST}" x2="0" y2="-#{USPSFlags::Config::BASE_HOIST}" stroke="#FFFFFF" stroke-width="#{USPSFlags::Config::BASE_FLY/600}" />
- <line x1="-#{USPSFlags::Config::BASE_FLY}" y1="0" x2="#{USPSFlags::Config::BASE_FLY}" y2="0" stroke="#FFFFFF" stroke-width="#{USPSFlags::Config::BASE_FLY/600}" />
-
- <rect x="0" y="0" width="#{USPSFlags::Config::BASE_FLY/30}" height="#{USPSFlags::Config::BASE_FLY/30}" fill="#333333" fill-opacity="0.6" />
- SVG
- end
-
- # Creates a vertical arrow for the trident spec sheet.
- #
- # This is used USPSFlags::Core.trident_spec, and should never need to be called directly.
- # @private
- def v_arrow(x, top, bottom, pointer_top = nil, pointer_bottom = nil, label: nil, label_offset: (USPSFlags::Config::BASE_FLY/120), label_offset_y: 0, label_align: "left", color: "#CCCCCC", stroke_width: (USPSFlags::Config::BASE_FLY/600), stroke_dash: "10, 10", font_size: (USPSFlags::Config::BASE_FLY/60), arrow_size: (USPSFlags::Config::BASE_FLY/120), fly: USPSFlags::Config::BASE_FLY, unit: nil)
- label = bottom - top if label.nil?
- label = label.to_i if label - label.to_i == 0
- label = Rational(label) * fly / USPSFlags::Config::BASE_FLY
- if label == label.to_i
- label = label.to_i
- label_fraction = ""
- else
- label, label_fraction = label.to_simplified_a
- end
- svg = ""
- unless pointer_top.nil?
- svg << <<~SVG
- <line x1="#{x}" y1="#{top}" x2="#{pointer_top}" y2="#{top}" stroke="#{color}" stroke-width="#{stroke_width}" stroke-dasharray="#{stroke_dash}" />
- SVG
- end
- unless pointer_bottom.nil?
- svg << <<~SVG
- <line x1="#{x}" y1="#{bottom}" x2="#{pointer_bottom}" y2="#{bottom}" stroke="#{color}" stroke-width="#{stroke_width}" stroke-dasharray="#{stroke_dash}" />
- SVG
- end
-
- svg << <<~SVG
- <path d="M#{x} #{top} l #{arrow_size} #{arrow_size} M#{x} #{top} l -#{arrow_size} #{arrow_size} M#{x} #{top} l 0 #{bottom - top} l #{arrow_size} -#{arrow_size} M#{x} #{bottom} l -#{arrow_size} -#{arrow_size}" stroke="#{color}" stroke-width="#{stroke_width}" fill="none" />
- <g>
- <style><![CDATA[tspan{font-size: #{USPSFlags::Config::FRACTION_SCALE}%;}]]></style>
- <text x="#{x + label_offset}" y="#{(top+bottom)/2+(USPSFlags::Config::BASE_HOIST/150)+label_offset_y}" font-family="sans-serif" font-size="#{font_size}px" fill="#041E42" text-anchor="#{label_align}">#{label} <tspan>#{label_fraction}</tspan> #{unit}</text>
- </g>
- SVG
-
- svg
- end
-
- # Creates a horizontal arrow for the trident spec sheet.
- #
- # This is used USPSFlags::Core.trident_spec, and should never need to be called directly.
- # @private
- def h_arrow(y, left, right, pointer_left = nil, pointer_right = nil, label: nil, label_offset: (USPSFlags::Config::BASE_FLY/45), label_offset_x: 0, label_align: "middle", color: "#CCCCCC", stroke_width: (USPSFlags::Config::BASE_FLY/600), stroke_dash: "10, 10", font_size: (USPSFlags::Config::BASE_FLY/60), arrow_size: (USPSFlags::Config::BASE_FLY/120), fly: USPSFlags::Config::BASE_FLY, unit: nil)
- label = right - left if label.nil?
- label = label.to_i if label - label.to_i == 0
- label = Rational(label) * fly / USPSFlags::Config::BASE_FLY
- if label == label.to_i
- label = label.to_i
- label_fraction = ""
- else
- label, label_fraction = label.to_simplified_a
- end
- svg = ""
- unless pointer_left.nil?
- svg << <<~SVG
- <line x1="#{left}" y1="#{y}" x2="#{left}" y2="#{pointer_left}" stroke="#{color}" stroke-width="#{stroke_width}" stroke-dasharray="#{stroke_dash}" />
- SVG
- end
- unless pointer_right.nil?
- svg << <<~SVG
- <line x1="#{right}" y1="#{y}" x2="#{right}" y2="#{pointer_right}" stroke="#{color}" stroke-width="#{stroke_width}" stroke-dasharray="#{stroke_dash}" />
- SVG
- end
-
- svg << <<~SVG
- <path d="M#{left} #{y} l #{arrow_size} #{arrow_size} M#{left} #{y} l #{arrow_size} -#{arrow_size} M#{left} #{y} l #{right - left} 0 l -#{arrow_size} -#{arrow_size} M#{right} #{y} l -#{arrow_size} #{arrow_size}" stroke="#{color}" stroke-width="#{stroke_width}" fill="none" />
- <g>
- <style><![CDATA[tspan{font-size: #{USPSFlags::Config::FRACTION_SCALE}%;}]]></style>
- <text x="#{(left+right)/2+label_offset_x}" y="#{y + label_offset}" font-family="sans-serif" font-size="#{font_size}px" fill="#041E42" text-anchor="#{label_align}">#{label} <tspan>#{label_fraction}</tspan> #{unit}</text>
- </g>
- SVG
-
- svg
- end
-
# Resizes and saves a PNG image.
#
# This is used USPSFlags::Generate, and should never need to be called directly.
# @private
def resize_png(png_ins_file, flag:, size:, size_key:)
@@ -277,10 +147,25 @@
messages
ensure
log_file.close if log_file.is_a?(File)
end
+ # Prints output to the console or saves to a file, then returns the generated data.
+ #
+ # This should never need to be called directly.
+ # @private
+ def output(svg, outfile: nil)
+ if outfile.nil?
+ puts svg, "\n"
+ elsif outfile != ""
+ f = ::File.new(outfile, "w+")
+ f.write(svg)
+ f.close
+ end
+ svg
+ end
+
private
def flag_style(rank)
if valid_flags(:past).include?(rank)
:past
elsif valid_flags(:swallowtail).include?(rank)
@@ -327,19 +212,11 @@
1
end
end
def flag_type(rank)
- if valid_flags(:squadron).include?(rank)
- :s
- elsif valid_flags(:district).include?(rank)
- :d
- elsif rank == "STFC"
- :stf
- elsif valid_flags(:national).include?(rank)
- :n
- elsif rank == "PORTCAP"
+ if rank == "PORTCAP"
:pc
elsif rank == "FLEETCAP"
:fc
elsif rank == "DAIDE"
:a
@@ -349,9 +226,17 @@
:f
elsif rank == "DFLT"
:f
elsif rank == "NFLT"
:f
+ elsif rank == "STFC"
+ :stf
+ elsif valid_flags(:squadron).include?(rank)
+ :s
+ elsif valid_flags(:district).include?(rank)
+ :d
+ elsif valid_flags(:national).include?(rank)
+ :n
end
end
end
end