summaryrefslogtreecommitdiff
path: root/js/init.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/init.ts')
-rw-r--r--js/init.ts118
1 files changed, 110 insertions, 8 deletions
diff --git a/js/init.ts b/js/init.ts
index 020171b..f249902 100644
--- a/js/init.ts
+++ b/js/init.ts
@@ -1,12 +1,114 @@
-/// <reference path="navigation.ts" />
-/// <reference path="theme.ts" />
+namespace Ach {
+ export async function init() {
+ Ach.loadTheme();
-function init() {
- window.addEventListener("popstate", (_e) => {
- location.reload();
- });
+ Ach.initImages();
+ Ach.initLinks();
- loadTheme();
+ window.addEventListener("popstate", (_e) => {
+ location.reload();
+ });
+ }
- initImages();
+ export async function initImages() {
+ let page = Ach.getOnlyElement(document, "page");
+
+ let imageList = Array.from(page.getElementsByTagName("x-image"));
+
+ for (let image of imageList) {
+ let alt = image.getAttribute("alt");
+ let file = image.getAttribute("data-file");
+
+ if (!alt) {
+ alert("stupid superuser forgot to add image caption, please notify");
+ alt = "";
+ }
+
+ if (!file) {
+ throw new Error("file not set for image element");
+ }
+
+ console.log("initialising image that links to \"" + file + "\"");
+
+ let sourceUrl = "/image/source/" + file + ".webp";
+ let thumbnailUrl = "/image/thumbnail/" + file + ".avif";
+
+ let blurElement = document.createElement("img");
+ blurElement.setAttribute("class", "blur");
+ blurElement.setAttribute("src", thumbnailUrl);
+
+ let hyperlinkElement = document.createElement("a");
+ hyperlinkElement.setAttribute("href", sourceUrl);
+ hyperlinkElement.setAttribute("rel", "noopener noreferrer");
+ hyperlinkElement.setAttribute("target", "_blank");
+
+ let image_element = document.createElement("img");
+ image_element.setAttribute("alt", alt);
+ image_element.setAttribute("src", thumbnailUrl);
+
+ hyperlinkElement.appendChild(image_element);
+
+ image.appendChild(blurElement);
+ image.appendChild(hyperlinkElement);
+ }
+ }
+
+ export async function initLinks() {
+ console.log("initialising links");
+
+ let stats = {
+ total: 0x0,
+ overrideCount: 0x0,
+ currentCount: 0x0,
+ };
+
+ for (let link of document.getElementsByTagName("a")) {
+ ++stats.total;
+
+ let address = link.getAttribute("href");
+
+ if (!address) {
+ console.log("note: skipping override of empty link");
+ continue;
+ }
+
+ let pageAnchor = Ach.parseInternalLink(address);
+
+ if (!pageAnchor) {
+ console.log(`note: skipping override of link to "${address}"`);
+ continue;
+ }
+
+ console.log(`note: overriding link to "${address}"`);
+ ++stats.overrideCount;
+
+ let command = `Ach.loadPage(${JSON.stringify(pageAnchor[0x0])}, ${JSON.stringify(pageAnchor[0x1])})`
+
+ link.removeAttribute("href");
+ link.setAttribute("data-page", pageAnchor[0x0]);
+ link.setAttribute("onclick", command);
+
+ if (pageAnchor[0x1]) {
+ link.setAttribute("data-anchor", pageAnchor[0x1]);
+ }
+ }
+
+ let currentPage = Ach.currentPage();
+
+ for (let link of document.getElementsByTagName("a")) {
+ let page = link.getAttribute("data-page");
+ let anchor = link.getAttribute("data-anchor");
+
+ if (page == currentPage && !anchor) {
+ ++stats.currentCount;
+ link.setAttribute("aria-current", "page");
+ } else {
+ link.setAttribute("aria-current", "false");
+ }
+ }
+
+ console.log(`note: initialised (${stats.total}) links`);
+ console.log(`note: of which (${stats.overrideCount}) overrides were done`);
+ console.log(`note: and of which (${stats.currentCount}) were marked as current`);
+ }
}