erector 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/README.txt +0 -4
  2. data/VERSION.yml +1 -1
  3. data/lib/erector.rb +2 -4
  4. data/lib/erector/abstract_widget.rb +2 -1
  5. data/lib/erector/erect/erect.rb +17 -14
  6. data/lib/erector/erect/rhtml.treetop +18 -10
  7. data/lib/erector/externals.rb +7 -1
  8. data/lib/erector/html.rb +30 -39
  9. data/lib/erector/rails.rb +6 -26
  10. data/lib/erector/rails/form_builder.rb +36 -0
  11. data/lib/erector/rails/railtie.rb +11 -0
  12. data/lib/erector/rails/template_handler.rb +16 -0
  13. data/lib/erector/rails/widget_renderer.rb +6 -0
  14. data/lib/erector/rails2.rb +27 -0
  15. data/lib/erector/{rails → rails2}/extensions/action_controller.rb +1 -1
  16. data/lib/erector/{rails → rails2}/extensions/rails_helpers.rb +17 -4
  17. data/lib/erector/{rails → rails2}/extensions/rails_widget.rb +6 -3
  18. data/lib/erector/{rails → rails2}/rails_form_builder.rb +0 -0
  19. data/lib/erector/rails2/rails_version.rb +6 -0
  20. data/lib/erector/{rails → rails2}/template_handlers/ert_handler.rb +0 -0
  21. data/lib/erector/{rails → rails2}/template_handlers/rb_handler.rb +2 -2
  22. data/lib/erector/rails3.rb +208 -0
  23. data/lib/erector/raw_string.rb +4 -0
  24. data/lib/erector/widgets/external_renderer.rb +8 -0
  25. data/spec/erect/erect_rails_spec.rb +34 -49
  26. data/spec/erect/erected_spec.rb +11 -0
  27. data/spec/rails2/erect_rails_spec.rb +114 -0
  28. data/spec/rails2/rails_app/Gemfile +12 -0
  29. data/spec/rails2/rails_app/Gemfile.lock +89 -0
  30. data/spec/rails2/rails_app/README +243 -0
  31. data/spec/rails2/rails_app/Rakefile +19 -0
  32. data/spec/rails2/rails_app/app/controllers/application_controller.rb +10 -0
  33. data/spec/rails2/rails_app/app/helpers/application_helper.rb +3 -0
  34. data/spec/rails2/rails_app/app/views/test/_erb.erb +1 -0
  35. data/spec/rails2/rails_app/app/views/test/_erector.rb +5 -0
  36. data/spec/rails2/rails_app/app/views/test/_partial_with_locals.rb +7 -0
  37. data/spec/rails2/rails_app/app/views/test/bare.rb +5 -0
  38. data/spec/rails2/rails_app/app/views/test/erb_from_erector.html.rb +5 -0
  39. data/spec/rails2/rails_app/app/views/test/erector_from_erb.html.erb +1 -0
  40. data/spec/rails2/rails_app/app/views/test/erector_with_locals_from_erb.html.erb +6 -0
  41. data/spec/rails2/rails_app/app/views/test/implicit_assigns.html.rb +5 -0
  42. data/spec/rails2/rails_app/app/views/test/needs.html.rb +7 -0
  43. data/spec/rails2/rails_app/app/views/test/needs_subclass.html.rb +5 -0
  44. data/spec/rails2/rails_app/app/views/test/protected_instance_variable.html.rb +5 -0
  45. data/spec/rails2/rails_app/app/views/test/render_default.html.rb +5 -0
  46. data/spec/rails2/rails_app/app/views/test/render_partial.html.rb +5 -0
  47. data/spec/rails2/rails_app/config/boot.rb +114 -0
  48. data/spec/rails2/rails_app/config/database.yml +16 -0
  49. data/spec/rails2/rails_app/config/environment.rb +42 -0
  50. data/spec/rails2/rails_app/config/environments/development.rb +17 -0
  51. data/spec/rails2/rails_app/config/environments/production.rb +28 -0
  52. data/spec/rails2/rails_app/config/environments/test.rb +28 -0
  53. data/spec/rails2/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  54. data/spec/rails2/rails_app/config/initializers/cookie_verification_secret.rb +7 -0
  55. data/spec/rails2/rails_app/config/initializers/inflections.rb +10 -0
  56. data/spec/rails2/rails_app/config/initializers/mime_types.rb +5 -0
  57. data/spec/rails2/rails_app/config/initializers/new_rails_defaults.rb +21 -0
  58. data/spec/rails2/rails_app/config/initializers/session_store.rb +15 -0
  59. data/spec/rails2/rails_app/config/locales/en.yml +5 -0
  60. data/spec/rails2/rails_app/config/routes.rb +43 -0
  61. data/spec/rails2/rails_app/db/development.sqlite3 +0 -0
  62. data/spec/rails2/rails_app/db/schema.rb +14 -0
  63. data/spec/rails2/rails_app/db/seeds.rb +7 -0
  64. data/spec/rails2/rails_app/doc/README_FOR_APP +2 -0
  65. data/spec/rails2/rails_app/log/development.log +76 -0
  66. data/spec/rails2/rails_app/log/production.log +0 -0
  67. data/spec/rails2/rails_app/log/server.log +0 -0
  68. data/spec/rails2/rails_app/log/test.log +4158 -0
  69. data/spec/rails2/rails_app/public/404.html +30 -0
  70. data/spec/rails2/rails_app/public/422.html +30 -0
  71. data/spec/rails2/rails_app/public/500.html +30 -0
  72. data/spec/rails2/rails_app/public/favicon.ico +0 -0
  73. data/spec/rails2/rails_app/public/images/rails.png +0 -0
  74. data/spec/rails2/rails_app/public/index.html +275 -0
  75. data/spec/rails2/rails_app/public/javascripts/application.js +2 -0
  76. data/spec/rails2/rails_app/public/javascripts/controls.js +963 -0
  77. data/spec/rails2/rails_app/public/javascripts/dragdrop.js +973 -0
  78. data/spec/rails2/rails_app/public/javascripts/effects.js +1128 -0
  79. data/spec/rails2/rails_app/public/javascripts/prototype.js +4320 -0
  80. data/spec/rails2/rails_app/public/robots.txt +5 -0
  81. data/spec/rails2/rails_app/script/about +4 -0
  82. data/spec/rails2/rails_app/script/console +3 -0
  83. data/spec/rails2/rails_app/script/dbconsole +3 -0
  84. data/spec/rails2/rails_app/script/destroy +3 -0
  85. data/spec/rails2/rails_app/script/generate +3 -0
  86. data/spec/rails2/rails_app/script/performance/benchmarker +3 -0
  87. data/spec/rails2/rails_app/script/performance/profiler +3 -0
  88. data/spec/rails2/rails_app/script/plugin +3 -0
  89. data/spec/rails2/rails_app/script/runner +3 -0
  90. data/spec/rails2/rails_app/script/server +3 -0
  91. data/spec/rails2/rails_app/spec/rails_helpers_spec.rb +255 -0
  92. data/spec/rails2/rails_app/spec/rails_spec_helper.rb +34 -0
  93. data/spec/rails2/rails_app/spec/rails_widget_spec.rb +83 -0
  94. data/spec/rails2/rails_app/spec/render_spec.rb +324 -0
  95. data/spec/rails2/rails_app/test/performance/browsing_test.rb +9 -0
  96. data/spec/rails2/rails_app/test/test_helper.rb +38 -0
  97. data/spec/rails2/rails_app/vendor/plugins/rails_xss/MIT-LICENSE +20 -0
  98. data/spec/rails2/rails_app/vendor/plugins/rails_xss/README.markdown +90 -0
  99. data/spec/rails2/rails_app/vendor/plugins/rails_xss/Rakefile +23 -0
  100. data/spec/rails2/rails_app/vendor/plugins/rails_xss/init.rb +7 -0
  101. data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss.rb +3 -0
  102. data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/action_view.rb +87 -0
  103. data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/erubis.rb +33 -0
  104. data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/rails_xss/string_ext.rb +52 -0
  105. data/spec/rails2/rails_app/vendor/plugins/rails_xss/lib/tasks/rails_xss_tasks.rake +4 -0
  106. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/active_record_helper_test.rb +74 -0
  107. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/asset_tag_helper_test.rb +49 -0
  108. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/caching_test.rb +43 -0
  109. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/date_helper_test.rb +29 -0
  110. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/deprecated_output_safety_test.rb +112 -0
  111. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/erb_util_test.rb +36 -0
  112. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/form_helper_test.rb +1447 -0
  113. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/form_tag_helper_test.rb +354 -0
  114. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/output_safety_test.rb +115 -0
  115. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/rails_xss_test.rb +23 -0
  116. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/test_helper.rb +5 -0
  117. data/spec/rails2/rails_app/vendor/plugins/rails_xss/test/text_helper_test.rb +17 -0
  118. data/spec/spec_helper.rb +2 -6
  119. metadata +348 -23
  120. data/lib/erector/errors.rb +0 -12
  121. data/lib/erector/extensions/hash.rb +0 -21
  122. data/lib/erector/extensions/object.rb +0 -18
  123. data/lib/erector/rails/rails_version.rb +0 -6
  124. data/rails/init.rb +0 -4
