]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Implement stricter weekday parsing 2665/head
authorIskren Chernev <iskren.chernev@gmail.com>
Sat, 10 Oct 2015 20:22:56 +0000 (13:22 -0700)
committerIskren Chernev <iskren.chernev@gmail.com>
Mon, 9 Nov 2015 02:29:29 +0000 (18:29 -0800)
src/lib/units/day-of-week.js
src/test/locale/en.js

index 5f5b74babe721c7c36de84d55b9db1ee311411a5..d736a33ae341c32ce20f27ebd0ae532bf18265ce 100644 (file)
@@ -40,8 +40,8 @@ addRegexToken('dd',   matchWord);
 addRegexToken('ddd',  matchWord);
 addRegexToken('dddd', matchWord);
 
-addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config) {
-    var weekday = config._locale.weekdaysParse(input);
+addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
+    var weekday = config._locale.weekdaysParse(input, token, config._strict);
     // if we didn't get a weekday name, mark the date as invalid
     if (weekday != null) {
         week.d = weekday;
@@ -90,20 +90,37 @@ export function localeWeekdaysMin (m) {
     return this._weekdaysMin[m.day()];
 }
 
-export function localeWeekdaysParse (weekdayName) {
+export function localeWeekdaysParse (weekdayName, format, strict) {
     var i, mom, regex;
 
-    this._weekdaysParse = this._weekdaysParse || [];
+    if (!this._weekdaysParse) {
+        this._weekdaysParse = [];
+        this._minWeekdaysParse = [];
+        this._shortWeekdaysParse = [];
+        this._fullWeekdaysParse = [];
+    }
 
     for (i = 0; i < 7; i++) {
         // make the regex if we don't have it already
+
+        mom = createLocal([2000, 1]).day(i);
+        if (strict && !this._fullWeekdaysParse[i]) {
+            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
+            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
+            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
+        }
         if (!this._weekdaysParse[i]) {
-            mom = createLocal([2000, 1]).day(i);
             regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
             this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
         }
         // test the regex
-        if (this._weekdaysParse[i].test(weekdayName)) {
+        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
+            return i;
+        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
+            return i;
+        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
+            return i;
+        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
             return i;
         }
     }
index 22859c842360168ad438bed366014922135ecfbe..f0f205d8a2060d091dea5d98c22f4f51e3735237 100644 (file)
@@ -293,6 +293,21 @@ test('lenient ordinal parsing', function (assert) {
     }
 });
 
+test('weekdays strict parsing', function (assert) {
+    var m = moment('2015-01-01T12', moment.ISO_8601, true),
+        enLocale = moment.localeData('en');
+
+    for (var i = 0; i < 7; ++i) {
+        assert.equal(moment(enLocale.weekdays(m.day(i), ''), 'dddd', true).isValid(), true, 'parse weekday ' + i);
+        assert.equal(moment(enLocale.weekdaysShort(m.day(i), ''), 'ddd', true).isValid(), true, 'parse short weekday ' + i);
+        assert.equal(moment(enLocale.weekdaysMin(m.day(i), ''), 'dd', true).isValid(), true, 'parse min weekday ' + i);
+
+        // negative tests
+        assert.equal(moment(enLocale.weekdaysMin(m.day(i), ''), 'ddd', true).isValid(), false, 'parse short weekday ' + i);
+        assert.equal(moment(enLocale.weekdaysShort(m.day(i), ''), 'dd', true).isValid(), false, 'parse min weekday ' + i);
+    }
+});
+
 test('lenient ordinal parsing of number', function (assert) {
     var i, testMoment;
     for (i = 1; i <= 31; ++i) {