UNPKG

angular-cached-resource

Version:

An AngularJS module to interact with RESTful resources, even when browser is offline

150 lines 5.91 kB
/** * angular-strap * @version v2.0.1 - 2014-04-10 * @link http://mgcrea.github.io/angular-strap * @author Olivier Louvignes (olivier@mg-crea.com) * @license MIT License, http://www.opensource.org/licenses/MIT */ 'use strict'; angular.module('mgcrea.ngStrap.helpers.dateParser', []).provider('$dateParser', [ '$localeProvider', function ($localeProvider) { var proto = Date.prototype; function isNumeric(n) { return !isNaN(parseFloat(n)) && isFinite(n); } var defaults = this.defaults = { format: 'shortDate', strict: false }; this.$get = [ '$locale', function ($locale) { var DateParserFactory = function (config) { var options = angular.extend({}, defaults, config); var $dateParser = {}; var regExpMap = { 'sss': '[0-9]{3}', 'ss': '[0-5][0-9]', 's': options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]', 'mm': '[0-5][0-9]', 'm': options.strict ? '[1-5]?[0-9]' : '[0-9]|[0-5][0-9]', 'HH': '[01][0-9]|2[0-3]', 'H': options.strict ? '1?[0-9]|2[0-3]' : '[01]?[0-9]|2[0-3]', 'hh': '[0][1-9]|[1][012]', 'h': options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]', 'a': 'AM|PM', 'EEEE': $locale.DATETIME_FORMATS.DAY.join('|'), 'EEE': $locale.DATETIME_FORMATS.SHORTDAY.join('|'), 'dd': '0[1-9]|[12][0-9]|3[01]', 'd': options.strict ? '[1-9]|[1-2][0-9]|3[01]' : '0?[1-9]|[1-2][0-9]|3[01]', 'MMMM': $locale.DATETIME_FORMATS.MONTH.join('|'), 'MMM': $locale.DATETIME_FORMATS.SHORTMONTH.join('|'), 'MM': '0[1-9]|1[012]', 'M': options.strict ? '[1-9]|1[012]' : '0?[1-9]|1[012]', 'yyyy': '[1]{1}[0-9]{3}|[2]{1}[0-9]{3}', 'yy': '[0-9]{2}', 'y': options.strict ? '-?(0|[1-9][0-9]{0,3})' : '-?0*[0-9]{1,4}' }; var setFnMap = { 'sss': proto.setMilliseconds, 'ss': proto.setSeconds, 's': proto.setSeconds, 'mm': proto.setMinutes, 'm': proto.setMinutes, 'HH': proto.setHours, 'H': proto.setHours, 'hh': proto.setHours, 'h': proto.setHours, 'dd': proto.setDate, 'd': proto.setDate, 'a': function (value) { var hours = this.getHours(); return this.setHours(value.match(/pm/i) ? hours + 12 : hours); }, 'MMMM': function (value) { return this.setMonth($locale.DATETIME_FORMATS.MONTH.indexOf(value)); }, 'MMM': function (value) { return this.setMonth($locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value)); }, 'MM': function (value) { return this.setMonth(1 * value - 1); }, 'M': function (value) { return this.setMonth(1 * value - 1); }, 'yyyy': proto.setFullYear, 'yy': function (value) { return this.setFullYear(2000 + 1 * value); }, 'y': proto.setFullYear }; var regex, setMap; $dateParser.init = function () { $dateParser.$format = $locale.DATETIME_FORMATS[options.format] || options.format; regex = regExpForFormat($dateParser.$format); setMap = setMapForFormat($dateParser.$format); }; $dateParser.isValid = function (date) { if (angular.isDate(date)) return !isNaN(date.getTime()); return regex.test(date); }; $dateParser.parse = function (value, baseDate) { if (angular.isDate(value)) return value; var matches = regex.exec(value); if (!matches) return false; var date = baseDate || new Date(0); for (var i = 0; i < matches.length - 1; i++) { setMap[i] && setMap[i].call(date, matches[i + 1]); } return date; }; // Private functions function setMapForFormat(format) { var keys = Object.keys(setFnMap), i; var map = [], sortedMap = []; // Map to setFn var clonedFormat = format; for (i = 0; i < keys.length; i++) { if (format.split(keys[i]).length > 1) { var index = clonedFormat.search(keys[i]); format = format.split(keys[i]).join(''); if (setFnMap[keys[i]]) map[index] = setFnMap[keys[i]]; } } // Sort result map angular.forEach(map, function (v) { sortedMap.push(v); }); return sortedMap; } function escapeReservedSymbols(text) { return text.replace(/\//g, '[\\/]').replace('/-/g', '[-]').replace(/\./g, '[.]').replace(/\\s/g, '[\\s]'); } function regExpForFormat(format) { var keys = Object.keys(regExpMap), i; var re = format; // Abstract replaces to avoid collisions for (i = 0; i < keys.length; i++) { re = re.split(keys[i]).join('${' + i + '}'); } // Replace abstracted values for (i = 0; i < keys.length; i++) { re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')'); } format = escapeReservedSymbols(format); return new RegExp('^' + re + '$', ['i']); } $dateParser.init(); return $dateParser; }; return DateParserFactory; } ]; } ]);