data/README.txt CHANGED
@@ -67,10 +67,6 @@ When installing this way, erector is automatically available to your Rails code
67
67
 
68
68
  Three spec rake tasks are provided: spec:core (core functionality),
69
69
  spec:erect (the erector command line tool), and spec:rails (rails integration).
70
- You do not need to have Rails installed to run the latter two; they will clone
71
- the rails git repository and set it up for testing automatically. You can test
72
- against a different version of Rails by changing the constants in
73
- lib/erector/rails/rails_version.rb
74
70
 
75
71
  'rake spec' will run the complete set of specs.
76
72
 
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 8
4
- :patch: 2
4
+ :patch: 3
@@ -9,9 +9,6 @@ rescue LoadError => e
9
9
  # oh well, no Sass
10
10
  end
11
11
 
12
- require "erector/errors"
13
- require "erector/extensions/object"
14
- require "erector/extensions/hash"
15
12
  require "erector/raw_string"
16
13
  require "erector/dependencies"
17
14
  require "erector/dependency"
@@ -28,7 +25,8 @@ require "erector/abstract_widget"
28
25
  require "erector/widget"
29
26
 
30
27
  require "erector/inline"
31
- require "erector/unicode"
32
28
  require "erector/widgets"
33
29
  require "erector/version"
34
30
  require "erector/mixin"
31
+
32
+ require "erector/rails" if defined?(Rails)
@@ -32,7 +32,7 @@ module Erector
32
32
 
33
33
  def initialize(assigns = {}, &block)
34
34
  unless assigns.is_a? Hash
35
- raise "Erector widgets are initialized with only a parameter hash. (Other parameters are passed to to_html, or the #widget method.)"
35
+ raise ArgumentError, "Erector widgets are initialized with only a parameter hash, but you passed #{assigns.class}:#{assigns.inspect}. (Other parameters are passed to to_html, or the #widget method.)"
36
36
  end
37
37
 
38
38
  @_assigns = assigns
@@ -66,6 +66,7 @@ module Erector
66
66
  # Rails view object.
67
67
  # content_method_name:: in case you want to call a method other than
68
68
  # #content, pass its name in here.
69
+ #
69
70
  def to_html(options = {})
70
71
  raise "Erector::Widget#to_html takes an options hash, not a symbol. Try calling \"to_html(:content_method_name=> :#{options})\"" if options.is_a? Symbol
71
72
  _render(options).to_s
@@ -3,6 +3,9 @@ require "rake"
3
3
  require "erector/erect/erected" # pull this out so we don't recreate the grammar every time
4
4
 
5
5
  module Erector
6
+
7
+ # "erect" is the erstwhile name of the command-line tool that converts between HTML/ERB and Erector.
8
+ # It's invoked via "erector --to-html foo.rb" or "erector --to-erector foo.html" (default is --to-erector)
6
9
  class Erect
7
10
  attr_reader :files, :verbose, :mode, :output_dir, :superklass, :method_name
8
11
  def initialize(args)
@@ -11,7 +14,7 @@ module Erector
11
14
  @output_dir = nil
12
15
  @superklass = 'Erector::Widget'
13
16
  @method_name = 'content'
14
-
17
+
15
18
  opts = OptionParser.new do |opts|
16
19
  opts.banner = "Usage: erector [options] [file|dir]*"
17
20
 
@@ -23,7 +26,7 @@ module Erector
23
26
  "Operate silently except in case of error") do |quiet|
24
27
  @verbose = !quiet
25
28
  end
26
-
29
+
27
30
  opts.on("--to-erector", "(default) Convert from html/rhtml to erector classes") do
28
31
  @mode = :to_erector
29
32
  end
@@ -31,15 +34,15 @@ module Erector
31
34
  opts.on("--to-html", "Convert from erector to html") do
32
35
  @mode = :to_html
33
36
  end
34
-
37
+
35
38
  opts.on("--superclass SUPERCLASS", "Superclass for new widget (default Erector::Widget)") do |superklass|
36
39
  @superklass = superklass
37
40
  end
38
-
41
+
39
42
  opts.on("--method METHOD", "Method containing content for widget (default 'content')") do |method_name|
40
43
  @method_name = method_name
41
44
  end
42
-
45
+
43
46
  opts.on("-o", "--output-dir DIRECTORY", "Output files to DIRECTORY (default: output files go next to input files)") do |dir|
44
47
  @output_dir = dir
45
48
  end
@@ -54,17 +57,17 @@ module Erector
54
57
  puts Erector::VERSION
55
58
  exit
56
59
  end
57
-
60
+
58
61
  end
59
62
  opts.parse!(args)
60
63
  @files = args
61
64
  explode_dirs
62
65
  end
63
-
66
+
64
67
  def say(msg)
65
68
  print msg if verbose
66
69
  end
67
-
70
+
68
71
  #todo: unit test
69
72
  def explode_dirs
70
73
  exploded_files = FileList.new
@@ -77,7 +80,7 @@ module Erector
77
80
  end
78
81
  @files = exploded_files
79
82
  end
80
-
83
+
81
84
  def explode(dir)
82
85
  case mode
83
86
  when :to_erector
@@ -86,13 +89,13 @@ module Erector
86
89
  FileList["#{dir}/**/*.rb"]
87
90
  end
88
91
  end
89
-
92
+
90
93
  def run
91
94
  @success = true
92
95
  self.send(mode)
93
96
  @success
94
97
  end
95
-
98
+
96
99
  def to_erector
97
100
  files.each do |file|
98
101
  say "Erecting #{file}... "
@@ -118,7 +121,7 @@ module Erector
118
121
  filename = file.split('/').last.gsub(/\.rb$/, '')
119
122
  widget_name = camelize(filename)
120
123
  widget_class = constantize(widget_name)
121
-
124
+
122
125
  if widget_class < Erector::Widget
123
126
  widget = widget_class.new
124
127
  #todo: skip if it's missing a no-arg constructor
@@ -139,7 +142,7 @@ module Erector
139
142
  end
140
143
  end
141
144
  end
