cscg24-guacamole

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

day-of-week.js (12622B)


      1import { get } from '../moment/get-set';
      2import { addFormatToken } from '../format/format';
      3import {
      4    addRegexToken,
      5    match1to2,
      6    matchWord,
      7    regexEscape,
      8} from '../parse/regex';
      9import { addWeekParseToken } from '../parse/token';
     10import toInt from '../utils/to-int';
     11import isArray from '../utils/is-array';
     12import indexOf from '../utils/index-of';
     13import hasOwnProp from '../utils/has-own-prop';
     14import { createUTC } from '../create/utc';
     15import getParsingFlags from '../create/parsing-flags';
     16
     17// FORMATTING
     18
     19addFormatToken('d', 0, 'do', 'day');
     20
     21addFormatToken('dd', 0, 0, function (format) {
     22    return this.localeData().weekdaysMin(this, format);
     23});
     24
     25addFormatToken('ddd', 0, 0, function (format) {
     26    return this.localeData().weekdaysShort(this, format);
     27});
     28
     29addFormatToken('dddd', 0, 0, function (format) {
     30    return this.localeData().weekdays(this, format);
     31});
     32
     33addFormatToken('e', 0, 0, 'weekday');
     34addFormatToken('E', 0, 0, 'isoWeekday');
     35
     36// PARSING
     37
     38addRegexToken('d', match1to2);
     39addRegexToken('e', match1to2);
     40addRegexToken('E', match1to2);
     41addRegexToken('dd', function (isStrict, locale) {
     42    return locale.weekdaysMinRegex(isStrict);
     43});
     44addRegexToken('ddd', function (isStrict, locale) {
     45    return locale.weekdaysShortRegex(isStrict);
     46});
     47addRegexToken('dddd', function (isStrict, locale) {
     48    return locale.weekdaysRegex(isStrict);
     49});
     50
     51addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
     52    var weekday = config._locale.weekdaysParse(input, token, config._strict);
     53    // if we didn't get a weekday name, mark the date as invalid
     54    if (weekday != null) {
     55        week.d = weekday;
     56    } else {
     57        getParsingFlags(config).invalidWeekday = input;
     58    }
     59});
     60
     61addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
     62    week[token] = toInt(input);
     63});
     64
     65// HELPERS
     66
     67function parseWeekday(input, locale) {
     68    if (typeof input !== 'string') {
     69        return input;
     70    }
     71
     72    if (!isNaN(input)) {
     73        return parseInt(input, 10);
     74    }
     75
     76    input = locale.weekdaysParse(input);
     77    if (typeof input === 'number') {
     78        return input;
     79    }
     80
     81    return null;
     82}
     83
     84function parseIsoWeekday(input, locale) {
     85    if (typeof input === 'string') {
     86        return locale.weekdaysParse(input) % 7 || 7;
     87    }
     88    return isNaN(input) ? null : input;
     89}
     90
     91// LOCALES
     92function shiftWeekdays(ws, n) {
     93    return ws.slice(n, 7).concat(ws.slice(0, n));
     94}
     95
     96var defaultLocaleWeekdays =
     97        'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
     98    defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
     99    defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
    100    defaultWeekdaysRegex = matchWord,
    101    defaultWeekdaysShortRegex = matchWord,
    102    defaultWeekdaysMinRegex = matchWord;
    103
    104export {
    105    defaultLocaleWeekdays,
    106    defaultLocaleWeekdaysShort,
    107    defaultLocaleWeekdaysMin,
    108};
    109
    110export function localeWeekdays(m, format) {
    111    var weekdays = isArray(this._weekdays)
    112        ? this._weekdays
    113        : this._weekdays[
    114              m && m !== true && this._weekdays.isFormat.test(format)
    115                  ? 'format'
    116                  : 'standalone'
    117          ];
    118    return m === true
    119        ? shiftWeekdays(weekdays, this._week.dow)
    120        : m
    121          ? weekdays[m.day()]
    122          : weekdays;
    123}
    124
    125export function localeWeekdaysShort(m) {
    126    return m === true
    127        ? shiftWeekdays(this._weekdaysShort, this._week.dow)
    128        : m
    129          ? this._weekdaysShort[m.day()]
    130          : this._weekdaysShort;
    131}
    132
    133export function localeWeekdaysMin(m) {
    134    return m === true
    135        ? shiftWeekdays(this._weekdaysMin, this._week.dow)
    136        : m
    137          ? this._weekdaysMin[m.day()]
    138          : this._weekdaysMin;
    139}
    140
    141function handleStrictParse(weekdayName, format, strict) {
    142    var i,
    143        ii,
    144        mom,
    145        llc = weekdayName.toLocaleLowerCase();
    146    if (!this._weekdaysParse) {
    147        this._weekdaysParse = [];
    148        this._shortWeekdaysParse = [];
    149        this._minWeekdaysParse = [];
    150
    151        for (i = 0; i < 7; ++i) {
    152            mom = createUTC([2000, 1]).day(i);
    153            this._minWeekdaysParse[i] = this.weekdaysMin(
    154                mom,
    155                ''
    156            ).toLocaleLowerCase();
    157            this._shortWeekdaysParse[i] = this.weekdaysShort(
    158                mom,
    159                ''
    160            ).toLocaleLowerCase();
    161            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
    162        }
    163    }
    164
    165    if (strict) {
    166        if (format === 'dddd') {
    167            ii = indexOf.call(this._weekdaysParse, llc);
    168            return ii !== -1 ? ii : null;
    169        } else if (format === 'ddd') {
    170            ii = indexOf.call(this._shortWeekdaysParse, llc);
    171            return ii !== -1 ? ii : null;
    172        } else {
    173            ii = indexOf.call(this._minWeekdaysParse, llc);
    174            return ii !== -1 ? ii : null;
    175        }
    176    } else {
    177        if (format === 'dddd') {
    178            ii = indexOf.call(this._weekdaysParse, llc);
    179            if (ii !== -1) {
    180                return ii;
    181            }
    182            ii = indexOf.call(this._shortWeekdaysParse, llc);
    183            if (ii !== -1) {
    184                return ii;
    185            }
    186            ii = indexOf.call(this._minWeekdaysParse, llc);
    187            return ii !== -1 ? ii : null;
    188        } else if (format === 'ddd') {
    189            ii = indexOf.call(this._shortWeekdaysParse, llc);
    190            if (ii !== -1) {
    191                return ii;
    192            }
    193            ii = indexOf.call(this._weekdaysParse, llc);
    194            if (ii !== -1) {
    195                return ii;
    196            }
    197            ii = indexOf.call(this._minWeekdaysParse, llc);
    198            return ii !== -1 ? ii : null;
    199        } else {
    200            ii = indexOf.call(this._minWeekdaysParse, llc);
    201            if (ii !== -1) {
    202                return ii;
    203            }
    204            ii = indexOf.call(this._weekdaysParse, llc);
    205            if (ii !== -1) {
    206                return ii;
    207            }
    208            ii = indexOf.call(this._shortWeekdaysParse, llc);
    209            return ii !== -1 ? ii : null;
    210        }
    211    }
    212}
    213
    214export function localeWeekdaysParse(weekdayName, format, strict) {
    215    var i, mom, regex;
    216
    217    if (this._weekdaysParseExact) {
    218        return handleStrictParse.call(this, weekdayName, format, strict);
    219    }
    220
    221    if (!this._weekdaysParse) {
    222        this._weekdaysParse = [];
    223        this._minWeekdaysParse = [];
    224        this._shortWeekdaysParse = [];
    225        this._fullWeekdaysParse = [];
    226    }
    227
    228    for (i = 0; i < 7; i++) {
    229        // make the regex if we don't have it already
    230
    231        mom = createUTC([2000, 1]).day(i);
    232        if (strict && !this._fullWeekdaysParse[i]) {
    233            this._fullWeekdaysParse[i] = new RegExp(
    234                '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$',
    235                'i'
    236            );
    237            this._shortWeekdaysParse[i] = new RegExp(
    238                '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$',
    239                'i'
    240            );
    241            this._minWeekdaysParse[i] = new RegExp(
    242                '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$',
    243                'i'
    244            );
    245        }
    246        if (!this._weekdaysParse[i]) {
    247            regex =
    248                '^' +
    249                this.weekdays(mom, '') +
    250                '|^' +
    251                this.weekdaysShort(mom, '') +
    252                '|^' +
    253                this.weekdaysMin(mom, '');
    254            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
    255        }
    256        // test the regex
    257        if (
    258            strict &&
    259            format === 'dddd' &&
    260            this._fullWeekdaysParse[i].test(weekdayName)
    261        ) {
    262            return i;
    263        } else if (
    264            strict &&
    265            format === 'ddd' &&
    266            this._shortWeekdaysParse[i].test(weekdayName)
    267        ) {
    268            return i;
    269        } else if (
    270            strict &&
    271            format === 'dd' &&
    272            this._minWeekdaysParse[i].test(weekdayName)
    273        ) {
    274            return i;
    275        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
    276            return i;
    277        }
    278    }
    279}
    280
    281// MOMENTS
    282
    283export function getSetDayOfWeek(input) {
    284    if (!this.isValid()) {
    285        return input != null ? this : NaN;
    286    }
    287
    288    var day = get(this, 'Day');
    289    if (input != null) {
    290        input = parseWeekday(input, this.localeData());
    291        return this.add(input - day, 'd');
    292    } else {
    293        return day;
    294    }
    295}
    296
    297export function getSetLocaleDayOfWeek(input) {
    298    if (!this.isValid()) {
    299        return input != null ? this : NaN;
    300    }
    301    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
    302    return input == null ? weekday : this.add(input - weekday, 'd');
    303}
    304
    305export function getSetISODayOfWeek(input) {
    306    if (!this.isValid()) {
    307        return input != null ? this : NaN;
    308    }
    309
    310    // behaves the same as moment#day except
    311    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
    312    // as a setter, sunday should belong to the previous week.
    313
    314    if (input != null) {
    315        var weekday = parseIsoWeekday(input, this.localeData());
    316        return this.day(this.day() % 7 ? weekday : weekday - 7);
    317    } else {
    318        return this.day() || 7;
    319    }
    320}
    321
    322export function weekdaysRegex(isStrict) {
    323    if (this._weekdaysParseExact) {
    324        if (!hasOwnProp(this, '_weekdaysRegex')) {
    325            computeWeekdaysParse.call(this);
    326        }
    327        if (isStrict) {
    328            return this._weekdaysStrictRegex;
    329        } else {
    330            return this._weekdaysRegex;
    331        }
    332    } else {
    333        if (!hasOwnProp(this, '_weekdaysRegex')) {
    334            this._weekdaysRegex = defaultWeekdaysRegex;
    335        }
    336        return this._weekdaysStrictRegex && isStrict
    337            ? this._weekdaysStrictRegex
    338            : this._weekdaysRegex;
    339    }
    340}
    341
    342export function weekdaysShortRegex(isStrict) {
    343    if (this._weekdaysParseExact) {
    344        if (!hasOwnProp(this, '_weekdaysRegex')) {
    345            computeWeekdaysParse.call(this);
    346        }
    347        if (isStrict) {
    348            return this._weekdaysShortStrictRegex;
    349        } else {
    350            return this._weekdaysShortRegex;
    351        }
    352    } else {
    353        if (!hasOwnProp(this, '_weekdaysShortRegex')) {
    354            this._weekdaysShortRegex = defaultWeekdaysShortRegex;
    355        }
    356        return this._weekdaysShortStrictRegex && isStrict
    357            ? this._weekdaysShortStrictRegex
    358            : this._weekdaysShortRegex;
    359    }
    360}
    361
    362export function weekdaysMinRegex(isStrict) {
    363    if (this._weekdaysParseExact) {
    364        if (!hasOwnProp(this, '_weekdaysRegex')) {
    365            computeWeekdaysParse.call(this);
    366        }
    367        if (isStrict) {
    368            return this._weekdaysMinStrictRegex;
    369        } else {
    370            return this._weekdaysMinRegex;
    371        }
    372    } else {
    373        if (!hasOwnProp(this, '_weekdaysMinRegex')) {
    374            this._weekdaysMinRegex = defaultWeekdaysMinRegex;
    375        }
    376        return this._weekdaysMinStrictRegex && isStrict
    377            ? this._weekdaysMinStrictRegex
    378            : this._weekdaysMinRegex;
    379    }
    380}
    381
    382function computeWeekdaysParse() {
    383    function cmpLenRev(a, b) {
    384        return b.length - a.length;
    385    }
    386
    387    var minPieces = [],
    388        shortPieces = [],
    389        longPieces = [],
    390        mixedPieces = [],
    391        i,
    392        mom,
    393        minp,
    394        shortp,
    395        longp;
    396    for (i = 0; i < 7; i++) {
    397        // make the regex if we don't have it already
    398        mom = createUTC([2000, 1]).day(i);
    399        minp = regexEscape(this.weekdaysMin(mom, ''));
    400        shortp = regexEscape(this.weekdaysShort(mom, ''));
    401        longp = regexEscape(this.weekdays(mom, ''));
    402        minPieces.push(minp);
    403        shortPieces.push(shortp);
    404        longPieces.push(longp);
    405        mixedPieces.push(minp);
    406        mixedPieces.push(shortp);
    407        mixedPieces.push(longp);
    408    }
    409    // Sorting makes sure if one weekday (or abbr) is a prefix of another it
    410    // will match the longer piece.
    411    minPieces.sort(cmpLenRev);
    412    shortPieces.sort(cmpLenRev);
    413    longPieces.sort(cmpLenRev);
    414    mixedPieces.sort(cmpLenRev);
    415
    416    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
    417    this._weekdaysShortRegex = this._weekdaysRegex;
    418    this._weekdaysMinRegex = this._weekdaysRegex;
    419
    420    this._weekdaysStrictRegex = new RegExp(
    421        '^(' + longPieces.join('|') + ')',
    422        'i'
    423    );
    424    this._weekdaysShortStrictRegex = new RegExp(
    425        '^(' + shortPieces.join('|') + ')',
    426        'i'
    427    );
    428    this._weekdaysMinStrictRegex = new RegExp(
    429        '^(' + minPieces.join('|') + ')',
    430        'i'
    431    );
    432}