mirror of
https://github.com/codeninjasllc/discourse.git
synced 2025-04-29 15:35:23 -04:00
144 lines
4.7 KiB
JavaScript
144 lines
4.7 KiB
JavaScript
Discourse.Formatter = (function(){
|
|
|
|
var updateRelativeAge, autoUpdatingRelativeAge, relativeAge, relativeAgeTiny, relativeAgeMedium, relativeAgeMediumSpan;
|
|
|
|
var shortDateNoYear = Ember.String.i18n("dates.short_date_no_year");
|
|
var longDate = Ember.String.i18n("dates.long_date");
|
|
var shortDate = Ember.String.i18n("dates.short_date");
|
|
|
|
updateRelativeAge = function(elems) {
|
|
elems.each(function(){
|
|
var $this = $(this);
|
|
$this.html(relativeAge(new Date($this.data('time')), $this.data('format')));
|
|
});
|
|
};
|
|
|
|
autoUpdatingRelativeAge = function(date,options) {
|
|
options = options || {};
|
|
var format = options.format || "tiny";
|
|
|
|
return "<span class='relative-date' data-time='" + date.getTime() + "' data-format='" + format + "'>" + relativeAge(date, options) + "</span>";
|
|
};
|
|
|
|
|
|
relativeAgeTiny = function(date, options){
|
|
var format = "tiny";
|
|
var distance = Math.round((new Date() - date) / 1000);
|
|
var distanceInMinutes = Math.round(distance / 60.0);
|
|
|
|
var formatted;
|
|
var t = function(key,opts){
|
|
return Ember.String.i18n("dates." + format + "." + key, opts);
|
|
};
|
|
|
|
switch(true){
|
|
|
|
case(distanceInMinutes < 1):
|
|
formatted = t("less_than_x_minutes", {count: 1});
|
|
break;
|
|
case(distanceInMinutes >= 1 && distanceInMinutes <= 44):
|
|
formatted = t("x_minutes", {count: distanceInMinutes});
|
|
break;
|
|
case(distanceInMinutes >= 45 && distanceInMinutes <= 89):
|
|
formatted = t("about_x_hours", {count: 1});
|
|
break;
|
|
case(distanceInMinutes >= 90 && distanceInMinutes <= 1439):
|
|
formatted = t("about_x_hours", {count: Math.round(distanceInMinutes / 60.0)});
|
|
break;
|
|
case(distanceInMinutes >= 1440 && distanceInMinutes <= 2519):
|
|
formatted = t("x_days", {count: 1});
|
|
break;
|
|
case(distanceInMinutes >= 2520 && distanceInMinutes <= 129599):
|
|
formatted = t("x_days", {count: Math.round(distanceInMinutes / 1440.0)});
|
|
break;
|
|
case(distanceInMinutes >= 129600 && distanceInMinutes <= 525599):
|
|
formatted = t("x_months", {count: Math.round(distanceInMinutes / 43200.0)});
|
|
break;
|
|
default:
|
|
var months = Math.round(distanceInMinutes / 43200.0);
|
|
if (months < 24) {
|
|
formatted = t("x_months", {count: months});
|
|
} else {
|
|
formatted = t("over_x_years", {count: Math.round(months / 12.0)});
|
|
}
|
|
break;
|
|
}
|
|
|
|
return formatted;
|
|
};
|
|
|
|
relativeAgeMediumSpan = function(distance, leaveAgo) {
|
|
var formatted, distanceInMinutes;
|
|
|
|
distanceInMinutes = Math.round(distance / 60.0);
|
|
|
|
var t = function(key, opts){
|
|
return Ember.String.i18n("dates.medium" + (leaveAgo?"_with_ago":"") + "." + key, opts);
|
|
}
|
|
|
|
switch(true){
|
|
case(distanceInMinutes >= 1 && distanceInMinutes <= 56):
|
|
formatted = t("x_minutes", {count: distanceInMinutes});
|
|
break;
|
|
case(distanceInMinutes >= 56 && distanceInMinutes <= 89):
|
|
formatted = t("x_hours", {count: 1});
|
|
break;
|
|
case(distanceInMinutes >= 90 && distanceInMinutes <= 1379):
|
|
formatted = t("x_hours", {count: Math.round(distanceInMinutes / 60.0)});
|
|
break;
|
|
case(distanceInMinutes >= 1380 && distanceInMinutes <= 2159):
|
|
formatted = t("x_days", {count: 1});
|
|
break;
|
|
case(distanceInMinutes >= 2160):
|
|
formatted = t("x_days", {count: Math.round((distanceInMinutes - 720.0) / 1440.0)});
|
|
break;
|
|
}
|
|
|
|
return formatted;
|
|
};
|
|
|
|
relativeAgeMedium = function(date, options){
|
|
var displayDate, fiveDaysAgo, oneMinuteAgo, fullReadable, leaveAgo, val;
|
|
|
|
leaveAgo = options.leaveAgo;
|
|
var distance = Math.round((new Date() - date) / 1000);
|
|
|
|
if (!date) {
|
|
return "—";
|
|
}
|
|
|
|
fullReadable = moment(date).format(longDate);
|
|
displayDate = "";
|
|
fiveDaysAgo = 432000;
|
|
oneMinuteAgo = 60;
|
|
|
|
if (distance >= 0 && distance < oneMinuteAgo) {
|
|
displayDate = Em.String.i18n("now");
|
|
} else if (distance > fiveDaysAgo) {
|
|
if ((new Date()).getFullYear() !== date.getFullYear()) {
|
|
displayDate = moment(date).format(shortDate);
|
|
} else {
|
|
displayDate = moment(date).format(shortDateNoYear);
|
|
}
|
|
} else {
|
|
displayDate = relativeAgeMediumSpan(distance, leaveAgo);
|
|
}
|
|
return "<span class='date' title='" + fullReadable + "'>" + displayDate + "</span>";
|
|
};
|
|
|
|
// mostly lifted from rails with a few amendments
|
|
relativeAge = function(date, options) {
|
|
options = options || {};
|
|
var format = options.format || "tiny";
|
|
|
|
if(format === "tiny") {
|
|
return relativeAgeTiny(date, options);
|
|
} else if (format === "medium") {
|
|
return relativeAgeMedium(date, options);
|
|
}
|
|
|
|
return "UNKNOWN FORMAT";
|
|
};
|
|
|
|
return {relativeAge: relativeAge, autoUpdatingRelativeAge: autoUpdatingRelativeAge, updateRelativeAge: updateRelativeAge};
|
|
})();
|