padrino-helpers 0.13.3 → 0.13.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fae667093f9d16b75e8d85e0285d3c312aecb800
4
- data.tar.gz: 989e8e9811af48ac97cab76747c9eb367ad91a8f
3
+ metadata.gz: 5dd540d3a9472d8c134bab1741faf3f69ae62166
4
+ data.tar.gz: 036a523946eefb56ec7892ead4e6df2c5f200d87
5
5
  SHA512:
6
- metadata.gz: de540aac4ac602e597a8f86f15a5517fc078fa93a6ad85d392c7e8a4106e4d365ce46b9159cead733851e87df240a956a92c9fa3543797f6324546424ece56c1
7
- data.tar.gz: c26cff77011c615f9b81662ffa2e4215e864e915a454093fc693bebf23d57fda2cad5dcafa8cbcbe5b3c539385b430679f2f55607d51ce13113b05b7914dc057
6
+ metadata.gz: 734ebfd2d7817d8feb9221f9037df2da53923552cc961b7a6a60573539410dab665fbcc99f40296492f8cca611147c0aef6d64b533ba27d93f974f34c0e378b8
7
+ data.tar.gz: f8b6b1a10621c16c53786bc20b3494508f07e160bf94b788020a55e407ac443ebcb779e33c7282d7a1b47238e8b9f111b36c306eb1bbc8cd04d3250bfd1d5b1c
@@ -32,9 +32,9 @@ module Padrino
32
32
  def flash_tag(*args)
33
33
  options = args.last.is_a?(Hash) ? args.pop : {}
34
34
  bootstrap = options.delete(:bootstrap) if options[:bootstrap]
35
- args.inject(ActiveSupport::SafeBuffer.new) do |html,kind|
36
- flash_text = ActiveSupport::SafeBuffer.new << flash[kind]
37
- next html if flash_text.blank?
35
+ args.inject(SafeBuffer.new) do |html,kind|
36
+ next html unless flash[kind]
37
+ flash_text = SafeBuffer.new << flash[kind]
38
38
  flash_text << content_tag(:button, '&times;'.html_safe, {:type => :button, :class => :close, :'data-dismiss' => :alert}) if bootstrap
39
39
  html << content_tag(:div, flash_text, { :class => kind }.update(options))
40
40
  end
@@ -243,8 +243,8 @@ module Padrino
243
243
  options = {
244
244
  :rel => 'stylesheet',
245
245
  :type => 'text/css'
246
- }.update(sources.last.is_a?(Hash) ? sources.pop.symbolize_keys : {})
247
- sources.flatten.inject(ActiveSupport::SafeBuffer.new) do |all,source|
246
+ }.update(sources.last.is_a?(Hash) ? Utils.symbolize_keys(sources.pop) : {})
247
+ sources.flatten.inject(SafeBuffer.new) do |all,source|
248
248
  all << tag(:link, { :href => asset_path(:css, source) }.update(options))
249
249
  end
250
250
  end
@@ -266,8 +266,8 @@ module Padrino
266
266
  def javascript_include_tag(*sources)
267
267
  options = {
268
268
  :type => 'text/javascript'
269
- }.update(sources.last.is_a?(Hash) ? sources.pop.symbolize_keys : {})
270
- sources.flatten.inject(ActiveSupport::SafeBuffer.new) do |all,source|
269
+ }.update(sources.last.is_a?(Hash) ? Utils.symbolize_keys(sources.pop) : {})
270
+ sources.flatten.inject(SafeBuffer.new) do |all,source|
271
271
  all << content_tag(:script, nil, { :src => asset_path(:js, source) }.update(options))
272
272
  end
273
273
  end
@@ -155,7 +155,7 @@ module Padrino
155
155
  include_index = default_collection.respond_to?(:each)
156
156
 
157
157
  nested_options = { :parent => self, :association => child_association }
158
- Array(collection).each_with_index.inject(ActiveSupport::SafeBuffer.new) do |all,(child_instance,index)|
158
+ Array(collection).each_with_index.inject(SafeBuffer.new) do |all,(child_instance,index)|
159
159
  nested_options[:index] = options[:index] || (include_index ? index : nil)
160
160
  all << @template.fields_for(child_instance, { :nested => nested_options, :builder => self.class }, &block) << "\n"
161
161
  end
@@ -196,7 +196,7 @@ module Padrino
196
196
  # field_name(:street) => "user[addresses_attributes][0][street]"
197
197
  def field_name(field=nil)
198
198
  result = field_name_fragment
199
- result << "[#{field}]" unless field.blank?
199
+ result << "[#{field}]" if field
200
200
  result
201
201
  end
202
202
 
@@ -209,8 +209,8 @@ module Padrino
209
209
  def field_id(field=nil, value=nil)
210
210
  result = (namespace && !is_nested) ? "#{namespace}_" : ''
211
211
  result << field_id_fragment
212
- result << "_#{field}" unless field.blank?
213
- result << "_#{value}" unless value.blank?
212
+ result << "_#{field}" if field
213
+ result << "_#{value}" if value
214
214
  result
215
215
  end
216
216
 
@@ -242,7 +242,7 @@ module Padrino
242
242
  options = { :id => field_id(field), :selected => field_value(field) }.update(options)
243
243
  options.update(error_class(field)){ |_,*values| values.compact.join(' ') }
244
244
  selected_values = resolve_checked_values(field, options)
245
- variants_for_group(options).inject(ActiveSupport::SafeBuffer.new) do |html, (caption,value)|
245
+ variants_for_group(options).inject(SafeBuffer.new) do |html, (caption,value)|
246
246
  variant_id = "#{options[:id]}_#{value}"
247
247
  attributes = { :value => value, :id => variant_id, :checked => selected_values.include?(value) }
248
248
  caption = yield(attributes) << ' ' << caption
@@ -308,7 +308,7 @@ module Padrino
308
308
 
309
309
  def error_class(field)
310
310
  error = @object.errors[field] if @object.respond_to?(:errors)
311
- error.blank? ? {} : { :class => 'invalid' }
311
+ error.nil? || error.empty? ? {} : { :class => 'invalid' }
312
312
  end
313
313
 
314
314
  def default_options(field, options, defaults={})
@@ -121,7 +121,7 @@ module Padrino
121
121
  # hidden_form_method_field('delete')
122
122
  #
123
123
  def hidden_form_method_field(desired_method)
124
- return ActiveSupport::SafeBuffer.new if desired_method.blank? || desired_method.to_s =~ /get|post/i
124
+ return SafeBuffer.new if desired_method.nil? || desired_method.to_s =~ /get|post/i
125
125
  hidden_field_tag(:_method, :value => desired_method)
126
126
  end
127
127
 
@@ -144,7 +144,7 @@ module Padrino
144
144
  #
145
145
  def field_set_tag(*args, &block)
146
146
  options = args.last.is_a?(Hash) ? args.pop : {}
147
- legend_html = args.empty? ? ActiveSupport::SafeBuffer.new : content_tag(:legend, args.first)
147
+ legend_html = args.empty? ? SafeBuffer.new : content_tag(:legend, args.first)
148
148
  concat_content content_tag(:fieldset, legend_html << capture_html(&block), options)
149
149
  end
150
150
 
@@ -168,7 +168,7 @@ module Padrino
168
168
  #
169
169
  def label_tag(name, options={}, &block)
170
170
  options = { :caption => "#{name.to_s.humanize}: ", :for => name }.update(options)
171
- caption_text = ActiveSupport::SafeBuffer.new << options.delete(:caption)
171
+ caption_text = SafeBuffer.new << options.delete(:caption)
172
172
  caption_text << "<span class='required'>*</span> ".html_safe if options.delete(:required)
173
173
 
174
174
  if block_given?
@@ -37,10 +37,10 @@ module Padrino
37
37
  # error_messages_for :user
38
38
  #
39
39
  def error_messages_for(*objects)
40
- options = objects.last.is_a?(Hash) ? objects.pop.symbolize_keys : {}
40
+ options = objects.last.is_a?(Hash) ? Utils.symbolize_keys(objects.pop) : {}
41
41
  objects = objects.map{ |obj| resolve_object(obj) }.compact
42
42
  count = objects.inject(0){ |sum, object| sum + object.errors.count }
43
- return ActiveSupport::SafeBuffer.new if count.zero?
43
+ return SafeBuffer.new if count.zero?
44
44
 
45
45
  content_tag(:div, error_contents(objects, count, options), error_html_attributes(options))
46
46
  end
@@ -78,7 +78,7 @@ module Padrino
78
78
  # @api public
79
79
  def error_message_on(object, field, options={})
80
80
  error = Array(resolve_object(object).errors[field]).first
81
- return ActiveSupport::SafeBuffer.new unless error
81
+ return SafeBuffer.new unless error
82
82
  options = { :tag => :span, :class => :error }.update(options)
83
83
  tag = options.delete(:tag)
84
84
  error = [options.delete(:prepend), error, options.delete(:append)].compact.join(" ")
@@ -90,7 +90,7 @@ module Padrino
90
90
  def error_contents(objects, count, options)
91
91
  object_name = options[:object_name] || objects.first.class.to_s.underscore.gsub(/\//, ' ')
92
92
 
93
- contents = ActiveSupport::SafeBuffer.new
93
+ contents = SafeBuffer.new
94
94
  contents << error_header_tag(options, object_name, count)
95
95
  contents << error_body_tag(options)
96
96
  contents << error_list_tag(objects, object_name)
@@ -98,7 +98,7 @@ module Padrino
98
98
 
99
99
  def error_list_tag(objects, object_name)
100
100
  errors = objects.inject({}){ |all,object| all.update(object.errors) }
101
- error_messages = errors.inject(ActiveSupport::SafeBuffer.new) do |all, (field, message)|
101
+ error_messages = errors.inject(SafeBuffer.new) do |all, (field, message)|
102
102
  field_name = I18n.t(field, :default => field.to_s.humanize, :scope => [:models, object_name, :attributes])
103
103
  all << content_tag(:li, "#{field_name} #{message}")
104
104
  end
@@ -110,19 +110,19 @@ module Padrino
110
110
  model_name = I18n.t(:name, :default => object_name.humanize, :scope => [:models, object_name], :count => 1)
111
111
  I18n.t :header, :count => count, :model => model_name, :locale => options[:locale], :scope => [:models, :errors, :template]
112
112
  end
113
- content_tag(options[:header_tag] || :h2, header_message) if header_message.present?
113
+ content_tag(options[:header_tag] || :h2, header_message) unless header_message.empty?
114
114
  end
115
115
 
116
116
  def error_body_tag(options)
117
117
  body_message = options[:message] || I18n.t(:body, :locale => options[:locale], :scope => [:models, :errors, :template])
118
- content_tag(:p, body_message) if body_message.present?
118
+ content_tag(:p, body_message) unless body_message.empty?
119
119
  end
120
120
 
121
121
  def error_html_attributes(options)
122
122
  [:id, :class, :style].each_with_object({}) do |key,all|
123
123
  if options.include?(key)
124
124
  value = options[key]
125
- all[key] = value unless value.blank?
125
+ all[key] = value if value
126
126
  else
127
127
  all[key] = 'field-errors' unless key == :style
128
128
  end
@@ -55,7 +55,7 @@ module Padrino
55
55
  # Returns the options tags for a select based on the given option items.
56
56
  #
57
57
  def options_for_select(option_items, state = {})
58
- return [] if option_items.blank?
58
+ return [] if option_items.count == 0
59
59
  option_items.map do |caption, value, attributes|
60
60
  html_attributes = { :value => value || caption }.merge(attributes||{})
61
61
  html_attributes[:selected] ||= option_is_selected?(html_attributes[:value], caption, state[:selected])
@@ -216,7 +216,7 @@ module Padrino
216
216
  def highlight(text, words, *args)
217
217
  options = { :highlighter => '<strong class="highlight">\1</strong>' }.update(args.last.is_a?(Hash) ? args.pop : {})
218
218
 
219
- if text.blank? || words.blank?
219
+ if text.empty? || words.empty?
220
220
  text
221
221
  else
222
222
  match = Array(words).map { |p| Regexp.escape(p) }.join('|')
@@ -41,7 +41,7 @@ module Padrino
41
41
  # # => 1234567890,50 &pound;
42
42
  #
43
43
  def number_to_currency(number, options = {})
44
- options.symbolize_keys!
44
+ options = Utils.symbolize_keys(options)
45
45
 
46
46
  defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
47
47
  currency = I18n.translate(:'number.currency.format', :locale => options[:locale], :raise => true) rescue {}
@@ -89,7 +89,7 @@ module Padrino
89
89
  # number_to_percentage(302.24398923423, :precision => 5) # => 302.24399%
90
90
  #
91
91
  def number_to_percentage(number, options = {})
92
- options.symbolize_keys!
92
+ options = Utils.symbolize_keys(options)
93
93
 
94
94
  defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
95
95
  percentage = I18n.translate(:'number.percentage.format', :locale => options[:locale], :raise => true) rescue {}
@@ -134,8 +134,7 @@ module Padrino
134
134
  # # => 98 765 432,98
135
135
  #
136
136
  def number_with_delimiter(number, *args)
137
- options = args.last.is_a?(Hash) ? args.pop : {}
138
- options.symbolize_keys!
137
+ options = args.last.is_a?(Hash) ? Utils.symbolize_keys(args.pop) : {}
139
138
 
140
139
  defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
141
140
 
@@ -178,8 +177,7 @@ module Padrino
178
177
  # # => 1.111,23
179
178
  #
180
179
  def number_with_precision(number, *args)
181
- options = args.last.is_a?(Hash) ? args.pop : {}
182
- options.symbolize_keys!
180
+ options = args.last.is_a?(Hash) ? Utils.symbolize_keys(args.pop) : {}
183
181
 
184
182
  defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
185
183
  precision_defaults = I18n.translate(:'number.precision.format', :locale => options[:locale],
@@ -239,8 +237,7 @@ module Padrino
239
237
  def number_to_human_size(number, *args)
240
238
  return nil if number.nil?
241
239
 
242
- options = args.last.is_a?(Hash) ? args.pop : {}
243
- options.symbolize_keys!
240
+ options = args.last.is_a?(Hash) ? Utils.symbolize_keys(args.pop) : {}
244
241
 
245
242
  defaults = I18n.translate(:'number.format', :locale => options[:locale], :raise => true) rescue {}
246
243
  human = I18n.translate(:'number.human.format', :locale => options[:locale], :raise => true) rescue {}
@@ -53,9 +53,9 @@ module Padrino
53
53
  # capture_html(object_for_block, &block) => "...html..."
54
54
  #
55
55
  # @example
56
- # ActiveSupport::SafeBuffer.new + capture_html { "<foo>" }
56
+ # SafeBuffer.new + capture_html { "<foo>" }
57
57
  # # => "&lt;foo&gt;"
58
- # ActiveSupport::SafeBuffer.new.safe_concat(capture_html { "<foo>" })
58
+ # SafeBuffer.new.safe_concat(capture_html { "<foo>" })
59
59
  # # => "<foo>"
60
60
  #
61
61
  def capture_html(*args, &block)
@@ -181,7 +181,7 @@ module Padrino
181
181
  def yield_content(key, *args)
182
182
  blocks = content_blocks[key.to_sym]
183
183
  return nil if blocks.empty?
184
- blocks.inject(ActiveSupport::SafeBuffer.new){ |all,content| all << capture_html(*args, &content) }
184
+ blocks.inject(SafeBuffer.new){ |all,content| all << capture_html(*args, &content) }
185
185
  end
186
186
 
187
187
  protected
@@ -213,7 +213,7 @@ module Padrino
213
213
  #
214
214
  # @param [String, Array<String>] the values to be marked safe.
215
215
  #
216
- # @return [ActiveSupport::SafeBuffer, Array<ActiveSupport::SafeBuffer>]
216
+ # @return [SafeBuffer, Array<SafeBuffer>]
217
217
  def mark_safe(value)
218
218
  if value.respond_to? :map!
219
219
  value.map!{|v| v.html_safe if v }
@@ -29,7 +29,7 @@ module Padrino
29
29
  # @handler.capture_from_template(&block) => "...html..."
30
30
  #
31
31
  def capture_from_template(*args, &block)
32
- self.output_buffer, _buf_was = ActiveSupport::SafeBuffer.new, self.output_buffer
32
+ self.output_buffer, _buf_was = SafeBuffer.new, self.output_buffer
33
33
  raw = yield(*args)
34
34
  captured = template.instance_variable_get(:@_out_buf)
35
35
  self.output_buffer = _buf_was
@@ -34,8 +34,8 @@ module Padrino
34
34
  options = { :locals => {}, :layout => false }.update(options)
35
35
  explicit_engine = options.delete(:engine)
36
36
 
37
- path, name = File.split(template.to_s)
38
- template_path = File.join(path,"_#{name}").to_sym
37
+ path, _, name = template.to_s.rpartition(File::SEPARATOR)
38
+ template_path = path.empty? ? :"_#{name}" : :"#{path}#{File::SEPARATOR}_#{name}"
39
39
  item_name = name.partition('.').first.to_sym
40
40
 
41
41
  items, counter = if options[:collection].respond_to?(:inject)
@@ -45,7 +45,7 @@ module Padrino
45
45
  end
46
46
 
47
47
  locals = options[:locals]
48
- items.each_with_object(ActiveSupport::SafeBuffer.new) do |item,html|
48
+ items.each_with_object(SafeBuffer.new) do |item,html|
49
49
  locals[item_name] = item if item
50
50
  locals["#{item_name}_counter".to_sym] = counter += 1 if counter
51
51
  content =
@@ -124,7 +124,7 @@ module Padrino
124
124
 
125
125
  options = parse_data_options(name, options)
126
126
  attributes = tag_attributes(options)
127
- output = ActiveSupport::SafeBuffer.new
127
+ output = SafeBuffer.new
128
128
  output.safe_concat "<#{name}#{attributes}>"
129
129
  if content.respond_to?(:each) && !content.is_a?(String)
130
130
  content.each{ |item| output.concat item; output.safe_concat NEWLINE }
@@ -0,0 +1,25 @@
1
+ if defined?(ActiveSupport::SafeBuffer)
2
+ SafeBuffer = ActiveSupport::SafeBuffer
3
+ else
4
+ require 'padrino/safe_buffer'
5
+
6
+ SafeBuffer = Padrino::SafeBuffer
7
+
8
+ class String
9
+ def html_safe
10
+ SafeBuffer.new(self)
11
+ end
12
+ end
13
+
14
+ class Object
15
+ def html_safe?
16
+ false
17
+ end
18
+ end
19
+
20
+ class Numeric
21
+ def html_safe?
22
+ true
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,4 @@
1
+ require 'padrino/core_ext/output_safety'
1
2
  require 'padrino-support'
2
3
  require 'pathname'
3
4
 
@@ -206,7 +207,7 @@ module Padrino
206
207
 
207
208
  # Cleanup the template.
208
209
  @current_engine, engine_was = engine, @current_engine
209
- @_out_buf, buf_was = ActiveSupport::SafeBuffer.new, @_out_buf
210
+ @_out_buf, buf_was = SafeBuffer.new, @_out_buf
210
211
 
211
212
  # Pass arguments to Sinatra render method.
212
213
  super(engine, data, with_layout(options), locals, &block)
@@ -276,7 +277,7 @@ module Padrino
276
277
  template_candidates = glob_templates(layouts_path, template_path)
277
278
  selected_template = select_template(template_candidates, *rendering_options)
278
279
 
279
- fail TemplateNotFound, "Layout '#{template_path}' not found in '#{layouts_path}'" if !selected_template && layout.present?
280
+ fail TemplateNotFound, "Layout '#{template_path}' not found in '#{layouts_path}'" if !selected_template && layout
280
281
  selected_template
281
282
  end
282
283
  end
@@ -287,7 +288,7 @@ module Padrino
287
288
  return options if layout == false
288
289
 
289
290
  layout = @layout if !layout || layout == true
290
- return options if settings.templates.has_key?(:layout) && layout.blank?
291
+ return options if settings.templates.has_key?(:layout) && !layout
291
292
 
292
293
  if layout.kind_of?(String) && Pathname.new(layout).absolute?
293
294
  layout_path, _, layout = layout.rpartition('/')
@@ -300,8 +301,8 @@ module Padrino
300
301
 
301
302
  def glob_templates(views_path, template_path)
302
303
  parts = []
303
- parts << views_path if views_path.present?
304
- if respond_to?(:request) && request.respond_to?(:controller) && request.controller.present? && Pathname.new(template_path).relative?
304
+ parts << views_path if views_path
305
+ if respond_to?(:request) && request.respond_to?(:controller) && request.controller && Pathname.new(template_path).relative?
305
306
  parts << "{,#{request.controller}}"
306
307
  end
307
308
  parts << template_path.chomp(File.extname(template_path)) + '.*'
@@ -16,7 +16,7 @@ module Padrino
16
16
  def set_eoutvar(compiler, eoutvar = '_erbout')
17
17
  compiler.put_cmd = "#{eoutvar}.safe_concat"
18
18
  compiler.insert_cmd = "#{eoutvar}.concat"
19
- compiler.pre_cmd = ["#{eoutvar} = ActiveSupport::SafeBuffer.new"]
19
+ compiler.pre_cmd = ["#{eoutvar} = SafeBuffer.new"]
20
20
  compiler.post_cmd = ["#{eoutvar}.force_encoding(__ENCODING__)"]
21
21
  end
22
22
  end
@@ -2,7 +2,7 @@ module Padrino
2
2
  module Rendering
3
3
  ##
4
4
  # SafeBufferEnhancer is an Erubis Enhancer that compiles templates that
5
- # are fit for using ActiveSupport::SafeBuffer as a Buffer.
5
+ # are fit for using SafeBuffer as a Buffer.
6
6
  #
7
7
  # @api private
8
8
  module SafeBufferEnhancer
@@ -53,7 +53,7 @@ module Padrino
53
53
  def precompiled_preamble(locals)
54
54
  original = super
55
55
  return original unless @is_padrino_app
56
- "__in_erb_template = true\n" << original.rpartition("\n").first << "#{@outvar} = _buf = ActiveSupport::SafeBuffer.new\n"
56
+ "__in_erb_template = true\n" << original.rpartition("\n").first << "#{@outvar} = _buf = SafeBuffer.new\n"
57
57
  end
58
58
  end
59
59
  end
@@ -1,5 +1,21 @@
1
1
  module Padrino
2
2
  module Rendering
3
+ class SlimOutputBuffer < Temple::Generators::StringBuffer
4
+ define_options :buffer_class => 'SafeBuffer'
5
+
6
+ def call(exp)
7
+ [preamble, compile(exp), postamble].flatten.compact.join('; '.freeze)
8
+ end
9
+
10
+ def create_buffer
11
+ "#{buffer} = #{options[:buffer_class]}.new"
12
+ end
13
+
14
+ def concat(str)
15
+ "#{buffer}.safe_concat((#{str}))"
16
+ end
17
+ end
18
+
3
19
  class SlimTemplate < Slim::Template
4
20
  include SafeTemplate
5
21
 
@@ -13,7 +29,7 @@ end
13
29
  Tilt.prefer(Padrino::Rendering::SlimTemplate, :slim)
14
30
 
15
31
  Padrino::Rendering.engine_configurations[:slim] = {
16
- :generator => Temple::Generators::RailsOutputBuffer,
32
+ :generator => Padrino::Rendering::SlimOutputBuffer,
17
33
  :buffer => "@_out_buf",
18
34
  :use_html_safe => true,
19
35
  :disable_capture => true,
@@ -0,0 +1,118 @@
1
+ module Padrino
2
+ ##
3
+ # Padrino::SafeBuffer is based on ActiveSupport::SafeBuffer
4
+ #
5
+ class SafeBuffer < String
6
+ UNSAFE_STRING_METHODS = %w(
7
+ capitalize chomp chop delete downcase gsub lstrip next reverse rstrip
8
+ slice squeeze strip sub succ swapcase tr tr_s upcase
9
+ )
10
+
11
+ alias_method :original_concat, :concat
12
+ private :original_concat
13
+
14
+ class SafeConcatError < StandardError
15
+ def initialize
16
+ super "Could not concatenate to the buffer because it is not html safe."
17
+ end
18
+ end
19
+
20
+ def [](*args)
21
+ if args.size < 2
22
+ super
23
+ else
24
+ if html_safe?
25
+ new_safe_buffer = super
26
+
27
+ if new_safe_buffer
28
+ new_safe_buffer.instance_variable_set :@html_safe, true
29
+ end
30
+
31
+ new_safe_buffer
32
+ else
33
+ to_str[*args]
34
+ end
35
+ end
36
+ end
37
+
38
+ def safe_concat(value)
39
+ raise SafeConcatError unless html_safe?
40
+ original_concat(value)
41
+ end
42
+
43
+ def initialize(str = "")
44
+ @html_safe = true
45
+ super
46
+ end
47
+
48
+ def initialize_copy(other)
49
+ super
50
+ @html_safe = other.html_safe?
51
+ end
52
+
53
+ def clone_empty
54
+ self[0, 0]
55
+ end
56
+
57
+ def concat(value)
58
+ super(html_escape_interpolated_argument(value))
59
+ end
60
+ alias << concat
61
+
62
+ def prepend(value)
63
+ super(html_escape_interpolated_argument(value))
64
+ end
65
+
66
+ def +(other)
67
+ dup.concat(other)
68
+ end
69
+
70
+ def %(args)
71
+ case args
72
+ when Hash
73
+ escaped_args = Hash[args.map { |k,arg| [k, html_escape_interpolated_argument(arg)] }]
74
+ else
75
+ escaped_args = Array(args).map { |arg| html_escape_interpolated_argument(arg) }
76
+ end
77
+
78
+ self.class.new(super(escaped_args))
79
+ end
80
+
81
+ def html_safe?
82
+ defined?(@html_safe) && @html_safe
83
+ end
84
+
85
+ def to_s
86
+ self
87
+ end
88
+
89
+ def to_param
90
+ to_str
91
+ end
92
+
93
+ def encode_with(coder)
94
+ coder.represent_object nil, to_str
95
+ end
96
+
97
+ UNSAFE_STRING_METHODS.each do |unsafe_method|
98
+ if unsafe_method.respond_to?(unsafe_method)
99
+ class_eval <<-EOT, __FILE__, __LINE__ + 1
100
+ def #{unsafe_method}(*args, &block) # def capitalize(*args, &block)
101
+ to_str.#{unsafe_method}(*args, &block) # to_str.capitalize(*args, &block)
102
+ end # end
103
+
104
+ def #{unsafe_method}!(*args) # def capitalize!(*args)
105
+ @html_safe = false # @html_safe = false
106
+ super # super
107
+ end # end
108
+ EOT
109
+ end
110
+ end
111
+
112
+ private
113
+
114
+ def html_escape_interpolated_argument(arg)
115
+ (!html_safe? || arg.html_safe?) ? arg : CGI.escapeHTML(arg.to_s)
116
+ end
117
+ end
118
+ end
data/test/helper.rb CHANGED
@@ -44,8 +44,8 @@ class MiniTest::Spec
44
44
  FileUtils.mkdir_p(File.dirname(__FILE__) + "/views")
45
45
  FileUtils.mkdir_p(File.dirname(__FILE__) + "/views/layouts")
46
46
  path = "/views/#{name}"
47
- path += ".#{options.delete(:locale)}" if options[:locale].present?
48
- path += ".#{options[:format]}" if options[:format].present?
47
+ path += ".#{options.delete(:locale)}" if options[:locale]
48
+ path += ".#{options[:format]}" if options[:format]
49
49
  path += ".erb" unless options[:format].to_s =~ /erb|slim|haml|rss|atom|builder|liquid/
50
50
  path += ".builder" if options[:format].to_s =~ /rss|atom/
51
51
  file = File.dirname(__FILE__) + path
@@ -209,23 +209,23 @@ describe "FormatHelpers" do
209
209
  describe 'for #js_escape_html method' do
210
210
  it 'should escape double quotes' do
211
211
  assert_equal "\\\"hello\\\"", js_escape_html('"hello"')
212
- assert_equal "\\\"hello\\\"", js_escape_html(ActiveSupport::SafeBuffer.new('"hello"'))
212
+ assert_equal "\\\"hello\\\"", js_escape_html(SafeBuffer.new('"hello"'))
213
213
  end
214
214
  it 'should escape single quotes' do
215
215
  assert_equal "\\'hello\\'", js_escape_html("'hello'")
216
- assert_equal "\\'hello\\'", js_escape_html(ActiveSupport::SafeBuffer.new("'hello'"))
216
+ assert_equal "\\'hello\\'", js_escape_html(SafeBuffer.new("'hello'"))
217
217
  end
218
218
  it 'should escape html tags and breaks' do
219
219
  assert_equal "\\n\\n<p>hello<\\/p>\\n", js_escape_html("\n\r<p>hello</p>\r\n")
220
- assert_equal "\\n\\n<p>hello<\\/p>\\n", js_escape_html(ActiveSupport::SafeBuffer.new("\n\r<p>hello</p>\r\n"))
220
+ assert_equal "\\n\\n<p>hello<\\/p>\\n", js_escape_html(SafeBuffer.new("\n\r<p>hello</p>\r\n"))
221
221
  end
222
222
  it 'should escape data-confirm attribute' do
223
223
  assert_equal "<data-confirm=\\\"are you sure\\\">", js_escape_html("<data-confirm=\"are you sure\">")
224
- assert_equal "<data-confirm=\\\"are you sure\\\">", js_escape_html(ActiveSupport::SafeBuffer.new("<data-confirm=\"are you sure\">"))
224
+ assert_equal "<data-confirm=\\\"are you sure\\\">", js_escape_html(SafeBuffer.new("<data-confirm=\"are you sure\">"))
225
225
  end
226
226
  it 'should keep html_safe content html_safe' do
227
227
  assert_equal false, js_escape_html('"hello"').html_safe?
228
- assert_equal true, js_escape_html(ActiveSupport::SafeBuffer.new('"hello"')).html_safe?
228
+ assert_equal true, js_escape_html(SafeBuffer.new('"hello"')).html_safe?
229
229
  end
230
230
  end
231
231
  end
@@ -253,5 +253,15 @@ describe "RenderHelpers" do
253
253
  end
254
254
  assert_equal 'existing', Standalone3.new.partial('none')
255
255
  end
256
+
257
+ it 'should not add "./" to partial template name' do
258
+ class Standalone4
259
+ def render(_, file, *)
260
+ file.to_s
261
+ end
262
+ include Padrino::Helpers::RenderHelpers
263
+ end
264
+ assert_equal '_none', Standalone4.new.partial('none')
265
+ end
256
266
  end
257
267
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: padrino-helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.3
4
+ version: 0.13.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Padrino Team
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2016-08-17 00:00:00.000000000 Z
14
+ date: 2016-08-30 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: padrino-support
@@ -19,14 +19,14 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.13.3
22
+ version: 0.13.3.1
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.13.3
29
+ version: 0.13.3.1
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: tilt
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -120,11 +120,13 @@ files:
120
120
  - lib/padrino-helpers/render_helpers.rb
121
121
  - lib/padrino-helpers/tag_helpers.rb
122
122
  - lib/padrino-helpers/translation_helpers.rb
123
+ - lib/padrino/core_ext/output_safety.rb
123
124
  - lib/padrino/rendering.rb
124
125
  - lib/padrino/rendering/erb_template.rb
125
126
  - lib/padrino/rendering/erubis_template.rb
126
127
  - lib/padrino/rendering/haml_template.rb
127
128
  - lib/padrino/rendering/slim_template.rb
129
+ - lib/padrino/safe_buffer.rb
128
130
  - padrino-helpers.gemspec
129
131
  - test/fixtures/apps/.components
130
132
  - test/fixtures/apps/.gitignore
@@ -245,7 +247,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
247
  version: 1.3.6
246
248
  requirements: []
247
249
  rubyforge_project: padrino-helpers
248
- rubygems_version: 2.6.4
250
+ rubygems_version: 2.5.1
249
251
  signing_key:
250
252
  specification_version: 4
251
253
  summary: Helpers for padrino