class HtmlConverter < AST::Processor alias :old_process :process def process s return "" unless s old_process(s) end def handler_missing s puts "Missing: " + s.type end def div statement , html "
" + html + "
" end def span statement , html "" + html + "" end def on_function statement return_type , name , parameters, kids , receiver = *statement str = return_type + " " str += receiver + "." if receiver str += name.to_a.first + "(" str += process(parameters) + ")
" str += process(kids) + "end
" div(statement,str) end def on_parameters statement process_all(statement.children).join(",") end def on_parameter p type , name = *p span(type,type) + " " + span(name,name) end def on_string s span(s, "'" + s.first + "'") end def on_field_def statement type , name , value = *statement str = span(type, type) + " " + span(name,name) str += " = #{process(value)}" if value div(statement,str) end def on_return statement str = "return " + process(statement.first ) div(statement,str) end def on_false_statements s on_statements s end def on_true_statements s on_statements s end def on_statements s str = "" s.children.each do |c| str += process(c).to_s end div(s,str) end def on_if_statement statement branch_type , condition , if_true , if_false = *statement condition = condition.first ret = "if_#{branch_type}(" + process(condition) + ")
" + process(if_true) ret += "else" + "
" + process(if_false) if if_false ret += "end" div(statement,ret) end def on_assignment statement name , value = *statement name = process(name) v = process(value) str = name + " = " + v div(statement,str) end def on_call c name , arguments , receiver = *c ret = process(name) ret = process(receiver.first) + "." + ret if receiver ret += "(" ret += process(arguments).join(",") ret += ")" span(c,ret) end def on_operator_value statement operator , left_e , right_e = *statement left_reg = process(left_e) right_reg = process(right_e) span(statement , left_reg + " " + operator + " " + right_reg ) end def on_arguments args args.children.collect{|c| process(c)} end def on_name name span(name,name.first) end def on_int i span(i , i.first.to_s) end end