class ContentSpinning

Constants

SPIN_END
SPIN_OR
SPIN_START

Attributes

source[R]

Public Class Methods

new(source) click to toggle source
# File lib/content_spinning.rb, line 17
def initialize(source)
  @source = source
end
spin(source, limit: nil) click to toggle source
# File lib/content_spinning.rb, line 11
def spin(source, limit: nil)
  new(source).spin(limit: limit)
end

Public Instance Methods

count() click to toggle source
# File lib/content_spinning.rb, line 23
def count
  parse.count
end
parse() click to toggle source
# File lib/content_spinning.rb, line 31
def parse
  return @root if defined?(@root)

  heap = [::ContentSpinning::Sentence.new]

  source.scan(/ [{}|] | [^{}|]+ /x).each do |part|
    case part
    when SPIN_START
      modify_heap_for_spin_start(heap)
    when SPIN_OR
      modify_heap_for_spin_or(heap)
    when SPIN_END
      modify_heap_for_spin_end(heap)
    else
      heap.last << ::ContentSpinning::String.new(part)
    end
  end

  @root = heap.first.cleaned
end
spin(limit: nil) click to toggle source
# File lib/content_spinning.rb, line 52
def spin(limit: nil)
  if limit && limit < count
    spin_with_limit(limit: limit)
  else
    spin_all
  end
end
spin_all() click to toggle source
# File lib/content_spinning.rb, line 60
def spin_all
  parse.spin
end
spin_with_limit(limit:) click to toggle source
# File lib/content_spinning.rb, line 64
def spin_with_limit(limit:)
  parsed = parse

  Array.new(limit) { parsed.random }
end
to_source() click to toggle source
# File lib/content_spinning.rb, line 70
def to_source
  parse.to_source
end

Private Instance Methods

modify_heap_for_spin_end(heap) click to toggle source
# File lib/content_spinning.rb, line 76
def modify_heap_for_spin_end(heap)
  heap.pop(2)
end
modify_heap_for_spin_or(heap) click to toggle source
# File lib/content_spinning.rb, line 80
def modify_heap_for_spin_or(heap)
  heap.pop
  current_spinner = heap.last

  new_sentence = ::ContentSpinning::Sentence.new
  current_spinner << new_sentence
  heap << new_sentence
end
modify_heap_for_spin_start(heap) click to toggle source
# File lib/content_spinning.rb, line 89
def modify_heap_for_spin_start(heap)
  current = heap.last

  new_spinner = ::ContentSpinning::Spinner.new
  current << new_spinner
  heap << new_spinner

  new_sentence = ::ContentSpinning::Sentence.new
  new_spinner << new_sentence
  heap << new_sentence
end