class Gutenug::Book

Public Class Methods

new(blob) click to toggle source
# File lib/gutenug/book.rb, line 3
def initialize(blob)
  paragraphs = []
  buffer = []
  blob.split("\n").map(&:strip).each do |line|
    if line.empty?
      paragraphs << Paragraph.new(buffer)
      buffer.clear
    else
      buffer << line
    end
  end
  paragraphs << Paragraph.new(buffer) unless buffer.empty?
  @chapters = []
  candidates = []
  paragraphs.chunk(&:status).each do |chunk|
    if chunk.first == :invalid
      _add_chapter(candidates)
      candidates.clear
    else
      candidates << chunk
    end
  end
  _add_chapter(candidates)
end

Public Instance Methods

chapters() click to toggle source
# File lib/gutenug/book.rb, line 32
def chapters
  @chapters
end
to_s() click to toggle source
# File lib/gutenug/book.rb, line 28
def to_s
  @chapters.map(&:to_s).join("\n\n* * *\n\n")
end

Private Instance Methods

_add_chapter(candidates) click to toggle source
# File lib/gutenug/book.rb, line 38
def _add_chapter(candidates)
  return unless candidates.any? { |chunk| chunk.first == :valid }
  paragraphs = candidates.reduce([]) { |paragraphs, chunk| paragraphs | chunk.last }
  return unless paragraphs.length > 1
  @chapters << Chapter.new(paragraphs)
end