diff options
Diffstat (limited to 'js/init.ts')
-rw-r--r-- | js/init.ts | 118 |
1 files changed, 110 insertions, 8 deletions
@@ -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`); + } } |