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