class Calendario::Renderers::IntervalRenderer

Renders a time interval, line by line, in a table

Constants

EMPTY_DAY_SPACES

The space of an empty day @return [String]

Attributes

month_renderer[RW]

A service to render a month line by line

@api private @return [Calendario::Renderers::MonthRenderer]

Public Class Methods

new(month_renderer = MonthRenderer.new) click to toggle source

Initializes a interval renderer

@api private @param [MonthRenderer] month_renderer A service to render a month line by line

# File lib/calendario/renderers/interval_renderer.rb, line 18
def initialize(month_renderer = MonthRenderer.new)
  @month_renderer = month_renderer
end

Public Instance Methods

render(interval, columns:, &block) click to toggle source

Formats a time interval, line by line, in a table

@api private @param [Interval] interval The time interval to be rendered. @return [RenderedInterval]

# File lib/calendario/renderers/interval_renderer.rb, line 28
def render(interval, columns:, &block)
  month_renderer.filter = block if block_given?

  lines = []
  rendered_months = render_months(interval.months)

  rendered_months.each_slice(columns) do |months|
    0.upto(7) { |month_line| lines << take_row(month_line, months) }
    lines.push('') # Separate rows of months
  end

  RenderedInterval.new(lines)
end

Private Instance Methods

render_months(months) click to toggle source

Renders a list of months

@api private @param [Array<Month>] months The list of months to be rendered @return [Array<RenderedMonth>]

# File lib/calendario/renderers/interval_renderer.rb, line 66
def render_months(months)
  months.map { |month| month_renderer.render(month) }
end
take_row(month_line, months) click to toggle source

Extracts a row from a group of months

@api private @return [Array<String>]

# File lib/calendario/renderers/interval_renderer.rb, line 56
def take_row(month_line, months)
  months.map { |month| month[month_line] }.join(EMPTY_DAY_SPACES)
end