UNPKG

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