142
-
145
+
143
146
  # stolen from activesuppport/lib/inflector.rb
144
147
  def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
145
148
  if first_letter_in_uppercase
@@ -154,7 +157,7 @@ module Erector
154
157
  end
155
158
  Object.module_eval("::#{$1}", __FILE__, __LINE__)
156
159
  end
157
-
160
+
158
161
 
159
162
  end
160
163
  end
@@ -80,11 +80,11 @@ grammar Rhtml
80
80
  def convert_removing_trims
81
81
  convert.gsub(/\s*\-\s*$/, '')
82
82
  end
83
-
83
+
84
84
  def text_value_removing_trims
85
85
  text_value.gsub(/\s*\-\s*$/, '')
86
86
  end
87
-
87
+
88
88
  def convert
89
89
  code = text_value.strip
90
90
  # matches a word, followed by either a word, a string, or a symbol
@@ -101,7 +101,7 @@ grammar Rhtml
101
101
  end
102
102
  }
103
103
  end
104
-
104
+
105
105
  rule directive
106
106
  '<!' [^>]* '>' <Erector::Indenting> {
107
107
  def convert
@@ -113,7 +113,7 @@ grammar Rhtml
113
113
  rule tagname
114
114
  [A-Za-z0-9_:-]+
115
115
  end
116
-
116
+
117
117
  rule varname
118
118
  [A-Za-z0-9_]+
119
119
  end
@@ -157,7 +157,7 @@ grammar Rhtml
157
157
  if stripped.empty?
158
158
  ""
159
159
  else
160
- line "text '#{stripped.html_unescape.gsub(/\'/, "\\\\'")
160
+ line "text '#{CGI.unescapeHTML(stripped).gsub(/\'/, "\\\\'")
161
161
  }'"
162
162
  end
163
163
  end
@@ -197,19 +197,27 @@ grammar Rhtml
197
197
  def value
198
198
  val.text_value
199
199
  end
200
-
200
+
201
201
  def convert
202
202
  extract_erb(val.text_value)
203
203
  end
204
-
204
+
205
205
  def parenthesize_if_necessary(s)
206
206
  return s if s.strip =~ /^\(.*\)$/ || s =~ /^[A-Z0-9_]*$/i
207
207
  "(" + s + ")"
208
208
  end
209
-
209
+
210
+ def escape_single_quotes(s)
211
+ s.gsub(/[']/, '\\\\\'')
212
+ end
213
+
214
+ def escape_quoted(s)
215
+ escape_single_quotes(CGI.unescapeHTML(s))
216
+ end
217
+
210
218
  def extract_erb(s, parenthesize = true)
211
219
  if s =~ /^(.*?)<%=(.*?)%>(.*?)$/
212
- pre, code, post = $1.html_unescape.escape_single_quotes, $2, $3.html_unescape.escape_single_quotes
220
+ pre, code, post = escape_quoted($1), $2, escape_quoted($3)
213
221
  out = ""
214
222
  out = "'#{pre}' + " unless pre.length == 0
215
223
  out += parenthesize_if_necessary(code.strip)
@@ -220,7 +228,7 @@ grammar Rhtml
220
228
  out = parenthesize_if_necessary(out) if parenthesize
221
229
  out
222
230
  else
223
- "'" + s.html_unescape.escape_single_quotes + "'"
231
+ "'" + escape_quoted(s) + "'"
224
232
  end
225
233
  end
226
234
  }
@@ -1,4 +1,10 @@
1
1
  module Erector
2
+
3
+ # Externals are a mechanism by which a widget can declare page-level
4
+ # resources upon which it depends. They are not emitted during the widget's
5
+ # normal rendering process. Rather, the Erector::Widget::Page keeps track of
6
+ # all the widgets it renders, then goes back and inserts the proper tags for
7
+ # all the externals inside its HEAD element.
2
8
  module Externals
3
9
  def self.included(base)
4
10
  base.extend ClassMethods
