class MultiMovingsign::LineSegment

Attributes

prefix[RW]
segment[RW]

Public Class Methods

new(prefix, segment) click to toggle source
# File lib/multi_movingsign/page_renderer.rb, line 119
def initialize(prefix, segment)
  self.prefix = prefix
  self.segment = segment
end

Public Instance Methods

inspect() click to toggle source
# File lib/multi_movingsign/page_renderer.rb, line 159
def inspect
  to_s.inspect
end
prefix?() click to toggle source
# File lib/multi_movingsign/page_renderer.rb, line 124
def prefix?
  !!self.prefix
end
split_if_necessary(max_width) click to toggle source

If necessary, splits this LineSegment into multiple appropriate for displaying at once on the screen

# File lib/multi_movingsign/page_renderer.rb, line 129
def split_if_necessary(max_width)
  raise InvalidInputError, "Prefix '' is too wide!" if (prefix? && PageRenderer.calculate_width(prefix) > max_width)

  if PageRenderer.calculate_width(self.to_s) <= max_width
    # segment isn't too long with prefix, return it as is
    [self]
  else
    # segment is too long, split it up into word segments finding the largest with the prefix appended that fits
    segments = []  # calculated segments
    prefix_width = prefix? ? PageRenderer.calculate_width(prefix) : 0

    words = segment.split(/ /)
    while !words.empty?
      index = words.length
      while index > 0 && PageRenderer.calculate_width(candidate = (candidate_words = words[0, index]).join(' ')) + prefix_width > max_width
        index -= 1
      end

      segments << self.class.new(prefix, candidate)
      words = words.drop index
    end

    segments
  end
end
to_s() click to toggle source
# File lib/multi_movingsign/page_renderer.rb, line 155
def to_s
  prefix? ? prefix + segment : segment
end