UNPKG

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