angular-cached-resource
Version:
An AngularJS module to interact with RESTful resources, even when browser is offline
150 lines • 5.91 kB
JavaScript
/**
* 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
*/
;
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;
}
];
}
]);