def handle(directive, elem_info, stmt_list)
ret = super
return ret if ret
d_name = directive.name
d_arg = directive.arg
d_str = directive.str
e = elem_info
case d_name
when :foreach, :Foreach, :FOREACH, :list, :List, :LIST
is_foreach = d_name == :foreach || d_name == :Foreach || d_name == :FOREACH
unless d_arg =~ /\A.*\s+as\s+(\$\w+)(?:\s*=>\s*\$\w+)?\z/
raise convert_error("'#{d_str}': invalid argument.", elem_info.stag_info.linenum)
end
loopvar = $1
counter = d_name == :foreach || d_name == :list ? nil : "#{loopvar}_ctr"
toggle = d_name != :FOREACH && d_name != :LIST ? nil : "#{loopvar}_tgl"
code = []
code << "#{counter} = 0;" if counter
code << "foreach (#{d_arg}) {"
code << " #{counter}++;" if counter
code << " #{toggle} = #{counter}%2==0 ? #{@even} : #{@odd};" if toggle
if is_foreach
wrap_element_with_native_stmt(elem_info, stmt_list, code, "}", :foeach)
else
wrap_content_with_native_stmt(elem_info, stmt_list, code, "}", :foeach)
end
when :while
wrap_element_with_native_stmt(elem_info, stmt_list, "while (#{d_arg}) {", "}", :while)
when :loop
error_if_empty_tag(elem_info, d_str)
wrap_content_with_native_stmt(elem_info, stmt_list, "while (#{d_arg}) {", "}", :while)
when :set
wrap_element_with_native_stmt(elem_info, stmt_list, "#{d_arg};", nil, :set)
when :if
wrap_element_with_native_stmt(elem_info, stmt_list, "if (#{d_arg}) {", "}", :if)
when :elseif, :else
error_when_last_stmt_is_not_if(elem_info, d_str, stmt_list)
stmt_list.pop
kind = d_name == :else ? :else : :elseif
code = d_name == :else ? "} else {" : "} elseif (#{d_arg}) {"
wrap_element_with_native_stmt(elem_info, stmt_list, code, "}", kind)
when :default, :Default, :DEFAULT
error_if_empty_tag(elem_info, d_str)
expr_str = directive.dattr == 'id' ? parse_expr_str(d_arg, e.stag_info.linenum) : d_arg
flag_escape = d_name == :default ? nil : (d_name == :Default)
add_native_expr_with_default(elem_info, stmt_list, expr_str, flag_escape,
"if (#{expr_str}) {", "} else {", "}")
else
return false
end
return true
end