Created
January 28, 2011 09:46
-
-
Save gazs/800050 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* timeago: a jQuery plugin ported to Zepto, version: 0.9.3 (2011-01-21) | |
* @requires Zepto.js 0.4 | |
* | |
* Timeago is a jQuery plugin that makes it easy to support automatically | |
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). | |
* | |
* For usage and examples, visit: | |
* http://timeago.yarp.com/ | |
* | |
* Licensed under the MIT: | |
* http://www.opensource.org/licenses/mit-license.php | |
* | |
* Copyright (c) 2008-2010, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org) | |
* Modifications (c) 2011, Gáspár Körtesi (gazs -[at]- bergengocia [*dot*] net) | |
* | |
* isFunction copied from Underscore.js, (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. | |
* trim copied from underscore.string (c) 2010 Esa-Matti Suuronen <esa-matti aet suuronen dot org> | |
* json date reviver from Douglas Crockford's json2.js | |
*/ | |
(function($){ | |
var nativeTrim = String.prototype.trim; | |
$.trim = function(str, characters){ | |
if (!characters && nativeTrim) { | |
return nativeTrim.call(str); | |
} | |
characters = defaultToWhiteSpace(characters); | |
return str.replace(new RegExp('\^[' + characters + ']+|[' + characters + ']+$', 'g'), ''); | |
}; | |
$.timeago = function(timestamp) { | |
if (timestamp instanceof Date) return inWords(timestamp); | |
else if (typeof timestamp == "string") return inWords($.timeago.parse(timestamp)); | |
else return inWords($.timeago.datetime(timestamp)); | |
}; | |
$.isFunction = function(obj) { | |
return !!(obj && obj.constructor && obj.call && obj.apply); | |
}; | |
$.jsonDateReviver = function (key, value) { | |
var a; | |
if (typeof value === 'string') { | |
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); | |
if (a) { | |
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],+a[5], +a[6])); | |
} | |
} | |
return value; | |
}; | |
$.fn.data = function(key, value) { | |
if (typeof key === "undefined") { | |
throw "not implemented :( please fixme"; | |
} | |
if (typeof value === "undefined") { | |
// show key | |
try { | |
return JSON.parse($(this).attr("data-" + key), $.jsonDateReviver); | |
} | |
catch(e) { | |
$(this).attr("data-" + key); | |
} | |
} else { | |
// set key value | |
if (typeof value === "object") { | |
$(this).attr("data-" + key, JSON.stringify(value)); | |
} else { | |
$(this).attr("data-" + key, value); | |
} | |
} | |
} | |
})(Zepto); | |
(function($) { | |
$.timeago = function(timestamp) { | |
if (timestamp instanceof Date) { | |
return inWords(timestamp); | |
} else if (typeof timestamp === "string") { | |
return inWords($.timeago.parse(timestamp)); | |
} else { | |
return inWords($.timeago.datetime(timestamp)); | |
} | |
}; | |
var $t = $.timeago; | |
$.extend($.timeago, { | |
settings: { | |
refreshMillis: 60000, | |
allowFuture: false, | |
strings: { | |
prefixAgo: null, | |
prefixFromNow: null, | |
suffixAgo: "ago", | |
suffixFromNow: "from now", | |
seconds: "less than a minute", | |
minute: "about a minute", | |
minutes: "%d minutes", | |
hour: "about an hour", | |
hours: "about %d hours", | |
day: "a day", | |
days: "%d days", | |
month: "about a month", | |
months: "%d months", | |
year: "about a year", | |
years: "%d years", | |
numbers: [] | |
} | |
}, | |
inWords: function(distanceMillis) { | |
var $l = this.settings.strings; | |
var prefix = $l.prefixAgo; | |
var suffix = $l.suffixAgo; | |
if (this.settings.allowFuture) { | |
if (distanceMillis < 0) { | |
prefix = $l.prefixFromNow; | |
suffix = $l.suffixFromNow; | |
} | |
distanceMillis = Math.abs(distanceMillis); | |
} | |
var seconds = distanceMillis / 1000; | |
var minutes = seconds / 60; | |
var hours = minutes / 60; | |
var days = hours / 24; | |
var years = days / 365; | |
function substitute(stringOrFunction, number) { | |
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; | |
var value = ($l.numbers && $l.numbers[number]) || number; | |
return string.replace(/%d/i, value); | |
} | |
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || | |
seconds < 90 && substitute($l.minute, 1) || | |
minutes < 45 && substitute($l.minutes, Math.round(minutes)) || | |
minutes < 90 && substitute($l.hour, 1) || | |
hours < 24 && substitute($l.hours, Math.round(hours)) || | |
hours < 48 && substitute($l.day, 1) || | |
days < 30 && substitute($l.days, Math.floor(days)) || | |
days < 60 && substitute($l.month, 1) || | |
days < 365 && substitute($l.months, Math.floor(days / 30)) || | |
years < 2 && substitute($l.year, 1) || | |
substitute($l.years, Math.floor(years)); | |
return $.trim([prefix, words, suffix].join(" ")); | |
}, | |
parse: function(iso8601) { | |
var s = $.trim(iso8601); | |
s = s.replace(/\.\d\d\d+/,""); // remove milliseconds | |
s = s.replace(/-/,"/").replace(/-/,"/"); | |
s = s.replace(/T/," ").replace(/Z/," UTC"); | |
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 | |
return new Date(s); | |
}, | |
datetime: function(elem) { | |
// jQuery's `is()` doesn't play well with HTML5 in IE | |
var isTime = $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); | |
var iso8601 = isTime ? $(elem).attr("datetime") : $(elem).attr("title"); | |
return $t.parse(iso8601); | |
} | |
}); | |
$.fn.timeago = function() { | |
var self = this; | |
self.each(refresh); | |
var $s = $t.settings; | |
if ($s.refreshMillis > 0) { | |
setInterval(function() { self.each(refresh); }, $s.refreshMillis); | |
} | |
return self; | |
}; | |
function refresh() { | |
var data = prepareData(this); | |
if (!isNaN(data.datetime)) { | |
$(this).text(inWords(data.datetime)); | |
} | |
return this; | |
} | |
function prepareData(element) { | |
element = $(element); | |
if (!element.data("timeago")) { | |
element.data("timeago", { datetime: $t.datetime(element) }); | |
var text = $.trim(element.text()); | |
if (text.length > 0) { | |
element.attr("title", text); | |
} | |
} | |
return element.data("timeago"); | |
} | |
function inWords(date) { | |
return $t.inWords(distance(date)); | |
} | |
function distance(date) { | |
return (new Date().getTime() - date.getTime()); | |
} | |
// fix for IE6 suckage | |
document.createElement("abbr"); | |
document.createElement("time"); | |
})(Zepto); | |
(function($) { | |
$.timeago.settings.strings = { | |
prefixAgo: null, | |
prefixFromNow: null, | |
suffixAgo: "", | |
suffixFromNow: "mostantól számítva", | |
seconds: "most", | |
minute: "egy perce", | |
minutes: "%d perce", | |
hour: "egy órája", | |
hours: "%d órája", | |
day: "tegnap", | |
days: "%d napja", | |
month: "egy hónapja", | |
months: "%d hónapja", | |
year: "egy éve", | |
years: "%d éve", | |
numbers: [] | |
} | |
})(Zepto) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment