From c6c65f9e8273a5bc1b2ac1155d66003d2b98591c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 4 Oct 2021 17:40:59 +0200 Subject: {.js => .ts} on relavant files. --- static/rrule.ts | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 static/rrule.ts (limited to 'static/rrule.ts') diff --git a/static/rrule.ts b/static/rrule.ts new file mode 100644 index 00000000..e7377370 --- /dev/null +++ b/static/rrule.ts @@ -0,0 +1,100 @@ +function recur_xml_to_rrule(dom_element) { + let rr = new RRule; + for (let child of dom_element.children) { + let key = child.tagName; /* freq */ + let val = child.textContent; /* weekly */ + rr[key] = val; + } + return rr; +} + +function recur_jcal_to_rrule(jcal) { + let rr = new RRule; + for (var key in jcal) { + rr[key] = jcal[key]; + } + return rr; +} + +class RRule { + + /* direct access to fields is fine */ + /* setting them however requires methods, since there might + be listeners */ + + fields = ['freq', 'until', 'count', 'interval', + 'bysecond', 'byminute', 'byhour', + 'bymonthday', 'byyearday', 'byweekno', + 'bymonth', 'bysetpos', 'wkst', + 'byday' + ] + + constructor() { + + this.listeners = {} + + for (let f of this.fields) { + this[f] = false; + Object.defineProperty( + this, f, { + /* + TODO many of the fields should be wrapped + in type tags. e.g. elements are either + or , NOT a raw date. + by* fields should be wrapped with multiple values. + */ + get: () => this['_' + f], + set: (v) => { + this['_' + f] = v + for (let l of this.listeners[f]) { + l(v); + } + } + }); + this.listeners[f] = []; + } + } + + addListener(field, proc) { + this.listeners[field].push(proc); + } + + /* NOTE this function is probably never used. + Deperate it and refer to RRule.asJcal + together with jcal_to_xcal */ + asXcal(doc) { + /* TODO empty case */ + // let str = ""; + let root = doc.createElementNS(xcal, 'recur'); + for (let f of this.fields) { + let v = this.fields[f]; + if (! v) continue; + let tag = doc.createElementNS(xcal, f); + /* TODO type formatting */ + tag.textContent = `${v}`; + root.appendChild(tag); + } + return root; + } + + asJcal() { + let obj = {}; + for (let f of this.fields) { + let v = this[f]; + if (! v) continue; + /* TODO special formatting for some types */ + obj[f] = v; + } + return obj; + } + + /* + asIcal() { + return this.fields + .map(f => [f, this.fields[f]]) + .filter([_, v] => v) + .map(([k, v]) => `${k}=${v}`) + .join(';'); + } + */ +}; -- cgit v1.2.3