Class: MultiMovingsign::LineSegment

Inherits:
Object
  • Object
show all
Defined in:
lib/multi_movingsign/page_renderer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(prefix, segment) ⇒ LineSegment

Returns a new instance of LineSegment.



119
120
121
122
# File 'lib/multi_movingsign/page_renderer.rb', line 119

def initialize(prefix, segment)
  self.prefix = prefix
  self.segment = segment
end

Instance Attribute Details

#prefixObject

Returns the value of attribute prefix.



116
117
118
# File 'lib/multi_movingsign/page_renderer.rb', line 116

def prefix
  @prefix
end

#segmentObject

Returns the value of attribute segment.



117
118
119
# File 'lib/multi_movingsign/page_renderer.rb', line 117

def segment
  @segment
end

Instance Method Details

#inspectObject



159
160
161
# File 'lib/multi_movingsign/page_renderer.rb', line 159

def inspect
  to_s.inspect
end

#prefix?Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/multi_movingsign/page_renderer.rb', line 124

def prefix?
  !!self.prefix
end

#split_if_necessary(max_width) ⇒ Object

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

Raises:



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# 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_sObject



155
156
157
# File 'lib/multi_movingsign/page_renderer.rb', line 155

def to_s
  prefix? ? prefix + segment : segment
end