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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
(function () {
type second = number;
type millisecond = number;
const relative = new Intl.RelativeTimeFormat("en", {
localeMatcher: "best fit",
numeric: "always",
style: "long",
});
function viewport(element, options = { offset: 100 }) {
const view = element.getBoundingClientRect();
return view.top >= -options.offset && view.left >= -options.offset &&
view.bottom <= (window.innerHeight || self.documentElement.clientHeight) + options.offset &&
view.right <= (window.innerWidth || self.documentElement.clientWidth) + options.offset;
}
const date = function (update) {
const elements = document.querySelectorAll("time");
for (let i = 0; i < elements.length; ++i) {
const offscreen = !viewport(elements[i]);
const hidden = elements[i].offsetParent === null;
if ((update === "viewport") && (offscreen || hidden)) continue;
(function (element) {
try {
if (element.dataset.type === "disabled") return;
const time: millisecond = new Date(element.dateTime) || new Date();
const interval: second = ((new Date().getTime() - time.getTime()) / 1000);
const seconds: number = Math.round(interval);
const minutes: number = Math.round(seconds / 60);
const hours: number = Math.round(minutes / 60);
const days: number = Math.round(hours / 24);
const past = Math.sign(seconds) === 1;
const future = Math.sign(seconds) === -1;
let tiny = function (string, place) {
return string.split(" ").slice(0, place).join(" ") + string.split(" ")[place].charAt(0);
}
if (element.dataset.type === "default") { tiny = function (string) { return string; }; }
if (element.dataset.type === "localDate") {
return element.textContent = new Intl.DateTimeFormat([], {
dateStyle: "medium",
}).format(time).replace(",", "");
}
if (element.dataset.type === "localTime") {
return element.textContent = new Intl.DateTimeFormat([], {
hour12: false, timeStyle: "short",
}).format(time) + " " + new Intl.DateTimeFormat([], { timeZoneName: "short" }).format(time).split(" ")[1];
}
if (past) {
if (seconds <= 60) { return element.textContent = tiny(relative.format(-1 * seconds, "second",), 1); }
if (minutes <= 120) { return element.textContent = tiny(relative.format(-1 * minutes, "minute",), 1); }
if (hours <= 48) { return element.textContent = tiny(relative.format(-1 * hours, "hour",), 1); }
if (days <= 7) { return element.textContent = tiny(relative.format(-1 * days, "day",), 1); }
}
if (future) {
if (-1 * days >= 4) { return element.textContent = tiny(relative.format(-1 * days, "day",), 2); }
if (-1 * hours >= 3) { return element.textContent = tiny(relative.format(-1 * hours, "hour",), 2); }
if (-1 * minutes >= 2) { return element.textContent = tiny(relative.format(-1 * minutes, "minute",), 2); }
if (-1 * seconds >= 1) { return element.textContent = tiny(relative.format(-1 * seconds, "second",), 2); }
}
} catch (error) {
console.error(
"Error: Unable to resolve relative time format!",
error,
);
}
})(elements[i]);
}
};
const substitution = setInterval(date, 4);
self.addEventListener("DOMContentLoaded", function () {
setTimeout(function () {
clearInterval(substitution);
setInterval(function () { date("viewport"); }, 1000);
}, 1000);
});
})();
|