This file is indexed.

/usr/lib/ruby/1.8/numerizer/numerizer.rb is in libchronic-ruby 0.2.3-1.

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
require 'strscan'

class Numerizer

  DIRECT_NUMS = [
                  ['eleven', '11'],
                  ['twelve', '12'],
                  ['thirteen', '13'],
                  ['fourteen', '14'],
                  ['fifteen', '15'],
                  ['sixteen', '16'],
                  ['seventeen', '17'],
                  ['eighteen', '18'],
                  ['nineteen', '19'],
                  ['ninteen', '19'], # Common mis-spelling
                  ['zero', '0'],
                  ['one', '1'],
                  ['two', '2'],
                  ['three', '3'],
                  ['four(\W|$)', '4\1'],  # The weird regex is so that it matches four but not fourty
                  ['five', '5'],
                  ['six(\W|$)', '6\1'],
                  ['seven(\W|$)', '7\1'],
                  ['eight(\W|$)', '8\1'],
                  ['nine(\W|$)', '9\1'],
                  ['ten', '10'],
                  ['\ba[\b^$]', '1'] # doesn't make sense for an 'a' at the end to be a 1
                ]

  TEN_PREFIXES = [ ['twenty', 20],
                    ['thirty', 30],
                    ['fourty', 40],
                    ['fifty', 50],
                    ['sixty', 60],
                    ['seventy', 70],
                    ['eighty', 80],
                    ['ninety', 90]
                  ]

  BIG_PREFIXES = [ ['hundred', 100],
                    ['thousand', 1000],
                    ['million', 1_000_000],
                    ['billion', 1_000_000_000],
                    ['trillion', 1_000_000_000_000],
                  ]

class << self
  def numerize(string)
    string = string.dup
  
    # preprocess
    string.gsub!(/ +|([^\d])-([^d])/, '\1 \2') # will mutilate hyphenated-words but shouldn't matter for date extraction
    string.gsub!(/a half/, 'haAlf') # take the 'a' out so it doesn't turn into a 1, save the half for the end

    # easy/direct replacements
  
    DIRECT_NUMS.each do |dn|
      string.gsub!(/#{dn[0]}/i, dn[1])
    end

    # ten, twenty, etc.

    TEN_PREFIXES.each do |tp|
      string.gsub!(/(?:#{tp[0]})( *\d(?=[^\d]|$))*/i) { (tp[1] + $1.to_i).to_s }
    end

    # hundreds, thousands, millions, etc.

    BIG_PREFIXES.each do |bp|
      string.gsub!(/(\d*) *#{bp[0]}/i) { (bp[1] * $1.to_i).to_s}
      andition(string)
      #combine_numbers(string) # Should to be more efficient way to do this
    end

    # fractional addition
    # I'm not combining this with the previous block as using float addition complicates the strings
    # (with extraneous .0's and such )
    string.gsub!(/(\d+)(?: | and |-)*haAlf/i) { ($1.to_f + 0.5).to_s }

    string
  end

private
  def andition(string)
    sc = StringScanner.new(string)
    while(sc.scan_until(/(\d+)( | and )(\d+)(?=[^\w]|$)/i))
      if sc[2] =~ /and/ || sc[1].size > sc[3].size
        string[(sc.pos - sc.matched_size)..(sc.pos-1)] = (sc[1].to_i + sc[3].to_i).to_s
        sc.reset
      end
    end
  end

#  def combine_numbers(string)
#    sc = StringScanner.new(string)
#    while(sc.scan_until(/(\d+)(?: | and |-)(\d+)(?=[^\w]|$)/i))
#      string[(sc.pos - sc.matched_size)..(sc.pos-1)] = (sc[1].to_i + sc[2].to_i).to_s
#      sc.reset
#    end
#  end

end
end