padrino-helpers 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -389,8 +389,30 @@ passing javascript information from a js template to a javascript function.
389
389
 
390
390
  There is also an alias for escape_html called <tt>h</tt> for even easier usage within templates.
391
391
 
392
+ Format helpers also includes a number of useful text manipulation functions such as <tt>simple_format</tt>,
393
+ <tt>pluralize</tt>, <tt>word_wrap</tt>, and <tt>truncate</tt>.
394
+
395
+ simple_format("hello\nworld") # => "<p>hello<br/>world</p>"
396
+ pluralize(2, 'person') => '2 people'
397
+ word_wrap('Once upon a time', :line_width => 8) => "Once upon\na time"
398
+ truncate("Once upon a time in a world far far away", :length => 8) => "Once upon..."
399
+
400
+ These helpers can be invoked from any route or view within your application.
401
+
392
402
  The list of defined helpers in the 'format helpers' category:
393
403
 
404
+ * <tt>simple_format(text, html_options)</tt>
405
+ * Returns text transformed into HTML using simple formatting rules.
406
+ * <tt>simple_format("hello\nworld")</tt> => "<p>hello<br/>world</p>"
407
+ * <tt>pluralize(count, singular, plural = nil)</tt>
408
+ * Attempts to pluralize the singular word unless count is 1.
409
+ * <tt>pluralize(2, 'person')</tt> => '2 people'
410
+ * <tt>word_wrap(text, *args)</tt>
411
+ * Wraps the text into lines no longer than line_width width.
412
+ * <tt>word_wrap('Once upon a time', :line_width => 8)</tt> => "Once upon\na time"
413
+ * <tt>truncate(text, *args)</tt>
414
+ * Truncates a given text after a given :length if text is longer than :length (defaults to 30).
415
+ * <tt>truncate("Once upon a time in a world far far away", :length => 8)</tt> => "Once upon..."
394
416
  * <tt>escape_html</tt> (alias <tt>h</tt> and <tt>h!</tt>)
395
417
  * (from RackUtils) Escape ampersands, brackets and quotes to their HTML/XML entities.
396
418
  * <tt>relative_time_ago(date)</tt>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -84,8 +84,9 @@ module Padrino
84
84
  def javascript_path(source)
85
85
  return source if source =~ /^http/
86
86
  source.gsub!(/\.js$/, '')
87
- result_path = "#{source}.js" if source =~ %r{^/} # absolute path
88
- result_path ||= uri_root_path("javascripts", "#{source}.js")
87
+ source_name = source; source_name << ".js" unless source =~ /\.js\w{2,4}$/
88
+ result_path = source_name if source =~ %r{^/} # absolute path
89
+ result_path ||= uri_root_path("javascripts", source_name)
89
90
  stamp = File.exist?(result_path) ? File.mtime(result_path) : Time.now.to_i
90
91
  "#{result_path}?#{stamp}"
91
92
  end
@@ -94,8 +95,9 @@ module Padrino
94
95
  def stylesheet_path(source)
95
96
  return source if source =~ /^http/
96
97
  source.gsub!(/\.css$/, '')
97
- result_path = "#{source}.css" if source =~ %r{^/} # absolute path
98
- result_path ||= uri_root_path("stylesheets", "#{source}.css")
98
+ source_name = source; source_name << ".css" unless source =~ /\.css$/
99
+ result_path = source_name if source =~ %r{^/} # absolute path
100
+ result_path ||= uri_root_path("stylesheets", source_name)
99
101
  stamp = File.exist?(result_path) ? File.mtime(result_path) : Time.now.to_i
100
102
  "#{result_path}?#{stamp}"
101
103
  end
@@ -16,6 +16,54 @@ module Padrino
16
16
  h text
17
17
  end
18
18
 
