aboutsummaryrefslogtreecommitdiff
path: root/static/formatters.ts
blob: e00182788d61169a7572bbafdf8d3247b559c608 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
export {
    format
}

import { makeElement } from './lib'
import { VEvent } from './vevent'

type formatter = (e: HTMLElement, d: VEvent, s: any) => Promise<void>

declare global {
    interface Window {
        formatters: Map<string, formatter>;
    }
}

let formatters: Map<string, formatter>;
formatters = window.formatters = new Map();

async function format(targetElement: HTMLElement, data: VEvent, key: string): Promise<void> {
    let d = data.getProperty(key);
    if (!d) return
    let formatter = formatters.get(key.toLowerCase());
    if (formatter) {
        try {
            await formatter(targetElement, data, d);
        } catch (error) {
            console.warn('Formatter failed')
            console.warn(error);
            formatters.get('default')!(targetElement, data, d);
        }
    } else {
        formatters.get('default')!(targetElement, data, d);
    }
}

formatters.set('categories', async (el, _, d) => {
    for (let item of d) {
        let q = encodeURIComponent(
            `(member "${item}" (or (prop event (quote CATEGORIES)) (quote ())))`)
        el.appendChild(makeElement('a', {
            textContent: item,
            href: `/search/?q=${q}`,
        }))
    }
})

async function format_time_tag(el: HTMLElement, ev: VEvent, d: any): Promise<void> {
    if (el instanceof HTMLTimeElement) {
        if (d instanceof Date) {
            let fmt = '';
            if (!d.utc) {
                fmt += '~L';
            }
            fmt += '~Y-~m-~d'
            if (!d.dateonly) {
                fmt += 'T~H:~M:~S'
            }
            el.dateTime = d.format(fmt);
        }
    }

    formatters.get('default')!(el, ev, d);
}

formatters.set('dtstart', format_time_tag)
formatters.set('dtend', format_time_tag)

formatters.set('default', async (el, _, d) => {
    let fmt;
    if ((fmt = el.dataset.fmt)) {
        el.textContent = d.format(fmt);
    } else {
        el.textContent = d;
    }
})