UNPKG

4.24 kBJavaScriptView Raw
1import { __assign } from "tslib";
2import { Frequency } from './types';
3import { Weekday } from './weekday';
4import dateutil from './dateutil';
5import { Days } from './rrule';
6export function parseString(rfcString) {
7 var options = rfcString
8 .split('\n')
9 .map(parseLine)
10 .filter(function (x) { return x !== null; });
11 return __assign(__assign({}, options[0]), options[1]);
12}
13export function parseDtstart(line) {
14 var options = {};
15 var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line);
16 if (!dtstartWithZone) {
17 return options;
18 }
19 var tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2];
20 if (tzid) {
21 options.tzid = tzid;
22 }
23 options.dtstart = dateutil.untilStringToDate(dtstart);
24 return options;
25}
26function parseLine(rfcString) {
27 rfcString = rfcString.replace(/^\s+|\s+$/, '');
28 if (!rfcString.length)
29 return null;
30 var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase());
31 if (!header) {
32 return parseRrule(rfcString);
33 }
34 var key = header[1];
35 switch (key.toUpperCase()) {
36 case 'RRULE':
37 case 'EXRULE':
38 return parseRrule(rfcString);
39 case 'DTSTART':
40 return parseDtstart(rfcString);
41 default:
42 throw new Error("Unsupported RFC prop ".concat(key, " in ").concat(rfcString));
43 }
44}
45function parseRrule(line) {
46 var strippedLine = line.replace(/^RRULE:/i, '');
47 var options = parseDtstart(strippedLine);
48 var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';');
49 attrs.forEach(function (attr) {
50 var _a = attr.split('='), key = _a[0], value = _a[1];
51 switch (key.toUpperCase()) {
52 case 'FREQ':
53 options.freq = Frequency[value.toUpperCase()];
54 break;
55 case 'WKST':
56 options.wkst = Days[value.toUpperCase()];
57 break;
58 case 'COUNT':
59 case 'INTERVAL':
60 case 'BYSETPOS':
61 case 'BYMONTH':
62 case 'BYMONTHDAY':
63 case 'BYYEARDAY':
64 case 'BYWEEKNO':
65 case 'BYHOUR':
66 case 'BYMINUTE':
67 case 'BYSECOND':
68 var num = parseNumber(value);
69 var optionKey = key.toLowerCase();
70 // eslint-disable-next-line @typescript-eslint/ban-ts-comment
71 // @ts-ignore
72 options[optionKey] = num;
73 break;
74 case 'BYWEEKDAY':
75 case 'BYDAY':
76 options.byweekday = parseWeekday(value);
77 break;
78 case 'DTSTART':
79 case 'TZID':
80 // for backwards compatibility
81 var dtstart = parseDtstart(line);
82 options.tzid = dtstart.tzid;
83 options.dtstart = dtstart.dtstart;
84 break;
85 case 'UNTIL':
86 options.until = dateutil.untilStringToDate(value);
87 break;
88 case 'BYEASTER':
89 options.byeaster = Number(value);
90 break;
91 default:
92 throw new Error("Unknown RRULE property '" + key + "'");
93 }
94 });
95 return options;
96}
97function parseNumber(value) {
98 if (value.indexOf(',') !== -1) {
99 var values = value.split(',');
100 return values.map(parseIndividualNumber);
101 }
102 return parseIndividualNumber(value);
103}
104function parseIndividualNumber(value) {
105 if (/^[+-]?\d+$/.test(value)) {
106 return Number(value);
107 }
108 return value;
109}
110function parseWeekday(value) {
111 var days = value.split(',');
112 return days.map(function (day) {
113 if (day.length === 2) {
114 // MO, TU, ...
115 return Days[day]; // wday instanceof Weekday
116 }
117 // -1MO, +3FR, 1SO, 13TU ...
118 var parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/);
119 if (!parts || parts.length < 3) {
120 throw new SyntaxError("Invalid weekday string: ".concat(day));
121 }
122 var n = Number(parts[1]);
123 var wdaypart = parts[2];
124 var wday = Days[wdaypart].weekday;
125 return new Weekday(wday, n);
126 });
127}
128//# sourceMappingURL=parsestring.js.map
\No newline at end of file