def expand_statement(stmt, stmt_list, elem_info)
if stmt.is_a?(NativeStatement)
if elem_info
native_stmt = expand_attr_vars_in_native_stmt(stmt, elem_info.attr_info)
else
native_stmt = stmt
end
stmt_list << native_stmt
return
end
if ! stmt.is_a?(ExpandStatement)
stmt_list << stmt
return
end
e = elem_info
if @delspan && elem_info && elem_info.dummy_span_tag?('span')
e.stag_info.clear_as_dummy_tag()
e.etag_info.clear_as_dummy_tag()
end
case stmt.kind
when :stag
assert unless elem_info
if e.stag_expr
assert unless e.stag_expr.is_a?(NativeExpression)
stmt_list << build_print_expr_stmt(e.stag_expr, e.stag_info, nil, e.attr_info)
else
stmt_list << build_print_stmt(e.stag_info, e.attr_info, e.append_exprs)
end
when :etag
assert unless elem_info
if e.etag_expr
assert unless e.etag_expr.is_a?(NativeExpression)
stmt_list << build_print_expr_stmt(e.etag_expr, nil, e.etag_info, e.attr_info)
elsif e.etag_info
stmt_list << build_print_stmt(e.etag_info, nil, nil)
end
when :cont
if e.cont_expr
assert unless e.cont_expr.is_a?(NativeExpression)
native_expr = expand_attr_vars_in_native_expr(e.cont_expr, e.attr_info)
stmt_list << PrintStatement.new([native_expr])
else
elem_info.cont_stmts.each do |cont_stmt|
expand_statement(cont_stmt, stmt_list, nil)
end
end
when :elem
assert unless elem_info
if e.elem_expr
assert unless e.elem_expr.is_a?(NativeExpression)
stmt_list << build_print_expr_stmt(e.elem_expr, e.stag_info, e.etag_info, e.attr_info)
else
stmt.kind = :stag
expand_statement(stmt, stmt_list, elem_info)
stmt.kind = :cont
expand_statement(stmt, stmt_list, elem_info)
stmt.kind = :etag
expand_statement(stmt, stmt_list, elem_info)
stmt.kind = :elem
end
when :element, :content
content_only = stmt.kind == :content
elem_info = get_element_info(stmt.name)
unless elem_info
raise convert_error("element '#{stmt.name}' is not found.", nil)
end
expand_element_info(elem_info, stmt_list, content_only)
else
assert
end
end