@@ -45,7 +51,7 @@ module Erector
45
51
  def my_dependencies
46
52
  @my_dependencies ||= Dependencies.new
47
53
  end
48
-
54
+
49
55
  private
50
56
  INFERABLE_TYPES = [:css, :js]
51
57
 
@@ -177,6 +177,7 @@ module Erector
177
177
  # Return a character given its unicode code point or unicode name.
178
178
  def character(code_point_or_name)
179
179
  if code_point_or_name.is_a?(Symbol)
180
+ require "erector/unicode"
180
181
  found = Erector::CHARACTERS[code_point_or_name]
181
182
  if found.nil?
182
183
  raise "Unrecognized character #{code_point_or_name}"
@@ -203,7 +204,7 @@ module Erector
203
204
  #
204
205
  # Since "Authors should avoid putting two or more adjacent hyphens inside comments,"
205
206
  # we emit a warning if you do that.
206
- def comment(text = '', &block)
207
+ def comment(text = '')
207
208
  puts "Warning: Authors should avoid putting two or more adjacent hyphens inside comments." if text =~ /--/
208
209
 
209
210
  conditional = text =~ /\[if .*\]/
@@ -212,9 +213,9 @@ module Erector
212
213
  rawtext text
213
214
  rawtext ">" if conditional
214
215
 
215
- if block
216
+ if block_given?
216
217
  rawtext "\n"
217
- block.call
218
+ yield
218
219
  rawtext "\n"
219
220
  end
220
221
 
@@ -224,43 +225,33 @@ module Erector
224
225
 
225
226
  # Emits a javascript block inside a +script+ tag, wrapped in CDATA
226
227
  # doohickeys like all the cool JS kids do.
227
- def javascript(*args, &block)
228
- if args.length > 2
229
- raise ArgumentError, "Cannot accept more than two arguments"
228
+ def javascript(value = nil, attributes = {})
229
+ if value.is_a?(Hash)
230
+ attributes = value
231
+ value = nil
232
+ elsif block_given? && value
233
+ raise ArgumentError, "You can't pass both a block and a value to javascript -- please choose one."
230
234
  end
231
- attributes, value = nil, nil
232
- arg0 = args[0]
233
- if arg0.is_a?(Hash)
234
- attributes = arg0
235
- else
236
- value = arg0
237
- arg1 = args[1]
238
- if arg1.is_a?(Hash)
239
- attributes = arg1
235
+
236
+ script(attributes.merge(:type => "text/javascript")) do
237
+ # Shouldn't this be a "cdata" HtmlPart?
238
+ # (maybe, but the syntax is specific to javascript; it isn't
239
+ # really a generic XML CDATA section. Specifically,
240
+ # ]]> within value is not treated as ending the
241
+ # CDATA section by Firefox2 when parsing text/html,
242
+ # although I guess we could refuse to generate ]]>
243
+ # there, for the benefit of XML/XHTML parsers).
244
+ output << raw("\n// <![CDATA[\n")
245
+ if block_given?
246
+ yield
247
+ else
248
+ output << raw(value)
240
249
  end
250
+ output << raw("\n// ]]>")
251
+ output.append_newline # this forces a newline even if we're not in pretty mode
241
252
  end
242
- attributes ||= {}
243
- attributes[:type] = "text/javascript"
244
- open_tag 'script', attributes
245
-
246
- # Shouldn't this be a "cdata" HtmlPart?
247
- # (maybe, but the syntax is specific to javascript; it isn't
248
- # really a generic XML CDATA section. Specifically,
249
- # ]]> within value is not treated as ending the
250
- # CDATA section by Firefox2 when parsing text/html,
251
- # although I guess we could refuse to generate ]]>
252
- # there, for the benefit of XML/XHTML parsers).
253
- rawtext "\n// <![CDATA[\n"
254
- if block
255
- instance_eval(&block)
256
- else
257
- rawtext value
258
- end
259
- rawtext "\n// ]]>"
260
- output.append_newline # this forces a newline even if we're not in pretty mode
261
253
 
