class Minidown::TableElement

Constants

AlignSpecRegexp

Public Class Methods

new(doc, content, raw_head) click to toggle source
Calls superclass method Minidown::Element::new
# File lib/minidown/elements/table_element.rb, line 5
def initialize doc, content, raw_head
  super doc, content
  @raw_head = raw_head
  @heads = @raw_head.split('|'.freeze).map! &:strip
  @column_count = @heads.count
end

Public Instance Methods

check_column_spec(raw_column_spec) click to toggle source
# File lib/minidown/elements/table_element.rb, line 12
def check_column_spec raw_column_spec
  if @valid.nil?
    @valid = Utils::Regexp[:pipe_symbol] =~ raw_column_spec && AlignSpecRegexp =~ raw_column_spec && (column_spec_str = $1) && (@column_specs = column_spec_str.split('|'.freeze).map! &:strip) && @column_specs.count == @column_count
  else
    @valid
  end
end
parse() click to toggle source
# File lib/minidown/elements/table_element.rb, line 20
def parse
  if @valid
    nodes << self
    @bodys = []
    @column_specs.map! do |column_spec|
      if column_spec[0] == column_spec[-1]
        column_spec[0] == ':'.freeze ? 'center'.freeze : nil
      else
        column_spec[0] == ':'.freeze ? 'left'.freeze : 'right'.freeze
      end
    end

    while line = unparsed_lines.shift
      if Utils::Regexp[:table] =~ line && (cells = $1.split('|'.freeze).map! &:strip) && @column_count == cells.count
        @bodys << cells
      else
        unparsed_lines.unshift line
        break
      end
    end
  else
    raise 'table column specs not valid'
  end
end
to_html() click to toggle source
# File lib/minidown/elements/table_element.rb, line 45
def to_html
  attrs = @column_specs.map do |align|
    {align: align}.freeze if align
  end
  build_tag 'table'.freeze do |table|
    thead = build_tag 'thead'.freeze do |thead|
      tr = build_tag 'tr'.freeze do |tr|
        @heads.each_with_index do |cell, i|
          th = build_tag 'th'.freeze, attrs[i] do |th|
            th << cell
          end
          tr << th
        end
      end
      thead << tr
    end
    table << thead

    tbody = build_tag 'tbody'.freeze do |tbody|
      @bodys.each do |row|
        tr = build_tag 'tr'.freeze do |tr|
          row.each_with_index do |cell, i|
            td = build_tag 'td'.freeze, attrs[i] do |td|
              td << TextElement.new(doc, cell).to_html
            end
            tr << td
          end
        end
        tbody << tr
      end
    end
    table << tbody
  end
end