def self.parse_cell_spec(line, pos = :start, delimiter = nil)
m = nil
rest = ''
case pos
when :start
if line.include? delimiter
spec_part, rest = line.split delimiter, 2
if (m = CellSpecStartRx.match spec_part)
return [{}, rest] if m[0].empty?
else
return [nil, line]
end
else
return [nil, line]
end
when :end
if (m = CellSpecEndRx.match line)
return [{}, line.rstrip] if m[0].lstrip.empty?
rest = m.pre_match
else
return [{}, line]
end
end
spec = {}
if m[1]
colspec, rowspec = m[1].split '.'
colspec = colspec.nil_or_empty? ? 1 : colspec.to_i
rowspec = rowspec.nil_or_empty? ? 1 : rowspec.to_i
if m[2] == '+'
spec['colspan'] = colspec unless colspec == 1
spec['rowspan'] = rowspec unless rowspec == 1
elsif m[2] == '*'
spec['repeatcol'] = colspec unless colspec == 1
end
end
if m[3]
colspec, rowspec = m[3].split '.'
if !colspec.nil_or_empty? && Table::ALIGNMENTS[:h].has_key?(colspec)
spec['halign'] = Table::ALIGNMENTS[:h][colspec]
end
if !rowspec.nil_or_empty? && Table::ALIGNMENTS[:v].has_key?(rowspec)
spec['valign'] = Table::ALIGNMENTS[:v][rowspec]
end
end
if m[4] && Table::TEXT_STYLES.has_key?(m[4])
spec['style'] = Table::TEXT_STYLES[m[4]]
end
[spec, rest]
end