def compile(source)
source = source.respond_to?(:read) ? source.read : source.to_s
js = []
js << "var result = '';"
js << "var source = #{json_encode(source)};"
js << "var ast = UglifyJS.parser.parse(source);"
if @options[:lift_vars]
js << "ast = UglifyJS.uglify.ast_lift_variables(ast);"
end
if @options[:copyright]
js << "var comments = UglifyJS.parser.tokenizer(source)().comments_before;\nfor (var i = 0; i < comments.length; i++) {\nvar c = comments[i];\nresult += (c.type == \"comment1\") ? \"//\"+c.value+\"\\\\n\" : \"/*\"+c.value+\"*/\\\\n\";\n}\n"
end
js << "ast = UglifyJS.uglify.ast_mangle(ast, #{json_encode(mangle_options)});"
if @options[:squeeze]
js << "ast = UglifyJS.uglify.ast_squeeze(ast, #{json_encode(squeeze_options)});"
end
if @options[:unsafe]
js << "ast = UglifyJS.uglify.ast_squeeze_more(ast);"
end
js << "result += UglifyJS.uglify.gen_code(ast, #{json_encode(gen_code_options)});"
if !@options[:beautify] && @options[:max_line_length]
js << "result = UglifyJS.uglify.split_lines(result, #{@options[:max_line_length].to_i})"
end
js << "return result + ';';"
@context.exec js.join("\n")
end