def handle(stmt_list, handler_arg)
ret = super
return ret if ret
arg = handler_arg
d_name = arg.directive_name
d_arg = arg.directive_arg
d_str = arg.directive_str
case d_name
when :for, :For, :FOR, :list, :List, :LIST
unless d_arg =~ /\A(\w+)(?:,\s*(\w+))?\s+in\s+(.*)\z/ \
|| d_arg =~ /\A(\w+)(?:,(\w+))?\s*[:=]\s*(.*)\z/
raise convert_error("'#{d_str}': invalid argument.", arg.stag_info.linenum)
end
loopvar = $1 ; loopval = $2 ; looplist = $3
is_foreach = d_name == :for || d_name == :For || d_name == :FOR
counter = d_name == :for || d_name == :list ? nil : "#{loopvar}_ctr"
toggle = d_name != :FOR && d_name != :LIST ? nil : "#{loopvar}_tgl"
foreach_code = loopval ? "#{looplist}.each do |#{loopvar}, #{loopval}|" \
: "for #{loopvar} in #{looplist} do"
code = []
code << "#{counter} = 0" if counter
code << foreach_code
code << " #{counter} += 1" if counter
code << " #{toggle} = #{counter}%2==0 ? #{@even} : #{@odd}" if toggle
if is_foreach
wrap_element_with_native_stmt(stmt_list, arg, code, "end", :foreach)
else
wrap_content_with_native_stmt(stmt_list, arg, code, "end", :foreach)
end
when :while
wrap_element_with_native_stmt(stmt_list, arg, "while #{d_arg} do", "end", :while)
when :loop
error_if_empty_tag(arg)
wrap_content_with_native_stmt(stmt_list, arg, "while #{d_arg} do", "end", :while)
when :set
wrap_element_with_native_stmt(stmt_list, arg, d_arg, nil, :set)
when :if
wrap_element_with_native_stmt(stmt_list, arg, "if #{d_arg} then", "end", :if)
when :elsif, :else
error_when_last_stmt_is_not_if(stmt_list, arg)
stmt_list.pop
kind = d_name == :else ? :else : :elseif
code = d_name == :else ? "else" : "elsif #{d_arg} then"
wrap_element_with_native_stmt(stmt_list, arg, code, "end", kind)
when :default, :Default, :DEFAULT
error_if_empty_tag(arg)
expr_code = d_arg
flag_escape = d_name == :default ? nil : (d_name == :Default)
add_native_expr_with_default(stmt_list, arg, expr_code, flag_escape,
"if (#{d_arg}) && !(#{d_arg}).to_s.empty? then",
"else", "end")
else
return false
end
return true
end