UNPKG

4.54 kBJavaScriptView Raw
1import { __assign } from "tslib";
2import dateutil from '../dateutil';
3import { empty, repeat, pymod, includes } from '../helpers';
4import { M365MASK, MDAY365MASK, NMDAY365MASK, WDAYMASK, M365RANGE, M366MASK, MDAY366MASK, NMDAY366MASK, M366RANGE } from '../masks';
5export function rebuildYear(year, options) {
6 var firstyday = new Date(Date.UTC(year, 0, 1));
7 var yearlen = dateutil.isLeapYear(year) ? 366 : 365;
8 var nextyearlen = dateutil.isLeapYear(year + 1) ? 366 : 365;
9 var yearordinal = dateutil.toOrdinal(firstyday);
10 var yearweekday = dateutil.getWeekday(firstyday);
11 var result = __assign(__assign({ yearlen: yearlen,
12 nextyearlen: nextyearlen,
13 yearordinal: yearordinal,
14 yearweekday: yearweekday }, baseYearMasks(year)), { wnomask: null });
15 if (empty(options.byweekno)) {
16 return result;
17 }
18 result.wnomask = repeat(0, yearlen + 7);
19 var firstwkst;
20 var wyearlen;
21 var no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7);
22 if (no1wkst >= 4) {
23 no1wkst = 0;
24 // Number of days in the year, plus the days we got
25 // from last year.
26 wyearlen =
27 result.yearlen + pymod(yearweekday - options.wkst, 7);
28 }
29 else {
30 // Number of days in the year, minus the days we
31 // left in last year.
32 wyearlen = yearlen - no1wkst;
33 }
34 var div = Math.floor(wyearlen / 7);
35 var mod = pymod(wyearlen, 7);
36 var numweeks = Math.floor(div + mod / 4);
37 for (var j = 0; j < options.byweekno.length; j++) {
38 var n = options.byweekno[j];
39 if (n < 0) {
40 n += numweeks + 1;
41 }
42 if (!(n > 0 && n <= numweeks)) {
43 continue;
44 }
45 var i = void 0;
46 if (n > 1) {
47 i = no1wkst + (n - 1) * 7;
48 if (no1wkst !== firstwkst) {
49 i -= 7 - firstwkst;
50 }
51 }
52 else {
53 i = no1wkst;
54 }
55 for (var k = 0; k < 7; k++) {
56 result.wnomask[i] = 1;
57 i++;
58 if (result.wdaymask[i] === options.wkst)
59 break;
60 }
61 }
62 if (includes(options.byweekno, 1)) {
63 // Check week number 1 of next year as well
64 // orig-TODO : Check -numweeks for next year.
65 var i = no1wkst + numweeks * 7;
66 if (no1wkst !== firstwkst)
67 i -= 7 - firstwkst;
68 if (i < yearlen) {
69 // If week starts in next year, we
70 // don't care about it.
71 for (var j = 0; j < 7; j++) {
72 result.wnomask[i] = 1;
73 i += 1;
74 if (result.wdaymask[i] === options.wkst)
75 break;
76 }
77 }
78 }
79 if (no1wkst) {
80 // Check last week number of last year as
81 // well. If no1wkst is 0, either the year
82 // started on week start, or week number 1
83 // got days from last year, so there are no
84 // days from last year's last week number in
85 // this year.
86 var lnumweeks = void 0;
87 if (!includes(options.byweekno, -1)) {
88 var lyearweekday = dateutil.getWeekday(new Date(Date.UTC(year - 1, 0, 1)));
89 var lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7);
90 var lyearlen = dateutil.isLeapYear(year - 1) ? 366 : 365;
91 var weekst = void 0;
92 if (lno1wkst >= 4) {
93 lno1wkst = 0;
94 weekst = lyearlen + pymod(lyearweekday - options.wkst, 7);
95 }
96 else {
97 weekst = yearlen - no1wkst;
98 }
99 lnumweeks = Math.floor(52 + pymod(weekst, 7) / 4);
100 }
101 else {
102 lnumweeks = -1;
103 }
104 if (includes(options.byweekno, lnumweeks)) {
105 for (var i = 0; i < no1wkst; i++)
106 result.wnomask[i] = 1;
107 }
108 }
109 return result;
110}
111function baseYearMasks(year) {
112 var yearlen = dateutil.isLeapYear(year) ? 366 : 365;
113 var firstyday = new Date(Date.UTC(year, 0, 1));
114 var wday = dateutil.getWeekday(firstyday);
115 if (yearlen === 365) {
116 return {
117 mmask: M365MASK,
118 mdaymask: MDAY365MASK,
119 nmdaymask: NMDAY365MASK,
120 wdaymask: WDAYMASK.slice(wday),
121 mrange: M365RANGE
122 };
123 }
124 return {
125 mmask: M366MASK,
126 mdaymask: MDAY366MASK,
127 nmdaymask: NMDAY366MASK,
128 wdaymask: WDAYMASK.slice(wday),
129 mrange: M366RANGE
130 };
131}
132//# sourceMappingURL=yearinfo.js.map
\No newline at end of file