262
- close_tag 'script'
263
- rawtext "\n"
254
+ output << raw("\n")
264
255
  end
265
256
 
266
257
  protected
@@ -322,7 +313,7 @@ module Erector
322
313
  results << "#{key}=\"#{h(value)}\""
323
314
  end
324
315
  end
325
- return results.join(' ')
316
+ results.join(' ')
326
317
  end
327
318
 
328
319
  def sorted(attributes)
@@ -330,7 +321,7 @@ module Erector
330
321
  attributes.each do |key, value|
331
322
  stringized << [key.to_s, value]
332
323
  end
333
- return stringized.sort
324
+ stringized.sort
334
325
  end
335
326
 
336
327
  def sort_for_xml_declaration(attributes)
@@ -340,7 +331,7 @@ module Erector
340
331
  attributes.each do |key, value|
341
332
  stringized << [key.to_s, value]
342
333
  end
343
- return stringized.sort{|a, b| b <=> a}
334
+ stringized.sort{|a, b| b <=> a}
344
335
  end
345
336
 
346
337
  NON_NEWLINEY = {'i' => true, 'b' => true, 'small' => true,
@@ -1,27 +1,7 @@
1
- require "action_controller"
2
- require "erector/rails/rails_version"
3
- require "erector/rails/rails_form_builder"
4
- require "erector/rails/extensions/action_controller"
5
- require "erector/rails/extensions/rails_helpers"
6
- require "erector/rails/extensions/rails_widget"
7
- require "erector/rails/template_handlers/rb_handler"
8
- require "erector/rails/template_handlers/ert_handler"
9
-
10
- module Erector
11
- def self.init_rails(binding)
12
- # Rails defaults do not include app/views in the eager load path.
13
- # It needs to be there, because erector views are .rb files.
14
- if config = eval("config if defined? config", binding)
15
- view_path = config.view_path
16
- config.load_paths << view_path unless config.load_paths.include?(view_path)
17
- config.eager_load_paths << view_path unless config.eager_load_paths.include?(view_path)
18
-
19
- # Rails probably already ran Initializer#set_load_path and
20
- # #set_autoload_paths by the time we got here.
21
- $LOAD_PATH.unshift(view_path) unless $LOAD_PATH.include?(view_path)
22
- unless ActiveSupport::Dependencies.load_paths.include?(view_path)
23
- ActiveSupport::Dependencies.load_paths << view_path
24
- end
25
- end
26
- end
1
+ require 'rails/version'
2
+ if Rails::VERSION::MAJOR == 2
3
+ require 'erector/rails2'
4
+ else
5
+ require 'erector/rails3'
27
6
  end
7
+
@@ -0,0 +1,36 @@
1
+ module Erector
2
+ module Rails
3
+ class FormBuilder
4
+ class_attribute :parent_builder_class
5
+ self.parent_builder_class = ActionView::Base.default_form_builder
6
+
7
+ def self.wrapping(parent_builder_class)
8
+ return self if parent_builder_class.nil?
9
+ Class.new(self).tap do |klass|
10
+ klass.parent_builder_class = parent_builder_class
11
+ end
12
+ end
13
+
14
+ attr_reader :parent, :template
15
+
16
+ def initialize(object_name, object, template, options, proc)
17
+ @template = template
18
+ @parent = parent_builder_class.new(object_name, object, template, options, proc)
19
+ end
20
+
21
+ def method_missing(method_name, *args, &block)
22
+ if parent.respond_to?(method_name)
23
+ return_value = parent.send(method_name, *args, &block)
24
+ if return_value.is_a?(String)
25
+ template.concat(return_value)
26
+ nil
27
+ else
28
+ return_value
29
+ end
30
+ else
31
+ super
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end