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.split('\n').map(parseLine).filter(function (x) { return x !== null; });
|
8 | return __assign(__assign({}, options[0]), options[1]);
|
9 | }
|
10 | export 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 | }
|
23 | function 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 | }
|
42 | function 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 |
|
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 |
|
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 | }
|
93 | function parseNumber(value) {
|
94 | if (value.indexOf(',') !== -1) {
|
95 | var values = value.split(',');
|
96 | return values.map(parseIndividualNumber);
|
97 | }
|
98 | return parseIndividualNumber(value);
|
99 | }
|
100 | function parseIndividualNumber(value) {
|
101 | if (/^[+-]?\d+$/.test(value)) {
|
102 | return Number(value);
|
103 | }
|
104 | return value;
|
105 | }
|
106 | function parseWeekday(value) {
|
107 | var days = value.split(',');
|
108 | return days.map(function (day) {
|
109 | if (day.length === 2) {
|
110 |
|
111 | return Days[day];
|
112 | }
|
113 |
|
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 |
|
\ | No newline at end of file |