]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Refactor week initialization
authorIskren Chernev <iskren.chernev@gmail.com>
Sat, 3 May 2014 08:03:10 +0000 (01:03 -0700)
committerIskren Chernev <iskren.chernev@gmail.com>
Sat, 3 May 2014 08:03:10 +0000 (01:03 -0700)
moment.js
test/moment/create.js

index c5ca0bd496a80a7946d5f6486ae905be48f6cad0..c0070c93ffd1c1821e57791a95bd18d581201fed 100644 (file)
--- a/moment.js
+++ b/moment.js
 
         lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
 
+    function dfl() {
+        var i;
+        for (i = 0; i < arguments.length; ++i) {
+            if (arguments[i] != null) {
+                return arguments[i];
+            }
+        }
+        return null;
+    }
+
     function defaultParsingFlags() {
         // We need to deep clone this object, and es5 standard is not very
         // helpful.
             config._useUTC = true;
             config._tzm = timezoneMinutesFromString(input);
             break;
+        case 'dd':
+        case 'ddd':
+        case 'dddd':
+            a = getLangDefinition(config._l).weekdaysParse(input);
+            // if we didn't get a weekday name, mark the date as invalid
+            if (a != null) {
+                config._w = config._w || {};
+                config._w['d'] = a;
+            }
+            break;
         case 'w':
         case 'ww':
         case 'W':
         case 'WW':
         case 'd':
-        case 'dd':
-        case 'ddd':
-        case 'dddd':
         case 'e':
         case 'E':
             token = token.substr(0, 1);
             /* falls through */
-        case 'gg':
         case 'gggg':
-        case 'GG':
         case 'GGGG':
         case 'GGGGG':
             token = token.substr(0, 2);
             if (input) {
                 config._w = config._w || {};
-                config._w[token] = input;
+                config._w[token] = toInt(input);
             }
             break;
+        case 'gg':
+        case 'GG':
+            config._w = config._w || {};
+            config._w[token] = moment.parseTwoDigitYear(input);
+        }
+    }
+
+    function dayOfYearFromWeekInfo(config) {
+        var w, weekYear, week, weekday, dow, doy, temp, lang;
+
+        w = config._w;
+        if (w.GG != null || w.W != null || w.E != null) {
+            dow = 1;
+            doy = 4;
+
+            // TODO: We need to take the current isoWeekYear, but that depends on
+            // how we interpret now (local, utc, fixed offset). So create
+            // a now version of current config (take local/utc/offset flags, and
+            // create now).
+            weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);
+            week = dfl(w.W, 1);
+            weekday = dfl(w.E, 1);
+        } else {
+            lang = getLangDefinition(config._l);
+            dow = lang._week.dow;
+            doy = lang._week.doy;
+
+            weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);
+            week = dfl(w.w, 1);
+
+            if (w.d != null) {
+                // weekday -- low day numbers are considered next week
+                weekday = w.d;
+                if (weekday < dow) {
+                    ++week;
+                }
+            } else if (w.e != null) {
+                // local weekday -- counting starts from begining of week
+                weekday = w.e + dow;
+            } else {
+                // default to begining of week
+                weekday = dow;
+            }
         }
+        temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
+
+        config._a[YEAR] = temp.year;
+        config._dayOfYear = temp.dayOfYear;
     }
 
     // convert an array to a date.
     // note: all values past the year are optional and will default to the lowest possible value.
     // [year, month, day , hour, minute, second, millisecond]
     function dateFromConfig(config) {
-        var i, date, input = [], currentDate,
-            yearToUse, fixYear, w, temp, lang, weekday, week;
+        var i, date, input = [], currentDate, yearToUse;
 
         if (config._d) {
             return;
 
         //compute day of the year from weeks and weekdays
         if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
-            fixYear = function (val) {
-                var intVal = parseInt(val, 10);
-                return val ?
-                  (val.length < 3 ? (intVal > 68 ? 1900 + intVal : 2000 + intVal) : intVal) :
-                  (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]);
-            };
-
-            w = config._w;
-            if (w.GG != null || w.W != null || w.E != null) {
-                temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1);
-            }
-            else {
-                lang = getLangDefinition(config._l);
-                weekday = w.d != null ? parseWeekday(w.d, lang) :
-                  ((w.e != null ? parseInt(w.e, 10) : 0) + lang._week.dow);
-
-                week = parseInt(w.w, 10) || 1;
-
-                //if we're parsing 'd', then the low day numbers may be next week
-                if (w.d != null && weekday < lang._week.dow) {
-                    week++;
-                }
-
-                temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow);
-            }
-
-            config._a[YEAR] = temp.year;
-            config._dayOfYear = temp.dayOfYear;
+            dayOfYearFromWeekInfo(config);
         }
 
         //if the day of the year is set, figure out what it is
         if (config._dayOfYear) {
-            yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR];
+            yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);
 
             if (config._dayOfYear > daysInYear(yearToUse)) {
                 config._pf._overflowDayOfYear = true;
index 9c5cc84945be1117d5884d20d30f2ae7c4654bc5..a96f016e925546bee61179d4f5af36df2dd091dc 100644 (file)
@@ -803,7 +803,7 @@ exports.create = {
     "parsing week and weekday information" : function (test) {
         var ver = getVerifier(test);
 
-        //year
+        // year
         ver('12', 'gg', "2012 01 01", 'week-year two digits');
         ver('2012', 'gggg', "2012 01 01", 'week-year four digits');
 
@@ -816,7 +816,7 @@ exports.create = {
         ver('13', 'GG', "2012 12 31", 'iso week-year two digits previous year');
         ver('2013', 'GGGG', "2012 12 31", 'iso week-year four digits previous year');
 
-        //yer + week
+        // year + week
         ver('1999 37', 'gggg w', "1999 09 05", 'week');
         ver('1999 37', 'gggg ww', "1999 09 05", 'week double');
         ver('1999 37', 'GGGG W', "1999 09 13", 'iso week');
@@ -828,13 +828,13 @@ exports.create = {
         ver('1999 37 4', 'gggg ww e', "1999 09 09", 'day');
         ver('1999 37 04', 'gggg ww e', "1999 09 09", 'day wide', true);
 
-        //yer + week + day
+        // year + week + day
         ver('1999 37 4', 'gggg ww d', "1999 09 09", 'd');
         ver('1999 37 Th', 'gggg ww dd', "1999 09 09", 'dd');
         ver('1999 37 Thu', 'gggg ww ddd', "1999 09 09", 'ddd');
         ver('1999 37 Thursday', 'gggg ww dddd', "1999 09 09", 'dddd');
 
-        //lower-order only
+        // lower-order only
         test.equal(moment('22', 'ww').week(), 22, "week sets the week by itself");
         test.equal(moment('22', 'ww').weekYear(), moment().weekYear(), "week keeps this year");
         test.equal(moment('2012 22', 'YYYY ww').weekYear(), 2012, "week keeps parsed year");
@@ -843,7 +843,7 @@ exports.create = {
         test.equal(moment('2012 22', 'YYYY WW').weekYear(), 2012, "iso week keeps parsed year");
         test.equal(moment('22', 'WW').weekYear(), moment().weekYear(), "iso week keeps this year");
 
-        //order
+        // order
         ver('6 2013 2', 'e gggg w', "2013 01 12", "order doesn't matter");
         ver('6 2013 2', 'E GGGG W', "2013 01 12", "iso order doesn't matter");