padrino-helpers 0.11.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/padrino-helpers/asset_tag_helpers.rb +5 -5
- data/lib/padrino-helpers/breadcrumb_helpers.rb +2 -2
- data/lib/padrino-helpers/form_helpers.rb +3 -2
- data/lib/padrino-helpers/format_helpers.rb +8 -5
- data/lib/padrino-helpers/locale/zh_cn.yml +13 -14
- data/lib/padrino-helpers/output_helpers.rb +3 -3
- data/lib/padrino-helpers/output_helpers/erb_handler.rb +2 -2
- data/lib/padrino-helpers/output_helpers/slim_handler.rb +2 -2
- data/test/fixtures/render_app/app.rb +4 -0
- data/test/fixtures/render_app/views/double_capture_erb.erb +3 -0
- data/test/fixtures/render_app/views/double_capture_haml.haml +2 -0
- data/test/fixtures/render_app/views/double_capture_slim.slim +2 -0
- data/test/test_asset_tag_helpers.rb +7 -1
- data/test/test_format_helpers.rb +10 -0
- data/test/test_render_helpers.rb +18 -0
- metadata +24 -9
- checksums.yaml +0 -7
@@ -5,8 +5,8 @@ module Padrino
|
|
5
5
|
#
|
6
6
|
module AssetTagHelpers
|
7
7
|
FRAGMENT_HASH = "#".html_safe.freeze
|
8
|
-
|
9
|
-
|
8
|
+
APPEND_ASSET_EXTENSIONS = ["js", "css"] # assets that require an appended extension
|
9
|
+
ABSOLUTE_URL_PATTERN = %r{^(https?://)} # absolute url regex
|
10
10
|
|
11
11
|
##
|
12
12
|
# Creates a div to display the flash of given type if it exists
|
@@ -32,7 +32,7 @@ module Padrino
|
|
32
32
|
bootstrap = options.delete(:bootstrap) if options[:bootstrap]
|
33
33
|
args.inject(''.html_safe) do |html,kind|
|
34
34
|
flash_text = flash[kind]
|
35
|
-
next if flash_text.blank?
|
35
|
+
next html if flash_text.blank?
|
36
36
|
flash_text << safe_content_tag(:button, "×", {:type => :button, :class => :close, :'data-dismiss' => :alert}) if bootstrap
|
37
37
|
html << safe_content_tag(:div, flash_text, options.reverse_merge(:class => kind))
|
38
38
|
end
|
@@ -323,7 +323,7 @@ module Padrino
|
|
323
323
|
# @api semipublic
|
324
324
|
def asset_path(kind, source)
|
325
325
|
source = asset_normalize_extension(kind, URI.escape(source.to_s))
|
326
|
-
return source if source =~
|
326
|
+
return source if source =~ ABSOLUTE_URL_PATTERN || source =~ /^\// # absolute source
|
327
327
|
source = File.join(asset_folder_name(kind), source)
|
328
328
|
timestamp = asset_timestamp(source)
|
329
329
|
result_path = uri_root_path(source)
|
@@ -384,7 +384,7 @@ module Padrino
|
|
384
384
|
#
|
385
385
|
def asset_normalize_extension(kind, source)
|
386
386
|
ignore_extension = !APPEND_ASSET_EXTENSIONS.include?(kind.to_s)
|
387
|
-
source << ".#{kind}" unless ignore_extension
|
387
|
+
source << ".#{kind}" unless ignore_extension || source =~ /\.#{kind}/ || source =~ ABSOLUTE_URL_PATTERN
|
388
388
|
source
|
389
389
|
end
|
390
390
|
|
@@ -37,7 +37,7 @@ module Padrino
|
|
37
37
|
#
|
38
38
|
# @api public
|
39
39
|
def set_home(url, caption)
|
40
|
-
self.home = { :url => url, :caption => caption.to_s.humanize, :name => :home }
|
40
|
+
self.home = { :url => url, :caption => caption.to_s.humanize.html_safe, :name => :home }
|
41
41
|
reset
|
42
42
|
end
|
43
43
|
|
@@ -85,7 +85,7 @@ module Padrino
|
|
85
85
|
#
|
86
86
|
# @api public
|
87
87
|
def add(name, url, caption)
|
88
|
-
items << { :name => name, :url => url.to_s, :caption => caption.to_s.humanize }
|
88
|
+
items << { :name => name, :url => url.to_s, :caption => caption.to_s.humanize.html_safe }
|
89
89
|
end
|
90
90
|
|
91
91
|
alias :<< :add
|
@@ -31,7 +31,8 @@ module Padrino
|
|
31
31
|
# @api public
|
32
32
|
def form_for(object, url, settings={}, &block)
|
33
33
|
instance = builder_instance(object, settings)
|
34
|
-
|
34
|
+
html = capture_html(instance, &block)
|
35
|
+
form_tag(url, settings) { html }
|
35
36
|
end
|
36
37
|
|
37
38
|
##
|
@@ -170,7 +171,7 @@ module Padrino
|
|
170
171
|
objects = objects.map { |object_name|
|
171
172
|
object_name.is_a?(Symbol) ? instance_variable_get("@#{object_name}") : object_name
|
172
173
|
}.compact
|
173
|
-
count = objects.inject(0) { |sum, object| sum + object.errors.
|
174
|
+
count = objects.inject(0) { |sum, object| sum + object.errors.count }
|
174
175
|
|
175
176
|
unless count.zero?
|
176
177
|
html = {}
|
@@ -19,7 +19,7 @@ module Padrino
|
|
19
19
|
#
|
20
20
|
# @api public
|
21
21
|
def escape_html(text)
|
22
|
-
Rack::Utils.escape_html(text)
|
22
|
+
Rack::Utils.escape_html(text).html_safe
|
23
23
|
end
|
24
24
|
alias h escape_html
|
25
25
|
alias sanitize_html escape_html
|
@@ -41,8 +41,8 @@ module Padrino
|
|
41
41
|
#
|
42
42
|
# @api public
|
43
43
|
def h!(text, blank_text = ' ')
|
44
|
-
return blank_text if text.nil? || text.empty?
|
45
|
-
h
|
44
|
+
return blank_text.html_safe if text.nil? || text.empty?
|
45
|
+
h(text)
|
46
46
|
end
|
47
47
|
|
48
48
|
##
|
@@ -83,12 +83,13 @@ module Padrino
|
|
83
83
|
def simple_format(text, options={})
|
84
84
|
t = options.delete(:tag) || :p
|
85
85
|
start_tag = tag(t, options, true)
|
86
|
-
text = text.to_s.dup
|
86
|
+
text = escape_html(text.to_s.dup)
|
87
87
|
text.gsub!(/\r\n?/, "\n") # \r\n and \r -> \n
|
88
88
|
text.gsub!(/\n\n+/, "</#{t}>\n\n#{start_tag}") # 2+ newline -> paragraph
|
89
89
|
text.gsub!(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
|
90
90
|
text.insert 0, start_tag
|
91
91
|
text << "</#{t}>"
|
92
|
+
text.html_safe
|
92
93
|
end
|
93
94
|
|
94
95
|
##
|
@@ -374,7 +375,9 @@ module Padrino
|
|
374
375
|
def js_escape_html(html_content)
|
375
376
|
return '' unless html_content
|
376
377
|
javascript_mapping = { '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', "'" => "\\'" }
|
377
|
-
html_content.gsub(/(\\|<\/|\r\n|[\n\r"'])/){|m| javascript_mapping[m]}
|
378
|
+
escaped_content = html_content.gsub(/(\\|<\/|\r\n|[\n\r"'])/){ |m| javascript_mapping[m] }
|
379
|
+
escaped_content = escaped_content.html_safe if html_content.html_safe?
|
380
|
+
escaped_content
|
378
381
|
end
|
379
382
|
alias :escape_javascript :js_escape_html
|
380
383
|
end # FormatHelpers
|
@@ -14,8 +14,8 @@ zh_cn:
|
|
14
14
|
currency:
|
15
15
|
format:
|
16
16
|
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
|
17
|
-
format: "%u
|
18
|
-
unit: "
|
17
|
+
format: "%u%n"
|
18
|
+
unit: "RMB"
|
19
19
|
# These three are to override number.format and are optional
|
20
20
|
separator: "."
|
21
21
|
delimiter: ","
|
@@ -50,12 +50,12 @@ zh_cn:
|
|
50
50
|
format: "%n %u"
|
51
51
|
units:
|
52
52
|
byte:
|
53
|
-
one: "
|
54
|
-
other: "
|
55
|
-
kb: "
|
56
|
-
mb: "
|
57
|
-
gb: "
|
58
|
-
tb: "
|
53
|
+
one: "字节"
|
54
|
+
other: "字节"
|
55
|
+
kb: "K"
|
56
|
+
mb: "兆"
|
57
|
+
gb: "G"
|
58
|
+
tb: "T"
|
59
59
|
|
60
60
|
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
|
61
61
|
datetime:
|
@@ -92,13 +92,12 @@ zh_cn:
|
|
92
92
|
one: "一年多"
|
93
93
|
other: "%{count} 年多"
|
94
94
|
almost_x_years:
|
95
|
-
one: "
|
96
|
-
other: "
|
95
|
+
one: "已经一年"
|
96
|
+
other: "已经 %{count} 年"
|
97
97
|
models:
|
98
98
|
errors:
|
99
99
|
template:
|
100
100
|
header:
|
101
|
-
one:
|
102
|
-
other:
|
103
|
-
body: "
|
104
|
-
|
101
|
+
one: "%{model} 保存时产生错误"
|
102
|
+
other: "%{model} 保存时产生了 %{count} 个错误"
|
103
|
+
body: "下列字段产生错误:"
|
@@ -48,12 +48,12 @@ module Padrino
|
|
48
48
|
# @api semipublic
|
49
49
|
def capture_html(*args, &block)
|
50
50
|
handler = find_proper_handler
|
51
|
-
captured_html = ""
|
51
|
+
captured_block, captured_html = nil, ""
|
52
52
|
if handler && handler.is_type? && handler.block_is_type?(block)
|
53
|
-
captured_html = handler.capture_from_template(*args, &block)
|
53
|
+
captured_html, captured_block = handler.capture_from_template(*args, &block)
|
54
54
|
end
|
55
55
|
# invoking the block directly if there was no template
|
56
|
-
captured_html = block_given? && block.call(*args) if captured_html.blank?
|
56
|
+
captured_html = block_given? && ( captured_block || block.call(*args) ) if captured_html.blank?
|
57
57
|
captured_html
|
58
58
|
end
|
59
59
|
alias :capture :capture_html
|
@@ -29,10 +29,10 @@ module Padrino
|
|
29
29
|
#
|
30
30
|
def capture_from_template(*args, &block)
|
31
31
|
self.output_buffer, _buf_was = ActiveSupport::SafeBuffer.new, self.output_buffer
|
32
|
-
block.call(*args)
|
32
|
+
captured_block = block.call(*args)
|
33
33
|
ret = eval("@_out_buf", block.binding)
|
34
34
|
self.output_buffer = _buf_was
|
35
|
-
ret
|
35
|
+
[ ret, captured_block ]
|
36
36
|
end
|
37
37
|
|
38
38
|
##
|
@@ -31,10 +31,10 @@ module Padrino
|
|
31
31
|
#
|
32
32
|
def capture_from_template(*args, &block)
|
33
33
|
self.output_buffer, _buf_was = ActiveSupport::SafeBuffer.new, self.output_buffer
|
34
|
-
block.call(*args)
|
34
|
+
captured_block = block.call(*args)
|
35
35
|
ret = eval("@_out_buf", block.binding)
|
36
36
|
self.output_buffer = _buf_was
|
37
|
-
ret
|
37
|
+
[ ret, captured_block ]
|
38
38
|
end
|
39
39
|
|
40
40
|
##
|
@@ -31,6 +31,10 @@ class RenderDemo < Padrino::Application
|
|
31
31
|
render :explicit_engine
|
32
32
|
end
|
33
33
|
|
34
|
+
get '/double_capture_:ext' do
|
35
|
+
render "double_capture_#{params[:ext]}"
|
36
|
+
end
|
37
|
+
|
34
38
|
# partial with object
|
35
39
|
get '/partial/object' do
|
36
40
|
partial 'template/user', :object => RenderUser.new('John'), :locals => { :extra => "bar" }
|
@@ -23,7 +23,7 @@ describe "AssetTagHelpers" do
|
|
23
23
|
should "display multiple flash tags with given attributes" do
|
24
24
|
flash[:error] = 'wrong'
|
25
25
|
flash[:success] = 'okey'
|
26
|
-
actual_html = flash_tag(:success, :error, :id => 'area')
|
26
|
+
actual_html = flash_tag(:success, :warning, :error, :id => 'area')
|
27
27
|
assert_has_tag('div.success#area', :content => flash[:success]) { actual_html }
|
28
28
|
assert_has_tag('div.error#area', :content => flash[:error]) { actual_html }
|
29
29
|
assert_has_no_tag('div.notice') { actual_html }
|
@@ -294,6 +294,12 @@ describe "AssetTagHelpers" do
|
|
294
294
|
assert_has_tag('script', :src => "/blog/javascripts/application.js?#{time.to_i}", :type => "text/javascript") { actual_html }
|
295
295
|
end
|
296
296
|
|
297
|
+
should "not append extension to absolute paths" do
|
298
|
+
time = stop_time_for_test
|
299
|
+
actual_html = javascript_include_tag('https://maps.googleapis.com/maps/api/js?key=value&sensor=false')
|
300
|
+
assert_has_tag('script', :src => "https://maps.googleapis.com/maps/api/js?key=value&sensor=false") { actual_html }
|
301
|
+
end
|
302
|
+
|
297
303
|
should "display javascript items" do
|
298
304
|
time = stop_time_for_test
|
299
305
|
actual_html = javascript_include_tag('application', 'base.js', 'http://google.com/lib.js')
|
data/test/test_format_helpers.rb
CHANGED
@@ -15,6 +15,7 @@ describe "FormatHelpers" do
|
|
15
15
|
context 'for #simple_format method' do
|
16
16
|
should "format simple text into html format" do
|
17
17
|
actual_text = simple_format("Here is some basic text...\n...with a line break.")
|
18
|
+
assert_equal true, actual_text.html_safe?
|
18
19
|
assert_equal "<p>Here is some basic text...\n<br />...with a line break.</p>", actual_text
|
19
20
|
end
|
20
21
|
|
@@ -139,6 +140,11 @@ describe "FormatHelpers" do
|
|
139
140
|
should "return text escaped if not empty" do
|
140
141
|
assert_equal '<h1>hello</h1>', h!('<h1>hello</h1>')
|
141
142
|
end
|
143
|
+
should "mark escaped text as safe" do
|
144
|
+
assert_equal false, '<h1>hello</h1>'.html_safe?
|
145
|
+
assert_equal true, h('<h1>hello</h1>').html_safe?
|
146
|
+
assert_equal true, h!("", "default").html_safe?
|
147
|
+
end
|
142
148
|
end
|
143
149
|
|
144
150
|
context 'for #time_ago_in_words method' do
|
@@ -227,5 +233,9 @@ describe "FormatHelpers" do
|
|
227
233
|
assert_equal "<data-confirm=\\\"are you sure\\\">", js_escape_html("<data-confirm=\"are you sure\">")
|
228
234
|
assert_equal "<data-confirm=\\\"are you sure\\\">", js_escape_html(ActiveSupport::SafeBuffer.new("<data-confirm=\"are you sure\">"))
|
229
235
|
end
|
236
|
+
should "keep html_safe content html_safe" do
|
237
|
+
assert_equal false, js_escape_html('"hello"').html_safe?
|
238
|
+
assert_equal true, js_escape_html(ActiveSupport::SafeBuffer.new('"hello"')).html_safe?
|
239
|
+
end
|
230
240
|
end
|
231
241
|
end
|
data/test/test_render_helpers.rb
CHANGED
@@ -72,5 +72,23 @@ describe "RenderHelpers" do
|
|
72
72
|
assert_have_selector 'p.slim span', :content => "slim"
|
73
73
|
assert_have_selector 'p.end', :content => "haml"
|
74
74
|
end
|
75
|
+
|
76
|
+
should "capture slim template once and only once" do
|
77
|
+
$number_of_captures = 0
|
78
|
+
visit '/double_capture_slim'
|
79
|
+
assert_equal 1,$number_of_captures
|
80
|
+
end
|
81
|
+
|
82
|
+
should "capture haml template once and only once" do
|
83
|
+
$number_of_captures = 0
|
84
|
+
visit '/double_capture_haml'
|
85
|
+
assert_equal 1,$number_of_captures
|
86
|
+
end
|
87
|
+
|
88
|
+
should "capture erb template once and only once" do
|
89
|
+
$number_of_captures = 0
|
90
|
+
visit '/double_capture_erb'
|
91
|
+
assert_equal 1,$number_of_captures
|
92
|
+
end
|
75
93
|
end
|
76
94
|
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: padrino-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Padrino Team
|
@@ -11,25 +12,28 @@ authors:
|
|
11
12
|
autorequire:
|
12
13
|
bindir: bin
|
13
14
|
cert_chain: []
|
14
|
-
date: 2013-
|
15
|
+
date: 2013-04-07 00:00:00.000000000 Z
|
15
16
|
dependencies:
|
16
17
|
- !ruby/object:Gem::Dependency
|
17
18
|
name: padrino-core
|
18
19
|
requirement: !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
19
21
|
requirements:
|
20
22
|
- - '='
|
21
23
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.11.
|
24
|
+
version: 0.11.1
|
23
25
|
type: :runtime
|
24
26
|
prerelease: false
|
25
27
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
26
29
|
requirements:
|
27
30
|
- - '='
|
28
31
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.11.
|
32
|
+
version: 0.11.1
|
30
33
|
- !ruby/object:Gem::Dependency
|
31
34
|
name: i18n
|
32
35
|
requirement: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
33
37
|
requirements:
|
34
38
|
- - ~>
|
35
39
|
- !ruby/object:Gem::Version
|
@@ -37,6 +41,7 @@ dependencies:
|
|
37
41
|
type: :runtime
|
38
42
|
prerelease: false
|
39
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
40
45
|
requirements:
|
41
46
|
- - ~>
|
42
47
|
- !ruby/object:Gem::Version
|
@@ -135,6 +140,9 @@ files:
|
|
135
140
|
- test/fixtures/render_app/views/current_engines/_erb.erb
|
136
141
|
- test/fixtures/render_app/views/current_engines/_haml.haml
|
137
142
|
- test/fixtures/render_app/views/current_engines/_slim.slim
|
143
|
+
- test/fixtures/render_app/views/double_capture_erb.erb
|
144
|
+
- test/fixtures/render_app/views/double_capture_haml.haml
|
145
|
+
- test/fixtures/render_app/views/double_capture_slim.slim
|
138
146
|
- test/fixtures/render_app/views/erb/test.erb
|
139
147
|
- test/fixtures/render_app/views/explicit_engine.haml
|
140
148
|
- test/fixtures/render_app/views/haml/test.haml
|
@@ -153,27 +161,31 @@ files:
|
|
153
161
|
- test/test_tag_helpers.rb
|
154
162
|
homepage: http://www.padrinorb.com
|
155
163
|
licenses: []
|
156
|
-
metadata: {}
|
157
164
|
post_install_message:
|
158
165
|
rdoc_options:
|
159
166
|
- --charset=UTF-8
|
160
167
|
require_paths:
|
161
168
|
- lib
|
162
169
|
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
163
171
|
requirements:
|
164
|
-
- - '>='
|
172
|
+
- - ! '>='
|
165
173
|
- !ruby/object:Gem::Version
|
166
174
|
version: '0'
|
175
|
+
segments:
|
176
|
+
- 0
|
177
|
+
hash: 3249284005023139295
|
167
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
168
180
|
requirements:
|
169
|
-
- - '>='
|
181
|
+
- - ! '>='
|
170
182
|
- !ruby/object:Gem::Version
|
171
183
|
version: 1.3.6
|
172
184
|
requirements: []
|
173
185
|
rubyforge_project: padrino-helpers
|
174
|
-
rubygems_version:
|
186
|
+
rubygems_version: 1.8.25
|
175
187
|
signing_key:
|
176
|
-
specification_version:
|
188
|
+
specification_version: 3
|
177
189
|
summary: Helpers for padrino
|
178
190
|
test_files:
|
179
191
|
- test/fixtures/markup_app/app.rb
|
@@ -218,6 +230,9 @@ test_files:
|
|
218
230
|
- test/fixtures/render_app/views/current_engines/_erb.erb
|
219
231
|
- test/fixtures/render_app/views/current_engines/_haml.haml
|
220
232
|
- test/fixtures/render_app/views/current_engines/_slim.slim
|
233
|
+
- test/fixtures/render_app/views/double_capture_erb.erb
|
234
|
+
- test/fixtures/render_app/views/double_capture_haml.haml
|
235
|
+
- test/fixtures/render_app/views/double_capture_slim.slim
|
221
236
|
- test/fixtures/render_app/views/erb/test.erb
|
222
237
|
- test/fixtures/render_app/views/explicit_engine.haml
|
223
238
|
- test/fixtures/render_app/views/haml/test.haml
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: f362f51264ab447da505f5bbaeb295b467cff819
|
4
|
-
data.tar.gz: c0a4370011a89876d15d3668a82e3451e5b9b6cb
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: c3b645ff7c6bbdafc844465cb6f78fcdea389ee27ccff8b6dabd2f7eb352ebb1f256f0cea9c67914a6d56ba74609c678a2703b7b7451558c73ef1822877a511f
|
7
|
-
data.tar.gz: fafd39ce16c2639cbde4537a6b6530b2580e1c59ae9c397298dd16d8416bc9a241e7eeff8c4a91f4548609f64339162ec28ad597398a1c6a93839f11c6706652
|