UNPKG

sugar

Version:

A Javascript utility library for working with native objects.

161 lines (134 loc) 4.43 kB
'use strict'; var LocaleHelpers = require('./LocaleHelpers'), FormatTokensBase = require('./FormatTokensBase'), CoreOutputFormats = require('./CoreOutputFormats'), forEach = require('../../common/internal/forEach'), padNumber = require('../../common/internal/padNumber'), spaceSplit = require('../../common/internal/spaceSplit'), namespaceAliases = require('../../common/var/namespaceAliases'), coreUtilityAliases = require('../../common/var/coreUtilityAliases'), createFormatMatcher = require('../../common/internal/createFormatMatcher'), defineInstanceSimilar = require('../../common/internal/defineInstanceSimilar'); var localeManager = LocaleHelpers.localeManager, hasOwn = coreUtilityAliases.hasOwn, getOwn = coreUtilityAliases.getOwn, forEachProperty = coreUtilityAliases.forEachProperty, sugarDate = namespaceAliases.sugarDate; var ldmlTokens, strfTokens; function buildDateFormatTokens() { function addFormats(target, tokens, fn) { if (tokens) { forEach(spaceSplit(tokens), function(token) { target[token] = fn; }); } } function buildLowercase(get) { return function(d, localeCode) { return get(d, localeCode).toLowerCase(); }; } function buildOrdinal(get) { return function(d, localeCode) { var n = get(d, localeCode); return n + localeManager.get(localeCode).getOrdinal(n); }; } function buildPadded(get, padding) { return function(d, localeCode) { return padNumber(get(d, localeCode), padding); }; } function buildTwoDigits(get) { return function(d, localeCode) { return get(d, localeCode) % 100; }; } function buildAlias(alias) { return function(d, localeCode) { return dateFormatMatcher(alias, d, localeCode); }; } function buildAlternates(f) { for (var n = 1; n <= 5; n++) { buildAlternate(f, n); } } function buildAlternate(f, n) { var alternate = function(d, localeCode) { return f.get(d, localeCode, n); }; addFormats(ldmlTokens, f.ldml + n, alternate); if (f.lowerToken) { ldmlTokens[f.lowerToken + n] = buildLowercase(alternate); } } function getIdentityFormat(name) { return function(d, localeCode) { var loc = localeManager.get(localeCode); return dateFormatMatcher(loc[name], d, localeCode); }; } ldmlTokens = {}; strfTokens = {}; forEach(FormatTokensBase, function(f) { var get = f.get, getPadded; if (f.lowerToken) { ldmlTokens[f.lowerToken] = buildLowercase(get); } if (f.ordinalToken) { ldmlTokens[f.ordinalToken] = buildOrdinal(get, f); } if (f.ldmlPaddedToken) { ldmlTokens[f.ldmlPaddedToken] = buildPadded(get, f.ldmlPaddedToken.length); } if (f.ldmlTwoDigitToken) { ldmlTokens[f.ldmlTwoDigitToken] = buildPadded(buildTwoDigits(get), 2); } if (f.strfTwoDigitToken) { strfTokens[f.strfTwoDigitToken] = buildPadded(buildTwoDigits(get), 2); } if (f.strfPadding) { getPadded = buildPadded(get, f.strfPadding); } if (f.alias) { get = buildAlias(f.alias); } if (f.allowAlternates) { buildAlternates(f); } addFormats(ldmlTokens, f.ldml, get); addFormats(strfTokens, f.strf, getPadded || get); }); forEachProperty(CoreOutputFormats, function(src, name) { addFormats(ldmlTokens, name, buildAlias(src)); }); defineInstanceSimilar(sugarDate, 'short medium long full', function(methods, name) { var fn = getIdentityFormat(name); addFormats(ldmlTokens, name, fn); methods[name] = fn; }); addFormats(ldmlTokens, 'time', getIdentityFormat('time')); addFormats(ldmlTokens, 'stamp', getIdentityFormat('stamp')); } var dateFormatMatcher; function buildDateFormatMatcher() { function getLdml(d, token, localeCode) { return getOwn(ldmlTokens, token)(d, localeCode); } function getStrf(d, token, localeCode) { return getOwn(strfTokens, token)(d, localeCode); } function checkDateToken(ldml, strf) { return hasOwn(ldmlTokens, ldml) || hasOwn(strfTokens, strf); } // Format matcher for LDML or STRF tokens. dateFormatMatcher = createFormatMatcher(getLdml, getStrf, checkDateToken); } buildDateFormatTokens(); buildDateFormatMatcher(); module.exports = { ldmlTokens: ldmlTokens, strfTokens: strfTokens, dateFormatMatcher: dateFormatMatcher };