diff --git a/lib/ejs.rb b/lib/ejs.rb index 686649a..cda17a2 100644 --- a/lib/ejs.rb +++ b/lib/ejs.rb @@ -20,6 +20,7 @@ class << self attr_accessor :evaluation_pattern attr_accessor :interpolation_pattern attr_accessor :escape_pattern + attr_accessor :escape_function # Compiles an EJS template to a JavaScript function. The compiled # function takes an optional argument, an object specifying local @@ -69,7 +70,7 @@ def js_unescape!(source) def replace_escape_tags!(source, options) source.gsub!(options[:escape_pattern] || escape_pattern) do - "',(''+#{js_unescape!($1)})#{escape_function},'" + "',#{runtime_escape!(js_unescape!($1))},'" end end @@ -85,17 +86,19 @@ def replace_interpolation_tags!(source, options) end end - def escape_function - ".replace(/&/g, '&')" + - ".replace(//g, '>')" + - ".replace(/\"/g, '"')" + - ".replace(/'/g, ''')" + - ".replace(/\\//g,'/')" + def runtime_escape!(expression) + escape_function % expression end end self.evaluation_pattern = /<%([\s\S]+?)%>/ self.interpolation_pattern = /<%=([\s\S]+?)%>/ self.escape_pattern = /<%-([\s\S]+?)%>/ + self.escape_function = + "('' + %s).replace(/&/g, '&')" + + ".replace(//g, '>')" + + ".replace(/\"/g, '"')" + + ".replace(/'/g, ''')" + + ".replace(/\\//g,'/')" end diff --git a/test/test_ejs.rb b/test/test_ejs.rb index ed760da..63fbc40 100644 --- a/test/test_ejs.rb +++ b/test/test_ejs.rb @@ -39,6 +39,25 @@ class EJSCompilationTest < Test::Unit::TestCase end end +class EJSCustomEscapeFunctionTest < Test::Unit::TestCase + extend TestHelper + + def setup + @original_escape_function = EJS.escape_function + EJS.escape_function = '_.escape(%s)' + end + + def teardown + EJS.escape_function = @original_escape_function + end + + test 'compile' do + result = EJS.compile('<%- name %>') + assert_match /_\.escape\(\s*name\s*\)/, result + end + +end + class EJSCustomPatternTest < Test::Unit::TestCase extend TestHelper