cscg24-guacamole

CSCG 2024 Challenge 'Guacamole Mashup'
git clone https://git.sinitax.com/sinitax/cscg24-guacamole
Log | Files | Refs | sfeed.txt

humanize.js (3493B)


      1import { createDuration } from './create';
      2
      3var round = Math.round,
      4    thresholds = {
      5        ss: 44, // a few seconds to seconds
      6        s: 45, // seconds to minute
      7        m: 45, // minutes to hour
      8        h: 22, // hours to day
      9        d: 26, // days to month/week
     10        w: null, // weeks to month
     11        M: 11, // months to year
     12    };
     13
     14// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
     15function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
     16    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
     17}
     18
     19function relativeTime(posNegDuration, withoutSuffix, thresholds, locale) {
     20    var duration = createDuration(posNegDuration).abs(),
     21        seconds = round(duration.as('s')),
     22        minutes = round(duration.as('m')),
     23        hours = round(duration.as('h')),
     24        days = round(duration.as('d')),
     25        months = round(duration.as('M')),
     26        weeks = round(duration.as('w')),
     27        years = round(duration.as('y')),
     28        a =
     29            (seconds <= thresholds.ss && ['s', seconds]) ||
     30            (seconds < thresholds.s && ['ss', seconds]) ||
     31            (minutes <= 1 && ['m']) ||
     32            (minutes < thresholds.m && ['mm', minutes]) ||
     33            (hours <= 1 && ['h']) ||
     34            (hours < thresholds.h && ['hh', hours]) ||
     35            (days <= 1 && ['d']) ||
     36            (days < thresholds.d && ['dd', days]);
     37
     38    if (thresholds.w != null) {
     39        a =
     40            a ||
     41            (weeks <= 1 && ['w']) ||
     42            (weeks < thresholds.w && ['ww', weeks]);
     43    }
     44    a = a ||
     45        (months <= 1 && ['M']) ||
     46        (months < thresholds.M && ['MM', months]) ||
     47        (years <= 1 && ['y']) || ['yy', years];
     48
     49    a[2] = withoutSuffix;
     50    a[3] = +posNegDuration > 0;
     51    a[4] = locale;
     52    return substituteTimeAgo.apply(null, a);
     53}
     54
     55// This function allows you to set the rounding function for relative time strings
     56export function getSetRelativeTimeRounding(roundingFunction) {
     57    if (roundingFunction === undefined) {
     58        return round;
     59    }
     60    if (typeof roundingFunction === 'function') {
     61        round = roundingFunction;
     62        return true;
     63    }
     64    return false;
     65}
     66
     67// This function allows you to set a threshold for relative time strings
     68export function getSetRelativeTimeThreshold(threshold, limit) {
     69    if (thresholds[threshold] === undefined) {
     70        return false;
     71    }
     72    if (limit === undefined) {
     73        return thresholds[threshold];
     74    }
     75    thresholds[threshold] = limit;
     76    if (threshold === 's') {
     77        thresholds.ss = limit - 1;
     78    }
     79    return true;
     80}
     81
     82export function humanize(argWithSuffix, argThresholds) {
     83    if (!this.isValid()) {
     84        return this.localeData().invalidDate();
     85    }
     86
     87    var withSuffix = false,
     88        th = thresholds,
     89        locale,
     90        output;
     91
     92    if (typeof argWithSuffix === 'object') {
     93        argThresholds = argWithSuffix;
     94        argWithSuffix = false;
     95    }
     96    if (typeof argWithSuffix === 'boolean') {
     97        withSuffix = argWithSuffix;
     98    }
     99    if (typeof argThresholds === 'object') {
    100        th = Object.assign({}, thresholds, argThresholds);
    101        if (argThresholds.s != null && argThresholds.ss == null) {
    102            th.ss = argThresholds.s - 1;
    103        }
    104    }
    105
    106    locale = this.localeData();
    107    output = relativeTime(this, !withSuffix, th, locale);
    108
    109    if (withSuffix) {
    110        output = locale.pastFuture(+this, output);
    111    }
    112
    113    return locale.postformat(output);
    114}