def parse_blocks(src)
output = BlockContext.new
while src.cur_line
next if check_block_extensions(src, output, src.cur_line)
md_type = src.cur_line.md_type
case md_type
when :empty
output << :empty
src.ignore_line
when :ial
m = InlineAttributeList.match src.shift_line
content = m[1] || ""
src2 = CharSource.new(content, src)
interpret_extension(src2, output)
when :ald
output << read_ald(src)
when :text
read_text_material(src, output)
when :header2, :hrule
src.shift_line
output << md_hrule
when :header3
output << read_header3(src)
when :ulist, :olist
list_type = (md_type == :ulist) ? :ul : :ol
li = read_list_item(src)
if output.last.kind_of?(MDElement) &&
output.last.node_type == list_type then
output.last.children << li
else
output << md_el(list_type, li)
end
when :quote
output << read_quote(src)
when :code
e = read_code(src)
output << e if e
when :raw_html
e = read_raw_html(src)
unless e.empty?
if e.first.parsed_html &&
(first_node_name = e.first.parsed_html.first_node_name) &&
HTML_INLINE_ELEMS.include?(first_node_name) &&
!%w(svg math).include?(first_node_name)
content = [e.first]
if e.size > 1
content.concat(e[1].children)
end
output << md_par(content)
else
output.concat(e)
end
end
when :footnote_text
output << read_footnote_text(src)
when :ref_definition
if src.parent && src.cur_index == 0
read_text_material(src, output)
else
read_ref_definition(src, output)
end
when :abbreviation
output << read_abbreviation(src)
when :xml_instr
read_xml_instruction(src, output)
else
read_text_material(src, output)
end
end
merge_ial(output, src, output)
output.delete_if do |x|
(x.kind_of?(MDElement) && x.node_type == :ial) ||
x == :empty
end
output.each do |c|
if [:ul, :ol].include?(c.node_type) && c.children.none?(&:want_my_paragraph)
c.children.each do |d|
if d.children.first && d.children.first.node_type == :paragraph
d.children = d.children.first.children + d.children[1..-1]
end
end
elsif c.node_type == :definition_list && c.children.none?(&:want_my_paragraph)
c.children.each do |definition|
definition.definitions.each do |dd|
if dd.children.first.node_type == :paragraph
dd.children = dd.children.first.children + dd.children[1..-1]
end
end
end
end
end
output
end