Module: Ramaze::Helper::Formatting
- Defined in:
- lib/ramaze/helper/formatting.rb
Constant Summary collapse
- AUTO_LINK_RE =
copied from actionpack
%r{ ( # leading text <\w+.*?>| # leading HTML tag, or [^=!:'"/]| # leading punctuation, or ^ # beginning of line ) ( (?:https?://)| # protocol spec, or (?:www\.) # www.* ) ( [-\w]+ # subdomain or domain (?:\.[-\w]+)* # remaining subdomains or domain (?::\d+)? # port (?:/(?:(?:[~\w\+@%-]|(?:[,.;:][^\s$]))+)?)* # path (?:\?[\w\+@%&=.;-]+)? # query string (?:\#[\w\-]*)? # trailing anchor ) ([[:punct:]]|\s|<|$) # trailing text }x
Instance Method Summary collapse
-
#auto_link(text, opts = {}) ⇒ Object
(also: #autolink)
Turns all urls into clickable links.
-
#nl2br(string, xhtml = true) ⇒ Object
takes a string and optional argument for outputting compliance HTML instead of XHTML.
-
#number_format(n, delimiter = ',') ⇒ Object
Format a floating number nicely for display.
-
#obfuscate_email(string) ⇒ Object
Maybe port to ruby < 1.8.7 ?.
-
#ordinal(number) ⇒ Object
Answer with the ordinal version of a number.
-
#tagcloud(tags, min = 0.5, max = 1.5) ⇒ Object
Returns Hash with tags as keys and their weight as value.
-
#time_diff(from_time, to_time = Time.now, include_seconds = false) ⇒ Object
stolen and adapted from rails.
Instance Method Details
#auto_link(text, opts = {}) ⇒ Object Also known as: autolink
Turns all urls into clickable links. If a block is given, each url is yielded and the result is used as the link text.
99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/ramaze/helper/formatting.rb', line 99 def auto_link(text, opts = {}) = ' ' + opts.map{|k,v| "#{k}='#{v}'"}.join(' ') if opts.any? text.gsub(AUTO_LINK_RE) do all, a, b, c, d = $&, $1, $2, $3, $4 if a =~ /<a\s/i # don't replace URL's that are already linked all else text = b + c text = yield(text) if block_given? %(#{a}<a href="#{b=="www."?"http://www.":b}#{c}"#{}>#{text}</a>#{d}) end end end |
#nl2br(string, xhtml = true) ⇒ Object
takes a string and optional argument for outputting compliance HTML instead of XHTML. e.g nl2br “anbnc” #=> ‘a<br />b<br />c’
118 119 120 121 |
# File 'lib/ramaze/helper/formatting.rb', line 118 def nl2br(string, xhtml = true) br = xhtml ? '<br />' : '<br>' string.gsub(/\n/, br) end |
#number_format(n, delimiter = ',') ⇒ Object
Format a floating number nicely for display.
Usage:
number_format(123.123) # => '123.123'
number_format(123456.12345) # => '123,456.12345'
number_format(123456.12345, '.') # => '123.456,12345'
14 15 16 17 18 |
# File 'lib/ramaze/helper/formatting.rb', line 14 def number_format(n, delimiter = ',') delim_l, delim_r = delimiter == ',' ? %w[, .] : %w[. ,] h, r = n.to_s.split('.') [h.reverse.scan(/\d{1,3}/).join(delim_l).reverse, r].compact.join(delim_r) end |
#obfuscate_email(string) ⇒ Object
Maybe port to ruby < 1.8.7 ?
124 125 126 127 128 |
# File 'lib/ramaze/helper/formatting.rb', line 124 def obfuscate_email(string) string = string.to_s text = string.each_byte.map{|c| "&#%03d" % c}.join %(<a href="mailto:#{string}">#{text}</a>) end |
#ordinal(number) ⇒ Object
Answer with the ordinal version of a number.
Usage:
ordinal(1) # => "1st"
ordinal(2) # => "2nd"
ordinal(3) # => "3rd"
ordinal(13) # => "13th"
ordinal(33) # => "33rd"
ordinal(100) # => "100th"
ordinal(133) # => "133rd"
31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/ramaze/helper/formatting.rb', line 31 def ordinal(number) number = number.to_i case number % 100 when 11..13; "#{number}th" else case number % 10 when 1; "#{number}st" when 2; "#{number}nd" when 3; "#{number}rd" else "#{number}th" end end end |
#tagcloud(tags, min = 0.5, max = 1.5) ⇒ Object
Returns Hash with tags as keys and their weight as value.
Example:
= %w[ruby ruby code ramaze]
tagcloud()
# => {"code"=>0.75, "ramaze"=>0.75, "ruby"=>1.0}
The weight can be influenced by adjusting the min
and max
parameters, please make sure that max
is larger than min
to get meaningful output.
This is not thought as immediate output to your template but rather to help either implementing your own algorithm or using the result as input for your tagcloud.
Example:
- tagcloud(tags).each do |tag, weight|
- style = "font-size: %0.2fem" % weight
%a{:style => style, :href => Rs(tag)}= h(tag)
149 150 151 152 153 154 155 156 157 158 159 160 |
# File 'lib/ramaze/helper/formatting.rb', line 149 def tagcloud(, min = 0.5, max = 1.5) result = {} total = .size.to_f diff = max - min .uniq.each do |tag| count = .respond_to?(:count) ? .count(tag) : .select{|t| t==tag }.size result[tag] = ((count / total) * diff) + min end result end |
#time_diff(from_time, to_time = Time.now, include_seconds = false) ⇒ Object
stolen and adapted from rails
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/ramaze/helper/formatting.rb', line 47 def time_diff from_time, to_time = Time.now, include_seconds = false distance_in_minutes = (((to_time - from_time).abs)/60).round distance_in_seconds = ((to_time - from_time).abs).round if include_seconds case distance_in_minutes when 0..1 return (distance_in_minutes == 0) ? 'less than a minute' : '1 minute' unless include_seconds case distance_in_seconds when 0..4 then 'less than 5 seconds' when 5..9 then 'less than 10 seconds' when 10..19 then 'less than 20 seconds' when 20..39 then 'half a minute' when 40..59 then 'less than a minute' else '1 minute' end when 2..44 then "#{distance_in_minutes} minutes" when 45..89 then 'about 1 hour' when 90..1439 then "about #{(distance_in_minutes.to_f / 60.0).round} hours" when 1440..2879 then '1 day' when 2880..43199 then "#{(distance_in_minutes / 1440).round} days" when 43200..86399 then 'about 1 month' when 86400..525959 then "#{(distance_in_minutes / 43200).round} months" when 525960..1051919 then 'about 1 year' else "over #{(distance_in_minutes / 525960).round} years" end end |