class HtmlSkeleton

calendar methods ###################################################

table methods ######################################################

Attributes

day_header[R]
options[R]

Public Instance Methods

calendar(options = {}, &) click to toggle source
# File lib/html_skeleton.rb, line 10
def calendar(options = {}, &)
  set_calendar_options(options, &)
  month = @options[:month]
  frame = month ? "div" : "table"
  body = month ? a_month(@options[:year], month) : a_year(@options[:year])
  %(<#{frame} class="#{@options[:calendar_class]}"> #{body} </#{frame}>)
end
table(rows, cols, options = {}, &) click to toggle source
# File lib/html_skeleton.rb, line 18
  def table(rows, cols, options = {}, &)
    set_table_options(options, &)
    <<~TABLE
      <table class="#{@options[:table_class]}">
        #{table_header(cols)}
        #{table_body(rows, cols)}
      </table>
    TABLE
  end

Protected Instance Methods

a_day(date, today, block) click to toggle source
# File lib/html_skeleton_calendar.rb, line 57
def a_day(date, today, block)
  attrs = "day"
  attrs += " weekendDay" if weekend?(date)
  attrs += " today" if date == today
  "<td class=\"#{attrs}\">#{block.call(date)}</td>"
end
a_month(year, month) click to toggle source
# File lib/html_skeleton_calendar.rb, line 26
  def a_month(year, month)
    title = @options[:month_names][month]
    <<~TABLE
      <table class="month">
        <tr class="monthName"><th colspan="7">#{title}</th></tr>
        <tr class="dayName">#{@day_header}</tr>
        #{days_of_month(year, month)}
      </table>
    TABLE
  end
a_year(year) click to toggle source
# File lib/html_skeleton_calendar.rb, line 11
  def a_year(year)
    rows = @options[:rows]
    cols = 12 / rows
    raise "html_skeleton_calendar: invalid option <rows>" unless rows * cols == 12

    body = (0..rows - 1).collect { |y|
      str = (1..cols).collect { |x| "<td>#{a_month(year, y * cols + x)}</td>" }
      "<tr>#{str.join}</tr>"
    }
    <<~THEAD
      <thead><th colspan="2">#{@options[:title]}</th></thead>
      #{body.join}
    THEAD
  end
days_between(first, second) click to toggle source
# File lib/html_skeleton_calendar.rb, line 68
def days_between(first, second)
  (first > second) ? second + (7 - first) : second - first
end
days_of_month(year, month) click to toggle source
# File lib/html_skeleton_calendar.rb, line 37
def days_of_month(year, month)
  first_weekday = @options[:first_day_of_week]
  last_weekday = first_weekday.positive? ? first_weekday - 1 : 6
  cell_proc = @options[:cell_proc]
  bool = Time.respond_to?(:zone) && !(zone = Time.zone).nil?
  today = bool ? zone.now.to_date : Date.today

  first = Date.civil(year, month, 1)
  last = Date.civil(year, month, -1)

  cal = +"<tr>"
  cal << "<td></td>" * days_between(first_weekday, first.wday)
  first.upto(last) { |cur|
    cal << a_day(cur, today, cell_proc)
    cal << "</tr> <tr>" if cur.wday == last_weekday
  }
  cal << "<td></td>" * days_between((last + 1).wday, first_weekday + 7)
  cal << "</tr>"
end
set_calendar_options(options, &block) click to toggle source
# File lib/html_skeleton.rb, line 30
def set_calendar_options(options, &block)
  year = DateTime.now.year
  @options = {
    year: year,
    title: year,
    rows: 3,
    calendar_class: "skeleton",
    month_names: Date::MONTHNAMES,
    abbrev: (0..1),
    cell_proc: block || ->(d) { d.day.to_s },
    first_day_of_week: 1
  }.merge options

  names = options[:day_names] || Date::DAYNAMES.dup
  @options[:first_day_of_week].times { names.push(names.shift) }

  @day_header = names.collect { |day|
    abbr = day[@options[:abbrev]]
    str = (abbr == day) ? day : %(<abbr title="#{day}">#{abbr}</abbr>)
    %(<th scope="col">#{str}</th>)
  }.join
end
set_table_options(options, &block) click to toggle source
# File lib/html_skeleton.rb, line 53
def set_table_options(options, &block)
  @options = {
    legend: nil,
    col_legend: ->(x) { x.to_s },
    row_legend: ->(x) { x.id },
    th_attribute: ->(_col) {},
    tr_attribute: ->(_row) {},

    table_class: "skeleton",
    cell_proc: block || ->(row, col) { "<td>#{row} #{col}</td>" }
  }.merge options
end
table_body(rows, cols) click to toggle source
# File lib/html_skeleton_table.rb, line 21
def table_body(rows, cols)
  legend = @options[:legend]
  row_legend = @options[:row_legend]
  tr_attribute = @options[:tr_attribute]
  rows.collect { |row|
    rlegend = ""
    rlegend = %(<td class="legend">#{row_legend.call(row)}</td>) if legend
    cells = table_row(row, cols)
    %(<tr #{tr_attribute.call(row)}>#{rlegend}#{cells}</tr>)
  }.join("\n")
end
table_header(cols) click to toggle source
# File lib/html_skeleton_table.rb, line 9
def table_header(cols)
  legend = @options[:legend]
  th_attribute = @options[:th_attribute]
  return "" unless legend

  proc = @options[:col_legend]
  col_header = cols.collect { |col|
    "<th #{th_attribute.call(col)}>#{proc.call(col)}</th>"
  }.join
  %(<thead><th class="legend">#{legend}</th>#{col_header}</thead>)
end
table_row(row, cols) click to toggle source
# File lib/html_skeleton_table.rb, line 33
def table_row(row, cols)
  cell_proc = @options[:cell_proc]
  cols.collect { |col| cell_proc.call(row, col) }.join
end
weekend?(date) click to toggle source
# File lib/html_skeleton_calendar.rb, line 64
def weekend?(date)
  [0, 6].include?(date.wday)
end