This file is indexed.

/usr/lib/ruby/1.8/ramaze/helper/formatting.rb is in libramaze-ruby1.8 2010.06.18-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 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
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#          Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
# All files in this distribution are subject to the terms of the Ruby license.

module Ramaze
  module Helper::Formatting
    module_function

    FORMATTING_NUMBER_COUNTER = { 0 => 'no', 2 => 'two', 3 => 'three',
      4 => 'four', 5 => 'five', 6 => 'six', 7 => 'seven', 8 => 'eight',
      9 => 'nine', 10 => 'ten' }

    # Answers with a representation of given +count+ with correct grammar.
    # If no +items+ argument is given, and the +count+ argument is not 1, then
    # we first check whether the +item+ argument responds to #pluralize (for
    # example if you are using Sequel). If this doesn't work we append 's' to
    # the +item+ argument.
    #
    # @example usage
    #   number_counter(0, 'comment') # => 'no comments'
    #   number_counter(1, 'comment') # => 'one comment'
    #   number_counter(2, 'comment') # => '2 comments'

    def number_counter(count, item, items = nil)
      count, item = count.to_i, item.to_s

      if count == 1
        "one #{item}"
      else
        items ||= item.respond_to?(:pluralize) ? item.pluralize : "#{item}s"
        prefix = FORMATTING_NUMBER_COUNTER[count] || count
        "#{prefix} #{items}"
      end
    end

    # 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'

    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

    # 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"

    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

    # stolen and adapted from rails
    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

    # Copied from actionpack, and revised by insane-dreamer to fix a bug (original fails on some URLs)
    AUTO_LINK_RE = %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:]]|<|$|)         # trailing text
    }x unless defined? AUTO_LINK_RE

    # Turns all urls into clickable links.  If a block is given, each url
    # is yielded and the result is used as the link text.
    def auto_link(text, opts = {})
      html_options = ' ' + 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}"#{html_options}>#{text}</a>#{d})
        end
      end
    end
    alias autolink auto_link

    # takes a string and optional argument for outputting compliance HTML
    # instead of XHTML.
    # e.g nl2br "a\nb\n\c" #=> 'a<br />b<br />c'

    def nl2br(string, xhtml = true)
      br = xhtml ? '<br />' : '<br>'
      string.gsub(/\n/, br)
    end

    # Maybe port to ruby < 1.8.7 ?
    def obfuscate_email(email, text = nil)
      obfuscated = []
      email.to_s.each_byte{|c| obfuscated << "&#%03d" % c }
      joined = obfuscated.join

      %(<a href="mailto:#{joined}">#{text || joined}</a>)
    end

    # Returns Hash with tags as keys and their weight as value.
    #
    # Example:
    #     tags = %w[ruby ruby code ramaze]
    #     tagcloud(tags)
    #     # => {"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)

    def tagcloud(tags, min = 0.5, max = 1.5)
      result = {}
      total = tags.size.to_f
      diff = max - min

      tags.uniq.each do |tag|
        count = tags.respond_to?(:count) ? tags.count(tag) : tags.select{|t| t==tag }.size
        result[tag] = ((count / total) * diff) + min
      end

      result
    end
  end
end