mirror of
https://github.com/neocities/neocities.git
synced 2025-08-04 08:42:00 +02:00
Fixes for Ruby 2.4 support
This commit is contained in:
parent
d03df1c490
commit
9f73ec61bd
7 changed files with 232 additions and 88 deletions
169
ext/ago.rb
Normal file
169
ext/ago.rb
Normal file
|
@ -0,0 +1,169 @@
|
|||
|
||||
module Ago
|
||||
module VERSION
|
||||
MAJOR = 0
|
||||
MINOR = 1
|
||||
TINY = 5
|
||||
|
||||
class << self
|
||||
def pretty
|
||||
"#{MAJOR}.#{MINOR}.#{TINY}"
|
||||
end
|
||||
alias_method :print, :pretty
|
||||
end
|
||||
end
|
||||
|
||||
Ago::Order = [:year, :month, :week, :day, :hour, :minute, :second]
|
||||
Ago::Units = {
|
||||
:year => {
|
||||
:basic => 60 * 60 * 24 * 365,
|
||||
:gregorian => 86400 * 365.2425,
|
||||
},
|
||||
:month => {
|
||||
:basic => 60 * 60 * 24 * 30,
|
||||
:gregorian => 86400 * 30.436875,
|
||||
},
|
||||
:week => {
|
||||
:basic => 60 * 60 * 24 * 7,
|
||||
:gregorian => 86400 * 7.02389423076923,
|
||||
},
|
||||
:day => {
|
||||
:basic => 60 * 60 * 24
|
||||
},
|
||||
:hour => {
|
||||
:basic => 60 * 60
|
||||
},
|
||||
:minute => {
|
||||
:basic => 60
|
||||
},
|
||||
:second => {
|
||||
:basic => 1
|
||||
}
|
||||
}
|
||||
|
||||
def Ago.calendar_check(calendar)
|
||||
error = ":calendar => value must be either :basic or :gregorian."
|
||||
unless calendar == :basic || calendar == :gregorian
|
||||
raise ArgumentError, error
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
module Ago::TimeAgo
|
||||
# Generate List of valid unit :symbols
|
||||
valids = ""
|
||||
Ago::Order.each do |u|
|
||||
unless u == :second
|
||||
valids += ":#{u.to_s}, "
|
||||
else
|
||||
valids += "and :#{u.to_s}."
|
||||
end
|
||||
end
|
||||
Valids = valids
|
||||
|
||||
def ago_in_words(opts={})
|
||||
# Process options {hash}
|
||||
focus = opts[:focus] ? opts[:focus] : 0
|
||||
start_at = opts[:start_at] ? opts[:start_at] : :year
|
||||
now = opts[:now] ? opts[:now] : Time.now
|
||||
in_time = opts[:in_time] ? opts[:in_time] : :past
|
||||
calendar = opts[:calendar] ? opts[:calendar] : :basic
|
||||
|
||||
# Filter out invalid arguments for :in_time
|
||||
in_time_error = ":in_time => value must be either :past or :future, " \
|
||||
+ "depending on whether the Time object is before or after Time.now."
|
||||
unless in_time == :past || in_time == :future
|
||||
raise ArgumentError, in_time_error
|
||||
end
|
||||
|
||||
# Filter out invalid arguments for :calendar
|
||||
Ago.calendar_check(calendar)
|
||||
|
||||
# Filter out invalid arguments for :start_at and :focus
|
||||
base_error = " => value must either be a number " +
|
||||
"between 0 and 6 (inclusive),\nor one of the following " +
|
||||
"symbols: " + Valids
|
||||
{:focus => focus, :start_at => start_at}.each do |key, opt|
|
||||
opt_error = ":" + key.to_s + base_error
|
||||
if opt.class == Integer
|
||||
raise ArgumentError, opt_error unless opt >= 0 && opt <= 6
|
||||
elsif opt.class == Symbol
|
||||
raise ArgumentError, opt_error unless Ago::Units[opt]
|
||||
else
|
||||
raise ArgumentError, opt_error
|
||||
end
|
||||
end
|
||||
|
||||
# Create Variables necessary for processing.
|
||||
frags = []
|
||||
output = ""
|
||||
count = 0
|
||||
|
||||
now = calendar == :basic ? now.to_i : now.to_f
|
||||
my_time = calendar == :basic ? self.to_i : self.to_f
|
||||
if now > my_time
|
||||
diff = now - my_time
|
||||
tail = " ago"
|
||||
elsif my_time > now
|
||||
diff = my_time - now
|
||||
tail = " from now"
|
||||
else
|
||||
diff = 0
|
||||
tail = "just now"
|
||||
end
|
||||
|
||||
# Begin Ago.ago processing
|
||||
Ago::Order.each do |u|
|
||||
if calendar == :gregorian && Ago::Units[u][:gregorian]
|
||||
value = Ago::Units[u][:gregorian]
|
||||
else
|
||||
value = Ago::Units[u][:basic]
|
||||
end
|
||||
count += 1
|
||||
|
||||
# Move further ahead in the Ago::Units array if start_at is farther back than
|
||||
# the current point in the array.
|
||||
if start_at.class == Integer
|
||||
next if count <= start_at
|
||||
elsif start_at.class == Symbol
|
||||
next if Ago::Order.index(u) < Ago::Order.index(start_at)
|
||||
end
|
||||
|
||||
n = (diff/value).floor
|
||||
if n > 0
|
||||
plural = n > 1 ? "s" : ""
|
||||
frags << "#{n} #{u.to_s + plural}"
|
||||
|
||||
# If the argument passed into ago() is a symbol, focus the ago statement
|
||||
# down to the level specified in the symbol
|
||||
if focus.class == Symbol
|
||||
break if u == focus || u == :second
|
||||
elsif focus.class == Fixnum
|
||||
if focus == 0 || u == :second
|
||||
break
|
||||
else
|
||||
focus -= 1
|
||||
end
|
||||
end
|
||||
diff -= n * value
|
||||
end
|
||||
end
|
||||
|
||||
# Der Kommissar
|
||||
frags.size.times do |n|
|
||||
output += frags[n]
|
||||
output += ", " unless n == frags.size - 1
|
||||
end
|
||||
|
||||
return output + "#{tail}"
|
||||
end
|
||||
|
||||
def from_now_in_words(opts={})
|
||||
ago_in_words(opts)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Time
|
||||
include Ago::TimeAgo
|
||||
end
|
10
ext/time.rb
10
ext/time.rb
|
@ -1,7 +1,9 @@
|
|||
class Time
|
||||
alias_method :ago_original, :ago
|
||||
|
||||
def ago
|
||||
ago_original.downcase.gsub('right now, this very moment.', 'just now')
|
||||
self.ago_in_words
|
||||
end
|
||||
end
|
||||
|
||||
def from_now
|
||||
self.from_now_in_words
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue