1 | import { __assign } from "tslib";
|
2 | import { Frequency } from './types';
|
3 | import { Weekday } from './weekday';
|
4 | import dateutil from './dateutil';
|
5 | import { Days } from './rrule';
|
6 | export 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 | }
|
13 | export 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 | }
|
26 | function 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 | }
|
45 | function 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 |
|
71 |
|
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 |
|
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 | }
|
97 | function parseNumber(value) {
|
98 | if (value.indexOf(',') !== -1) {
|
99 | var values = value.split(',');
|
100 | return values.map(parseIndividualNumber);
|
101 | }
|
102 | return parseIndividualNumber(value);
|
103 | }
|
104 | function parseIndividualNumber(value) {
|
105 | if (/^[+-]?\d+$/.test(value)) {
|
106 | return Number(value);
|
107 | }
|
108 | return value;
|
109 | }
|
110 | function parseWeekday(value) {
|
111 | var days = value.split(',');
|
112 | return days.map(function (day) {
|
113 | if (day.length === 2) {
|
114 |
|
115 | return Days[day];
|
116 | }
|
117 |
|
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 |
|
\ | No newline at end of file |