diff --git a/src/dateparser/dateparser.js b/src/dateparser/dateparser.js index 38774c3d0b..99dd452305 100644 --- a/src/dateparser/dateparser.js +++ b/src/dateparser/dateparser.js @@ -102,6 +102,34 @@ angular.module('ui.bootstrap.dateparser', []) function createParser(format) { var map = [], regex = format.split(''); + // check for literal values + var quoteIndex = format.indexOf('\''); + if (quoteIndex > -1) { + var inLiteral = false; + format = format.split(''); + for (var i = quoteIndex; i < format.length; i++) { + if (inLiteral) { + if (format[i] === '\'') { + if ((i+1 < format.length) && (format[i+1] === '\'')) { // escaped single quote + format[i+1] = '$'; + regex[i+1] = ''; + } else { // end of literal + regex[i] = ''; + inLiteral = false; + } + } + format[i] = '$'; + } else { + if (format[i] === '\'') { // start of literal + format[i] = '$'; + regex[i] = ''; + inLiteral = true; + } + } + } + format = format.join(''); + } + angular.forEach(formatCodeToRegex, function(data, code) { var index = format.indexOf(code); diff --git a/src/dateparser/test/dateparser.spec.js b/src/dateparser/test/dateparser.spec.js index 0762866ed1..4de4eecdd6 100644 --- a/src/dateparser/test/dateparser.spec.js +++ b/src/dateparser/test/dateparser.spec.js @@ -176,6 +176,24 @@ describe('date parser', function() { }); }); + describe('with value literals', function() { + it('should work with multiple literals', function () { + expect(dateParser.parse('29 de January de 2013', 'd \'de\' MMMM \'de\' y')).toEqual(new Date(2013, 0, 29)); + }); + it('should work with escaped single quote', function () { + expect(dateParser.parse('22.March.15 12 o\'clock', 'd.MMMM.yy h \'o\'\'clock\'')).toEqual(new Date(2015, 2, 22, 12)); + }); + it('should work with only a single quote', function () { + expect(dateParser.parse('22.March.15 \'', 'd.MMMM.yy \'\'\'')).toEqual(new Date(2015, 2, 22)); + }); + it('should work with trailing literal', function () { + expect(dateParser.parse('year 2013', '\'year\' y')).toEqual(new Date(2013, 0, 1)); + }); + it('should work without whitespace', function () { + expect(dateParser.parse('year:2013', '\'year:\'y')).toEqual(new Date(2013, 0, 1)); + }); + }); + describe('with edge case', function() { it('should not work for invalid number of days in February', function() { expect(dateParser.parse('29.02.2013', 'dd.MM.yyyy')).toBeUndefined();