rrule
Version:
JavaScript library for working with recurrence rules for calendar dates.
137 lines • 4.5 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import { Frequency } from './types';
import { Weekday } from './weekday';
import dateutil from './dateutil';
import { Days } from './rrule';
export function parseString(rfcString) {
var options = rfcString.split('\n').map(parseLine).filter(function (x) { return x !== null; });
return __assign({}, options[0], options[1]);
}
export function parseDtstart(line) {
var options = {};
var dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line);
if (!dtstartWithZone) {
return options;
}
var _ = dtstartWithZone[0], tzid = dtstartWithZone[1], dtstart = dtstartWithZone[2];
if (tzid) {
options.tzid = tzid;
}
options.dtstart = dateutil.untilStringToDate(dtstart);
return options;
}
function parseLine(rfcString) {
rfcString = rfcString.replace(/^\s+|\s+$/, '');
if (!rfcString.length)
return null;
var header = /^([A-Z]+?)[:;]/.exec(rfcString.toUpperCase());
if (!header) {
return parseRrule(rfcString);
}
var _ = header[0], key = header[1];
switch (key.toUpperCase()) {
case 'RRULE':
case 'EXRULE':
return parseRrule(rfcString);
case 'DTSTART':
return parseDtstart(rfcString);
default:
throw new Error("Unsupported RFC prop " + key + " in " + rfcString);
}
}
function parseRrule(line) {
var strippedLine = line.replace(/^RRULE:/i, '');
var options = parseDtstart(strippedLine);
var attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';');
attrs.forEach(function (attr) {
var _a = attr.split('='), key = _a[0], value = _a[1];
switch (key.toUpperCase()) {
case 'FREQ':
options.freq = Frequency[value.toUpperCase()];
break;
case 'WKST':
options.wkst = Days[value.toUpperCase()];
break;
case 'COUNT':
case 'INTERVAL':
case 'BYSETPOS':
case 'BYMONTH':
case 'BYMONTHDAY':
case 'BYYEARDAY':
case 'BYWEEKNO':
case 'BYHOUR':
case 'BYMINUTE':
case 'BYSECOND':
var num = parseNumber(value);
var optionKey = key.toLowerCase();
// @ts-ignore
options[optionKey] = num;
break;
case 'BYWEEKDAY':
case 'BYDAY':
options.byweekday = parseWeekday(value);
break;
case 'DTSTART':
case 'TZID':
// for backwards compatibility
var dtstart = parseDtstart(line);
options.tzid = dtstart.tzid;
options.dtstart = dtstart.dtstart;
break;
case 'UNTIL':
options.until = dateutil.untilStringToDate(value);
break;
case 'BYEASTER':
options.byeaster = Number(value);
break;
default:
throw new Error("Unknown RRULE property '" + key + "'");
}
});
return options;
}
function parseNumber(value) {
if (value.indexOf(',') !== -1) {
var values = value.split(',');
return values.map(function (val) {
if (/^[+-]?\d+$/.test(val.toString())) {
return Number(val);
}
else {
return val;
}
});
}
else if (/^[+-]?\d+$/.test(value)) {
return Number(value);
}
return value;
}
function parseWeekday(value) {
var days = value.split(',');
return days.map(function (day) {
if (day.length === 2) {
// MO, TU, ...
return Days[day]; // wday instanceof Weekday
}
else {
// -1MO, +3FR, 1SO, ...
var parts = day.match(/^([+-]?\d)([A-Z]{2})$/);
var n = Number(parts[1]);
var wdaypart = parts[2];
var wday = Days[wdaypart].weekday;
return new Weekday(wday, n);
}
});
}
//# sourceMappingURL=parsestring.js.map