def env_array
layout = @scanner.scan_block ? @scanner.matched : @scanner.scan(/./)
l = Scanner.new(layout=~RE::BLOCK ? layout[RE::BLOCK, 1] : layout)
t = Table.new
aligns = Array.new
vlines = Array.new
vlined = l.check(/\|/)
columned = false
until l.eos?
c = l.scan_any
raise ParseError.new("Syntax error.", layout[/\A.*(#{Regexp.escape(c+l.rest)}.*\z)/m, 1]) unless c=~/[clr\|@]/
if c=='|'
aligns << Align::CENTER if vlined
vlines << Line::SOLID
vlined = true
columned = false
else
vlines << Line::NONE if columned
vlined = false
columned = true
case c
when 'l'
aligns << Align::LEFT
when 'c'
aligns << Align::CENTER
when 'r'
aligns << Align::RIGHT
when '@'
aligns << Align::CENTER
l.scan_any
end
end
end
t.aligns = aligns
t.vlines = vlines
layout = layout[RE::BLOCK, 1] if layout=~RE::BLOCK
raise ParseError.new('Need parameter here.') if layout==""
hlines = Array.new
row_parsed = false
hlined = false
until @scanner.peek_command=="end"
raise ParseError.new('Matching \end not exist.') if @scanner.eos?
if @scanner.peek_command=="hline"
@scanner.scan_command
t << Tr.new unless row_parsed
hlines << Line::SOLID
row_parsed = false
hlined = true
else
hlines << Line::NONE if row_parsed
t << env_array_row(l.string)
@scanner.scan(RE::WBSLASH)
row_parsed = true
hlined = false
end
end
t.hlines = hlines
if hlined
tr = Tr.new
(0..vlines.size).each {|i| tr << Td.new}
t << tr
end
@scanner.scan_command
raise ParseError.new("Environment mismatched.") unless @scanner.check_block && @scanner[1]=="array"
@scanner.scan_block
t
end