diff --git a/src/dateparser/dateparser.js b/src/dateparser/dateparser.js index 51c488b123..d770dff31b 100644 --- a/src/dateparser/dateparser.js +++ b/src/dateparser/dateparser.js @@ -1,6 +1,6 @@ angular.module('ui.bootstrap.dateparser', []) -.service('uibDateParser', ['$log', '$locale', 'dateFilter', 'orderByFilter', function($log, $locale, dateFilter, orderByFilter) { +.service('uibDateParser', ['$log', '$locale', 'dateFilter', 'orderByFilter', 'filterFilter', function($log, $locale, dateFilter, orderByFilter, filterFilter) { // Pulled from https://github.com/mbostock/d3/blob/master/src/format/requote.js var SPECIAL_CHARACTERS_REGEXP = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; @@ -243,6 +243,23 @@ angular.module('ui.bootstrap.dateparser', []) this.init(); + function getFormatCodeToRegex(key) { + return filterFilter(formatCodeToRegex, {key: key}, true)[0]; + } + + this.getParser = function (key) { + var f = getFormatCodeToRegex(key); + return f && f.apply || null; + }; + + this.overrideParser = function (key, parser) { + var f = getFormatCodeToRegex(key); + if (f && angular.isFunction(parser)) { + this.parsers = {}; + f.apply = parser; + } + }.bind(this); + function createParser(format) { var map = [], regex = format.split(''); diff --git a/src/dateparser/test/dateparser.spec.js b/src/dateparser/test/dateparser.spec.js index c3f2c5912f..70c4b3e4f8 100644 --- a/src/dateparser/test/dateparser.spec.js +++ b/src/dateparser/test/dateparser.spec.js @@ -791,4 +791,28 @@ describe('date parser', function() { }); }); }); + + describe('overrideParser', function() { + var twoDigitYearParser = function (value) { + this.year = +value + (+value > 30 ? 1900 : 2000); + }; + + it('should get the current parser', function() { + expect(dateParser.getParser('yy')).toBeTruthy(); + }); + + it('should override the parser', function() { + dateParser.overrideParser('yy', twoDigitYearParser); + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); + expect(dateParser.parse('67', 'yy').getFullYear()).toEqual(1967); + expect(dateParser.parse('31', 'yy').getFullYear()).toEqual(1931); + expect(dateParser.parse('30', 'yy').getFullYear()).toEqual(2030); + }); + + it('should clear cached parsers', function() { + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(2068); + dateParser.overrideParser('yy', twoDigitYearParser); + expect(dateParser.parse('68', 'yy').getFullYear()).toEqual(1968); + }); + }); });