cscg24-guacamole

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

format.js (2911B)


      1import zeroFill from '../utils/zero-fill';
      2import isFunction from '../utils/is-function';
      3
      4var formattingTokens =
      5        /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
      6    localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
      7    formatFunctions = {},
      8    formatTokenFunctions = {};
      9
     10export { formattingTokens, formatTokenFunctions };
     11
     12// token:    'M'
     13// padded:   ['MM', 2]
     14// ordinal:  'Mo'
     15// callback: function () { this.month() + 1 }
     16export function addFormatToken(token, padded, ordinal, callback) {
     17    var func = callback;
     18    if (typeof callback === 'string') {
     19        func = function () {
     20            return this[callback]();
     21        };
     22    }
     23    if (token) {
     24        formatTokenFunctions[token] = func;
     25    }
     26    if (padded) {
     27        formatTokenFunctions[padded[0]] = function () {
     28            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
     29        };
     30    }
     31    if (ordinal) {
     32        formatTokenFunctions[ordinal] = function () {
     33            return this.localeData().ordinal(
     34                func.apply(this, arguments),
     35                token
     36            );
     37        };
     38    }
     39}
     40
     41function removeFormattingTokens(input) {
     42    if (input.match(/\[[\s\S]/)) {
     43        return input.replace(/^\[|\]$/g, '');
     44    }
     45    return input.replace(/\\/g, '');
     46}
     47
     48function makeFormatFunction(format) {
     49    var array = format.match(formattingTokens),
     50        i,
     51        length;
     52
     53    for (i = 0, length = array.length; i < length; i++) {
     54        if (formatTokenFunctions[array[i]]) {
     55            array[i] = formatTokenFunctions[array[i]];
     56        } else {
     57            array[i] = removeFormattingTokens(array[i]);
     58        }
     59    }
     60
     61    return function (mom) {
     62        var output = '',
     63            i;
     64        for (i = 0; i < length; i++) {
     65            output += isFunction(array[i])
     66                ? array[i].call(mom, format)
     67                : array[i];
     68        }
     69        return output;
     70    };
     71}
     72
     73// format date using native date object
     74export function formatMoment(m, format) {
     75    if (!m.isValid()) {
     76        return m.localeData().invalidDate();
     77    }
     78
     79    format = expandFormat(format, m.localeData());
     80    formatFunctions[format] =
     81        formatFunctions[format] || makeFormatFunction(format);
     82
     83    return formatFunctions[format](m);
     84}
     85
     86export function expandFormat(format, locale) {
     87    var i = 5;
     88
     89    function replaceLongDateFormatTokens(input) {
     90        return locale.longDateFormat(input) || input;
     91    }
     92
     93    localFormattingTokens.lastIndex = 0;
     94    while (i >= 0 && localFormattingTokens.test(format)) {
     95        format = format.replace(
     96            localFormattingTokens,
     97            replaceLongDateFormatTokens
     98        );
     99        localFormattingTokens.lastIndex = 0;
    100        i -= 1;
    101    }
    102
    103    return format;
    104}