19
+ # Returns text transformed into HTML using simple formatting rules. Two or more consecutive newlines(\n\n) are considered
20
+ # as a paragraph and wrapped in <p> tags. One newline (\n) is considered as a linebreak and a <br /> tag is appended.
21
+ # This method does not remove the newlines from the text.
22
+ # simple_format("hello\nworld") # => "<p>hello<br/>world</p>"
23
+ def simple_format(text, html_options={})
24
+ start_tag = tag('p', html_options.merge(:open => true))
25
+ text = text.to_s.dup
26
+ text.gsub!(/\r\n?/, "\n") # \r\n and \r -> \n
27
+ text.gsub!(/\n\n+/, "</p>\n\n#{start_tag}") # 2+ newline -> paragraph
28
+ text.gsub!(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
29
+ text.insert 0, start_tag
30
+ text << "</p>"
31
+ end
32
+
33
+ # Attempts to pluralize the singular word unless count is 1. If plural is supplied, it will use that when count is > 1,
34
+ # otherwise it will use the Inflector to determine the plural form
35
+ # pluralize(2, 'person') => '2 people'
36
+ def pluralize(count, singular, plural = nil)
37
+ "#{count || 0} " + ((count == 1 || count == '1') ? singular : (plural || singular.pluralize))
38
+ end
39
+
40
+ # Truncates a given text after a given :length if text is longer than :length (defaults to 30).
41
+ # The last characters will be replaced with the :omission (defaults to "…") for a total length not exceeding :length.
42
+ # truncate("Once upon a time in a world far far away", :length => 8) => "Once upon..."
43
+ def truncate(text, *args)
44
+ options = args.extract_options!
45
+ options.reverse_merge!(:length => 30, :omission => "...")
46
+ if text
47
+ len = options[:length] - options[:omission].length
48
+ chars = text
49
+ (chars.length > options[:length] ? chars[0...len] + options[:omission] : text).to_s
50
+ end
51
+ end
52
+
53
+ # Wraps the text into lines no longer than line_width width.
54
+ # This method breaks on the first whitespace character that does not exceed line_width (which is 80 by default).
55
+ # word_wrap('Once upon a time', :line_width => 8) => "Once upon\na time"
56
+ def word_wrap(text, *args)
57
+ options = args.extract_options!
58
+ unless args.blank?
59
+ options[:line_width] = args[0] || 80
60
+ end
61
+ options.reverse_merge!(:line_width => 80)
62
+
63
+ text.split("\n").collect do |line|
64
+ line.length > options[:line_width] ? line.gsub(/(.{1,#{options[:line_width]}})(\s+|$)/, "\\1\n").strip : line
65
+ end * "\n"
66
+ end
19
67
 
20
68
  # Smart time helper which returns relative text representing times for recent dates
21
69
  # and absolutes for dates that are far removed from the current date
@@ -24,11 +24,11 @@ module Padrino
24
24
  # tag(:br, :style => 'clear:both')
25
25
  # tag(:p, :content => "hello", :class => 'large')
26
26
  def tag(name, options={})
27
- content = options.delete(:content)
27
+ content, open_tag = options.delete(:content), options.delete(:open)
28
28
  identity_tag_attributes.each { |attr| options[attr] = attr.to_s if options[attr] }
29
29
  html_attrs = options.collect { |a, v| v.blank? ? nil : "#{a}=\"#{v}\"" }.compact.join(" ")
30
30
  base_tag = (html_attrs.present? ? "<#{name} #{html_attrs}" : "<#{name}")
31
- base_tag << (content ? ">#{content}</#{name}>" : " />")
31
+ base_tag << (open_tag ? ">" : (content ? ">#{content}</#{name}>" : " />"))
32
32
  end
33
33
 
34
34
  protected
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{padrino-helpers}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
12
- s.date = %q{2009-11-23}
12
+ s.date = %q{2009-11-30}
13
13
  s.description = %q{Tag helpers, asset helpers, form helpers, form builders and many more helpers for padrino}
14
14
  s.email = %q{nesquena@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -147,6 +147,16 @@ class TestAssetTagHelpers < Test::Unit::TestCase
147
147
  actual_html = javascript_include_tag('example/demo/application')
148
148
  assert_has_tag('script', :src => "/javascripts/example/demo/application.js?#{time.to_i}", :type => "text/javascript") { actual_html }
149
149
  end
150
+ should "display javascript item for path containing js" do
151
+ time = stop_time_for_test
152
+ actual_html = javascript_include_tag 'test/jquery.json'
153
+ assert_has_tag('script', :src => "/javascripts/test/jquery.json?#{time.to_i}", :type => "text/javascript") { actual_html }
154
+ end
155
+ should "display javascript item for path containing period" do
156
+ time = stop_time_for_test
157
+ actual_html = javascript_include_tag 'test/jquery.min'
158
+ assert_has_tag('script', :src => "/javascripts/test/jquery.min.js?#{time.to_i}", :type => "text/javascript") { actual_html }
159
+ end
150
160
  should "display javascript item with absolute path" do
151
161
  time = stop_time_for_test
152
162
  actual_html = javascript_include_tag('/js/application')
@@ -8,6 +8,68 @@ class TestFormatHelpers < Test::Unit::TestCase
8
8
 
9
9
  include Padrino::Helpers::FormatHelpers
10
10
 
11
+ context 'for #simple_format method' do
12
+ should "format simple text into html format" do
13
+ actual_text = simple_format("Here is some basic text...\n...with a line break.")
14
+ assert_equal "<p>Here is some basic text...\n<br />...with a line break.</p>", actual_text
15
+ end
16
+
17
+ should "format more text into html format" do
18
+ actual_text = simple_format("We want to put a paragraph...\n\n...right there.")
19
+ assert_equal "<p>We want to put a paragraph...</p>\n\n<p>...right there.</p>", actual_text
20
+ end
21
+
22
+ should "support defining a class for the paragraphs" do
23
+ actual_text = simple_format("Look ma! A class!", :class => 'description')
24
+ assert_equal "<p class=\"description\">Look ma! A class!</p>", actual_text
25
+ end
26
+ end
27
+
28
+ context 'for #pluralize method' do
29
+ should "return singular count for 1 item collections" do
30
+ actual_text = pluralize(1, 'person')
31
+ assert_equal '1 person', actual_text
32
+ end
33
+ should "return plural count for empty collections" do
34
+ actual_text = pluralize(0, 'person')
35
+ assert_equal '0 people', actual_text
36
+ end
37
+ should "return plural count for many collections" do
38
+ actual_text = pluralize(2, 'person')
39
+ assert_equal '2 people', actual_text
40
+ end
41
+ should "return pluralized word specified as argument" do
42
+ actual_text = pluralize(3, 'person', 'users')
43
+ assert_equal '3 users', actual_text
44
+ end
45
+ end
46
+
47
+ context 'for #word_wrap method' do
48
+ should "return proper formatting for 8 max width" do
49
+ actual_text = word_wrap('Once upon a time', :line_width => 8)
50
+ assert_equal "Once\nupon a\ntime", actual_text
51
+ end
52
+ should "return proper formatting for 1 max width" do
53
+ actual_text = word_wrap('Once upon a time', :line_width => 1)
54
+ assert_equal "Once\nupon\na\ntime", actual_text
55
+ end
56
+ end
57
+
58
+ context 'for #truncate method' do
59
+ should "support default truncation" do
60
+ actual_text = truncate("Once upon a time in a world far far away")
61
+ assert_equal "Once upon a time in a world...", actual_text
62
+ end
63
+ should "support specifying length" do
64
+ actual_text = truncate("Once upon a time in a world far far away", :length => 14)
65
+ assert_equal "Once upon a...", actual_text
66
+ end
67
+ should "support specifying omission text" do
68
+ actual_text = truncate("And they found that many people were sleeping better.", :length => 25, :omission => "(clipped)")
69
+ assert_equal "And they found t(clipped)", actual_text
70
+ end
71
+ end
72
+
11
73
  context 'for #h and #h! method' do
12
74
  should "escape the simple html" do
13
75
  assert_equal '&lt;h1&gt;hello&lt;/h1&gt;', h('<h1>hello</h1>')
@@ -25,6 +25,10 @@ class TestTagHelpers < Test::Unit::TestCase
25
25
  actual_html = tag(:p, :content => "Demo", :class => 'large', :id => 'intro')
26
26
  assert_has_tag('p#intro.large', :content => "Demo") { actual_html }
27
27
  end
28
+ should "support open tags" do
29
+ actual_html = tag(:p, :class => 'demo', :open => true)
30
+ assert_equal "<p class=\"demo\">", actual_html
31
+ end
28
32
  end
29
33
 
30
34
  context 'for #content_tag method' do
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.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Padrino Team
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2009-11-23 00:00:00 -08:00
15
+ date: 2009-11-30 00:00:00 -08:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency