window.formatters.set('description', async (el, ev, d) => {
if (ev.getProperty('X-MICROSOFT-SKYPETEAMSMEETINGURL')) {
/* parse Microsoft Teams meeting entries */
/* Replace lines with propper
tags */
let rx1 = /^_+$/gm
/* Merge URL:s into a tags */
let rx2 = /(?^|[|])\s*(?[^|<\n]*)<(?[^>]*)>/gm
let rxs = [`(?${rx1.source})`,
`(?${rx2.source})`,
].join('|')
let rx = new RegExp(`(${rxs})`, 'gm')
let children = []
let idx = 0
for (let match of d.matchAll(rx)) {
children.push(d.substring(idx, match.index))
if (match.groups.line) {
children.push(document.createElement('hr'))
children.push(document.createElement('br'))
} else if (match.groups.link) {
if (match.groups.pipe === '|') {
children.push('| ');
}
let a = document.createElement('a')
a.textContent = match.groups.name || match.groups.url
a.href = match.groups.url
children.push(a)
}
idx = match.index + match[0].length
}
children.push(d.substring(idx));
el.replaceChildren(...children);
} else if (/<\/?\w+( +\w+(=["']?\w+["']?)?)* *\/?>/.exec(d)) {
/* Assume that the text is HTML if it contains something which looks
like an HTML tag */
let parser = new DOMParser();
let doc = parser.parseFromString(d, 'text/html');
el.replaceChildren(doc.body);
} else {
/* Otherwise it should be plain(er) text, parse "all" links */
let rx = /https?:\/\/\S+/g
let idx = 0;
let children = []
for (let match of d.matchAll(rx)) {
let anch = document.createElement('a')
anch.href = match[0]
anch.textContent = match[0]
children.push(d.substring(idx, match.index))
children.push(anch)
idx = match.index + match[0].length
}
children.push(d.substring(idx))
el.replaceChildren(...children);
}
})
/* This location formatter is generally not for general use.
It holds a small lookup table of "all" locations at Linköping University,
and makes location names from their calendar system clickable.
To obtain salar.json, run scripts/fetch-liu-map-index.scm from calps source tree.
*/
window.salar = new Promise((resolve, reject) =>
fetch('/static/user/salar.json')
.then(resp => ! resp.ok ? reject("404") : resp.json())
.then(d => resolve(d))
.catch(err => reject(err))
)
window.formatters.set('location', async function(el, _, d) {
let salar;
try {
salar = await window.salar;
} catch (e) {
console.warn("Location formatter failed", e);
return;
}
let rx = /Lokal: ([A-Za-z0-9]*)?/g
let idx = 0;
let children = []
for (let match of d.matchAll(rx)) {
children.push(d.substring(idx, match.index))
let name = match[1]
let frag = salar[name.toUpperCase()];
if (frag) {
let anch = document.createElement('a');
anch.href = `https://old.liu.se/karta/${frag}`
anch.target = '_blank'
anch.textContent = name;
children.push('Lokal: ');
children.push(anch);
} else {
children.push(`Lokal: ${name}`)
}
idx = match.index + match[0].length
}
children.push(d.substring(idx));
el.replaceChildren(...children)
})