pinafore/src/routes/_thirdparty/timeago/timeago.js

77 lines
1.6 KiB
JavaScript

// adapted from https://unpkg.com/timeago.js@4.0.0-beta.1/lib/index.js
/**
* Created by hustcc on 18/5/20.
* Contract: i@hust.cc
*/
var IndexMapEn = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year']
var SEC_ARRAY = [60, 60, 24, 7, 365 / 7 / 12, 12]
/**
* Created by hustcc on 18/5/20.
* Contract: i@hust.cc
*/
function en (number, index) {
if (index === 0) {
return ['just now', 'right now']
}
var unit = IndexMapEn[Math.floor(index / 2)]
if (number > 1) {
unit += 's'
}
return [number + ' ' + unit + ' ago', 'in ' + number + ' ' + unit]
}
/**
* Created by hustcc on 18/5/20.
* Contract: i@hust.cc
*/
/**
* format the diff second to *** time ago, with setting locale
* @param diff
* @param locale
* @param defaultLocale
* @returns {string | void | *}
*/
function formatDiff (diff) {
// if locale is not exist, use defaultLocale.
// if defaultLocale is not exist, use build-in `en`.
// be sure of no error when locale is not exist.
var i = 0
var agoin = diff < 0 ? 1 : 0
// timein or timeago
var totalSec = diff = Math.abs(diff)
for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {
diff /= SEC_ARRAY[i]
}
diff = Math.floor(diff)
i *= 2
if (diff > (i === 0 ? 9 : 1)) i += 1
return en(diff, i, totalSec)[agoin].replace('%s', diff)
}
/**
* calculate the diff second between date to be formatted an now date.
* @param date
* @param nowDate
* @returns {number}
*/
function diffSec (date, now) {
return (now - date) / 1000
}
/**
* Created by hustcc on 18/5/20.
* Contract: i@hust.cc
*/
export function format (date, now) {
return formatDiff(diffSec(date, now))
}