erubis 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. data/CHANGES +69 -2
  2. data/README.txt +1 -1
  3. data/benchmark/bench.rb +1 -1
  4. data/bin/erubis +1 -1
  5. data/contrib/erubis +3295 -2
  6. data/contrib/inline-require +1 -1
  7. data/doc-api/classes/Erubis.html +1 -1
  8. data/doc-api/classes/Erubis/ArrayEnhancer.html +12 -12
  9. data/doc-api/classes/Erubis/Basic/Converter.html +4 -4
  10. data/doc-api/classes/Erubis/BiPatternEnhancer.html +12 -12
  11. data/doc-api/classes/Erubis/CGenerator.html +60 -60
  12. data/doc-api/classes/Erubis/Context.html +42 -42
  13. data/doc-api/classes/Erubis/Converter.html +3 -2
  14. data/doc-api/classes/Erubis/DeleteIndentEnhancer.html +6 -6
  15. data/doc-api/classes/Erubis/Engine.html +30 -30
  16. data/doc-api/classes/Erubis/ErboutEnhancer.html +12 -12
  17. data/doc-api/classes/Erubis/EscapeEnhancer.html +6 -6
  18. data/doc-api/classes/Erubis/HeaderFooterEnhancer.html +12 -12
  19. data/doc-api/classes/Erubis/Helpers/RailsHelper.html +62 -7
  20. data/doc-api/classes/Erubis/Helpers/RailsHelper/PreprocessingEruby.html +177 -0
  21. data/doc-api/classes/Erubis/JavaGenerator.html +54 -54
  22. data/doc-api/classes/Erubis/JavascriptGenerator.html +60 -60
  23. data/doc-api/classes/Erubis/Main.html +20 -20
  24. data/doc-api/classes/Erubis/NoTextEnhancer.html +6 -6
  25. data/doc-api/classes/Erubis/OptimizedEruby.html +6 -6
  26. data/doc-api/classes/Erubis/OptimizedGenerator.html +72 -72
  27. data/doc-api/classes/Erubis/OptimizedXmlEruby.html +6 -6
  28. data/doc-api/classes/Erubis/PI/Converter.html +3 -3
  29. data/doc-api/classes/Erubis/PercentLineEnhancer.html +6 -6
  30. data/doc-api/classes/Erubis/PhpGenerator.html +54 -54
  31. data/doc-api/classes/Erubis/PrintEnabledEnhancer.html +20 -20
  32. data/doc-api/classes/Erubis/PrintOutEnhancer.html +30 -30
  33. data/doc-api/classes/Erubis/RubyEvaluator.html +47 -15
  34. data/doc-api/classes/Erubis/StringBufferEnhancer.html +12 -12
  35. data/doc-api/classes/Erubis/TinyEruby.html +24 -24
  36. data/doc-api/classes/Erubis/XmlHelper.html +79 -14
  37. data/doc-api/created.rid +1 -1
  38. data/doc-api/files/README_txt.html +2 -2
  39. data/doc-api/files/erubis/context_rb.html +1 -1
  40. data/doc-api/files/erubis/converter_rb.html +2 -2
  41. data/doc-api/files/erubis/engine/ec_rb.html +1 -1
  42. data/doc-api/files/erubis/engine/ejava_rb.html +1 -1
  43. data/doc-api/files/erubis/engine/ejavascript_rb.html +1 -1
  44. data/doc-api/files/erubis/engine/enhanced_rb.html +1 -1
  45. data/doc-api/files/erubis/engine/eperl_rb.html +1 -1
  46. data/doc-api/files/erubis/engine/ephp_rb.html +1 -1
  47. data/doc-api/files/erubis/engine/eruby_rb.html +1 -1
  48. data/doc-api/files/erubis/engine/escheme_rb.html +1 -1
  49. data/doc-api/files/erubis/engine/optimized_rb.html +1 -1
  50. data/doc-api/files/erubis/engine_rb.html +1 -1
  51. data/doc-api/files/erubis/enhancer_rb.html +1 -1
  52. data/doc-api/files/erubis/error_rb.html +1 -1
  53. data/doc-api/files/erubis/evaluator_rb.html +2 -2
  54. data/doc-api/files/erubis/generator_rb.html +1 -1
  55. data/doc-api/files/erubis/helper_rb.html +2 -2
  56. data/doc-api/files/erubis/helpers/rails_helper_rb.html +3 -2
  57. data/doc-api/files/erubis/local-setting_rb.html +1 -1
  58. data/doc-api/files/erubis/main_rb.html +2 -2
  59. data/doc-api/files/erubis/tiny_rb.html +1 -1
  60. data/doc-api/files/erubis_rb.html +1 -1
  61. data/doc-api/fr_class_index.html +1 -0
  62. data/doc-api/fr_method_index.html +128 -120
  63. data/doc/users-guide.html +248 -88
  64. data/lib/erubis.rb +2 -2
  65. data/lib/erubis/context.rb +1 -1
  66. data/lib/erubis/converter.rb +3 -2
  67. data/lib/erubis/engine.rb +1 -1
  68. data/lib/erubis/engine/ec.rb +1 -1
  69. data/lib/erubis/engine/ejava.rb +1 -1
  70. data/lib/erubis/engine/ejavascript.rb +1 -1
  71. data/lib/erubis/engine/enhanced.rb +1 -1
  72. data/lib/erubis/engine/eperl.rb +1 -1
  73. data/lib/erubis/engine/ephp.rb +1 -1
  74. data/lib/erubis/engine/eruby.rb +1 -1
  75. data/lib/erubis/engine/escheme.rb +1 -1
  76. data/lib/erubis/engine/optimized.rb +1 -1
  77. data/lib/erubis/enhancer.rb +1 -1
  78. data/lib/erubis/error.rb +1 -1
  79. data/lib/erubis/evaluator.rb +15 -4
  80. data/lib/erubis/generator.rb +1 -1
  81. data/lib/erubis/helper.rb +14 -2
  82. data/lib/erubis/helpers/rails_helper.rb +48 -3
  83. data/lib/erubis/local-setting.rb +1 -1
  84. data/lib/erubis/main.rb +7 -8
  85. data/lib/erubis/tiny.rb +1 -1
  86. data/test/assert-text-equal.rb +1 -1
  87. data/test/data/users-guide/def_method.rb +14 -0
  88. data/test/data/users-guide/def_method.result +3 -0
  89. data/test/test-engines.rb +1 -1
  90. data/test/test-enhancers.rb +1 -1
  91. data/test/test-erubis.rb +40 -2
  92. data/test/test-main.rb +17 -4
  93. data/test/test-users-guide.rb +1 -1
  94. data/test/test.rb +1 -1
  95. data/test/testutil.rb +1 -1
  96. metadata +15 -11
  97. data/test/data/users-guide/stderr.log +0 -3
data/lib/erubis/engine.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
data/lib/erubis/error.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
2
+ ## $Rev: 91 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -53,7 +53,8 @@ module Erubis
53
53
  _arg = _binding_or_hash
54
54
  if _arg.is_a?(Hash)
55
55
  ## load _context data as local variables by eval
56
- eval _arg.keys.inject("") { |s, k| s << "#{k.to_s} = _arg[#{k.inspect}];" }
56
+ #eval _arg.keys.inject("") { |s, k| s << "#{k.to_s} = _arg[#{k.inspect}];" }
57
+ eval _arg.collect{|k,v| "#{k} = _arg[#{k.inspect}]; "}.join
57
58
  _arg = binding()
58
59
  end
59
60
  return eval(@src, _arg, (@filename || '(erubis)'))
@@ -62,9 +63,19 @@ module Erubis
62
63
  ## invoke context.instance_eval(@src)
63
64
  def evaluate(context=Context.new)
64
65
  context = Context.new(context) if context.is_a?(Hash)
65
- return context.instance_eval(@src, (@filename || '(erubis)'))
66
+ #return context.instance_eval(@src, @filename || '(erubis)')
67
+ @_proc ||= eval("proc { #{@src} }", TOPLEVEL_BINDING, @filename || '(erubis)')
68
+ return context.instance_eval(&@_proc)
66
69
  end
67
70
 
71
+ ## if object is an Class or Module then define instance method to it,
72
+ ## else define singleton method to it.
73
+ def def_method(object, method_name, filename=nil)
74
+ m = object.is_a?(Module) ? :module_eval : :instance_eval
75
+ object.__send__(m, "def #{method_name}; #{@src}; end", filename || @filename || '(erubis)')
76
+ end
77
+
78
+
68
79
  end
69
80
 
70
81
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
data/lib/erubis/helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
2
+ ## $Rev: 89 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -27,9 +27,21 @@ module Erubis
27
27
  #value.to_s.gsub(/[&<>"]/) { ESCAPE_TABLE[$&] }
28
28
  end
29
29
 
30
+ def escape_xml2(value)
31
+ return value.to_s.gsub(/\&/,'&amp;').gsub(/</,'&lt;').gsub(/>/,'&gt;').gsub(/"/,'&quot;')
32
+ end
33
+
30
34
  alias h escape_xml
31
35
  alias html_escape escape_xml
32
36
 
37
+ def url_encode(str)
38
+ return str.gsub(/[^-_.a-zA-Z0-9]+/) { |s|
39
+ s.unpack('C*').collect { |i| "%%%02X" % i }.join
40
+ }
41
+ end
42
+
43
+ alias u url_encode
44
+
33
45
  end
34
46
 
35
47
 
@@ -1,11 +1,12 @@
1
1
  ###
2
- ### $Rev: 82 $
3
- ### $Release: 2.3.1 $
2
+ ### $Rev: 90 $
3
+ ### $Release: 2.4.0 $
4
4
  ### copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ###
6
6
 
7
7
 
8
8
  require 'erubis'
9
+ require 'cgi'
9
10
 
10
11
 
11
12
  module Erubis
@@ -30,7 +31,8 @@ module Erubis
30
31
  ## require 'erubis/helpers/rails_helper'
31
32
  ## #Erubis::Helpers::RailsHelper.engine_class = Erubis::Eruby # or Erubis::FastEruby
32
33
  ## #Erubis::Helpers::RailsHelper.init_properties = {}
33
- ## #Erubis::Helpers::RailsHelper.show_src = false # set true for debugging
34
+ ## #Erubis::Helpers::RailsHelper.show_src = false # set true for debugging
35
+ ## #Erubis::Helpers::RailsHelper.preprocessing = true # set true to enable preprocessing
34
36
  ##
35
37
  ## 2. (optional) apply the patch for 'action_view/base.rb'
36
38
  ##
@@ -78,6 +80,27 @@ module Erubis
78
80
  @@show_src = flag
79
81
  end
80
82
 
83
+ ##----- preprocessor: experimental -----
84
+ @@preprocessing = false
85
+ def self.preprocessing
86
+ @@preprocessing
87
+ end
88
+ def self.preprocessing=(flag)
89
+ @@preprocessing = flag
90
+ end
91
+ class PreprocessingEruby < Erubis::Eruby
92
+ def initialize(input, params={})
93
+ params = params.dup
94
+ params[:pattern] = '\[% %\]' # use '[%= %]' instead of '<%= %>'
95
+ params[:escape] = true # transport '[%= %]' and '[%== %]'
96
+ super
97
+ end
98
+ def add_expr_escaped(src, code)
99
+ add_expr_literal(src, "_decode((#{code}))")
100
+ end
101
+ end
102
+ ##----------------------------------------
103
+
81
104
  end
82
105
 
83
106
  end
@@ -187,11 +210,33 @@ class ActionView::Base # :nodoc:
187
210
  klass = Erubis::Helpers::RailsHelper.engine_class
188
211
  properties = Erubis::Helpers::RailsHelper.init_properties
189
212
  show_src = Erubis::Helpers::RailsHelper.show_src
213
+ ##----- preprocessing: experimental -----
214
+ if Erubis::Helpers::RailsHelper.preprocessing
215
+ preprocessor = Erubis::Helpers::RailsHelper::PreprocessingEruby.new(template)
216
+ template = self.instance_eval(preprocessor.src)
217
+ logger.debug "** Erubis: preprocessed==<<'END'\n#{template}END\n" if show_src
218
+ end
219
+ ##----------------------------------------
190
220
  src = klass.new(template, properties).src
191
221
  #src.insert(0, '_erbout = ')
192
222
  logger.debug "** Erubis: src==<<'END'\n#{src}END\n" if show_src
193
223
  src
194
224
  end
225
+
226
+ ##----- preprocessing: experimental -----
227
+ def _expr(arg)
228
+ return "<%=#{arg}%>"
229
+ end
230
+ alias _x _expr
231
+ alias _? _expr
232
+ def _decode(arg)
233
+ arg = arg.to_s
234
+ arg.gsub!(/%3C%25%3D(.*?)%25%3E/) { "<%=#{CGI.unescape($1)}%>" }
235
+ arg.gsub!(/&lt;%=(.*?)%&gt;/) { "<%=#{CGI.unescapeHTML($1)}%>" }
236
+ return arg
237
+ end
238
+ ##----------------------------------------
239
+
195
240
  end
196
241
 
197
242
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
data/lib/erubis/main.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ###
2
- ### $Rev: 78 $
3
- ### $Release: 2.3.1 $
2
+ ### $Rev: 91 $
3
+ ### $Release: 2.4.0 $
4
4
  ### copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ###
6
6
 
@@ -173,7 +173,7 @@ module Erubis
173
173
  msg = nil if val
174
174
  end
175
175
  else
176
- engine.filename = '(stdin)'
176
+ engine.filename = filename = '(stdin)'
177
177
  engine.convert!($stdin.read())
178
178
  val = do_action(action, engine, context, filename, opts)
179
179
  msg = nil if val
@@ -215,8 +215,8 @@ module Erubis
215
215
  return source
216
216
  end
217
217
 
218
- def usage
219
- command = File.basename($0)
218
+ def usage(command=nil)
219
+ command ||= File.basename($0)
220
220
  buf = []
221
221
  buf << "erubis - embedded program converter for multi-language"
222
222
  buf << "Usage: #{command} [..options..] [file ...]"
@@ -247,10 +247,9 @@ module Erubis
247
247
  # -c class : class name (XmlEruby/PercentLineEruby/...) (default Eruby)
248
248
  # -r library : require library
249
249
  # -a : action (convert/execute)
250
- return join("\n")
250
+ return buf.join("\n")
251
251
  end
252
252
 
253
-
254
253
  def collect_supported_properties(erubis_klass)
255
254
  list = []
256
255
  erubis_klass.ancestors.each do |klass|
@@ -407,7 +406,7 @@ module Erubis
407
406
 
408
407
  def load_datafiles(filenames, opts)
409
408
  context = Erubis::Context.new
410
- return hash unless filenames
409
+ return context unless filenames
411
410
  filenames.split(/,/).each do |filename|
412
411
  filename.strip!
413
412
  test(?f, filename) or raise CommandOptionError.new("#{filename}: file not found.")
data/lib/erubis/tiny.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ###
2
2
  ### $Rev: 77 $
3
- ### $Release: 2.3.1 $
3
+ ### $Release: 2.4.0 $
4
4
  ### copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ###
6
6
 
@@ -0,0 +1,14 @@
1
+ require 'erubis'
2
+ s = "hello <%= name %>"
3
+ eruby = Erubis::Eruby.new(s)
4
+ filename = 'hello.rhtml'
5
+
6
+ ## define instance method to Dummy class (or module)
7
+ class Dummy; end
8
+ eruby.def_method(Dummy, 'render(name)', filename) # filename is optional
9
+ p Dummy.new.render('world') #=> "hello world"
10
+
11
+ ## define singleton method to dummy object
12
+ obj = Object.new
13
+ eruby.def_method(obj, 'render(name)', filename) # filename is optional
14
+ p obj.render('world') #=> "hello world"
@@ -0,0 +1,3 @@
1
+ $ ruby def_method.rb
2
+ "hello world"
3
+ "hello world"
data/test/test-engines.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -1,6 +1,6 @@
1
1
  ##
2
2
  ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
data/test/test-erubis.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Rev: 77 $
3
- ## $Release: 2.3.1 $
2
+ ## $Rev: 91 $
3
+ ## $Release: 2.4.0 $
4
4
  ## copyright(c) 2006-2007 kuwata-lab.com all rights reserved.
5
5
  ##
6
6
 
@@ -154,6 +154,44 @@ END
154
154
  end
155
155
 
156
156
 
157
+ class Dummy
158
+ end
159
+
160
+ def test_def_method1
161
+ s = "<%for i in list%>i=<%=i%>\n<%end%>"
162
+ eruby = Erubis::Eruby.new(s)
163
+ assert(! Dummy.instance_methods.include?('render'))
164
+ eruby.def_method(Dummy, 'render(list)', 'foo.rhtml')
165
+ assert(Dummy.instance_methods.include?('render'))
166
+ actual = Dummy.new().render(%w[1 2 3])
167
+ assert_equal("i=1\ni=2\ni=3\n", actual)
168
+ end
169
+
170
+ def test_def_method2
171
+ s = "<%for i in list%>i=<%=i%>\n<%end%>"
172
+ eruby = Erubis::Eruby.new(s)
173
+ assert(! (eruby.respond_to? :render))
174
+ eruby.def_method(eruby, 'render(list)', 'foo.rhtml')
175
+ assert eruby.respond_to?(:render)
176
+ actual = eruby.render([1, 2, 3])
177
+ assert_equal("i=1\ni=2\ni=3\n", actual)
178
+ assert !(eruby.class.instance_methods.include? :render)
179
+ end
180
+
181
+ def test_evaluate_creates_proc
182
+ s = "hello <%= @name %>"
183
+ eruby = Erubis::Eruby.new(s)
184
+ assert_nil(eruby.instance_variable_get('@_proc'))
185
+ actual1 = eruby.evaluate(:name=>'world')
186
+ assert_not_nil(eruby.instance_variable_get('@_proc'))
187
+ assert_instance_of(Proc, eruby.instance_variable_get('@_proc'))
188
+ actual2 = eruby.evaluate(:name=>'world')
189
+ assert_equal(actual1, actual2)
190
+ # convert() must clear @_proc
191
+ eruby.convert(s)
192
+ assert_nil(eruby.instance_variable_get('@_proc'))
193
+ end
194
+
157
195
  end
158
196
 
159
197
  __END__