interlanguage-checker/src/main/js/Main.ts

172 lines
6.1 KiB
TypeScript
Raw Normal View History

2021-05-14 18:02:04 +02:00
// @ts-ignore
2021-04-28 13:48:50 +02:00
const {$, doAfterLoad, footer, header, nav} = window.fwdekker;
import {ErrorHandler, InterlangTable, MessageHandler, ValidatableInput} from "./DOM";
import {discoverNetwork, InterlangNetwork, MediaWiki, MediaWikiManager} from "./MediaWiki";
// Contains global functions for debugging
2021-05-14 18:02:04 +02:00
// @ts-ignore
window.ilc = {};
// Set up template
doAfterLoad(() => {
2020-07-29 14:39:56 +02:00
$("#nav").appendChild(nav("/Tools/Interlanguage Checker/"));
$("#header").appendChild(header({
title: "Interlanguage Checker",
2020-05-05 00:59:31 +02:00
description: "Check the consistency of MediaWiki interlanguage links in a simple overview"
}));
$("#footer").appendChild(footer({
vcsURL: "https://git.fwdekker.com/FWDekker/interlanguage-checker/",
version: "v%%VERSION_NUMBER%%"
}));
2021-04-28 13:48:50 +02:00
$("main").classList.remove("hidden");
});
2020-04-11 12:25:15 +02:00
// Handle "About" toggle
doAfterLoad(() => {
const about = $("#about");
const key = "/tools/interlanguage-checker//toggle-about";
about.addEventListener("toggle", () => localStorage.setItem(key, "" + !!about.open));
const storedState = localStorage.getItem(key);
if (storedState === null) about.open = true;
else about.open = storedState === "true";
});
2020-04-11 12:25:15 +02:00
// Handle input
2020-04-11 12:25:15 +02:00
doAfterLoad(async () => {
const urlInput = new ValidatableInput($("#url"), (value) => {
if (value.trim() === "")
return "API URL must not be empty.";
2020-04-11 12:25:15 +02:00
try {
new URL(value); // Throws exception if invalid
2020-04-11 12:25:15 +02:00
return "";
} catch (error) {
2020-04-18 13:04:30 +02:00
try {
// noinspection HttpUrlsUsage
const url = `http://${value}`;
new URL(url); // Throws exception if invalid
$("#url").value = url;
2020-04-18 13:04:30 +02:00
return "";
} catch {
return error.message;
}
2020-04-11 12:25:15 +02:00
}
});
const articleInput = new ValidatableInput($("#article"), (value) => {
return value.trim() === "" ? "Article must not be empty" : "";
2020-04-11 12:25:15 +02:00
});
const checkButton = $("#check");
const errorHandler = new ErrorHandler($("#errors"));
const messageHandler = new MessageHandler($("#messages"))
.setCallback((level, message) => {
if (level === "error") console.error(message);
});
2020-04-11 12:25:15 +02:00
2021-05-14 18:02:04 +02:00
let previousUrl: string | undefined;
let mwm: MediaWikiManager | undefined;
2020-04-11 12:25:15 +02:00
const submit = async () => {
localStorage.setItem("/tools/interlanguage-checker//api-url", urlInput.getValue());
2020-04-11 12:25:15 +02:00
// Clean up
urlInput.showBlank();
articleInput.showBlank();
errorHandler.clear();
messageHandler.clear();
2020-04-11 12:25:15 +02:00
const oldTable = $("#networkTable");
if (oldTable !== null)
oldTable.parentNode.removeChild(oldTable);
// Validate
const urlValidity = urlInput.validate();
if (urlValidity !== "") return messageHandler.handle("error", urlValidity);
2020-04-11 12:25:15 +02:00
const articleValidity = articleInput.validate();
if (articleValidity !== "") return messageHandler.handle("error", articleValidity);
2020-04-11 12:25:15 +02:00
// Initialize
if (urlInput.getValue() !== previousUrl) {
messageHandler.handle("progress", `Initializing <code>${urlInput.getValue()}</code>`);
2020-04-11 12:25:15 +02:00
try {
const mw = await new MediaWiki(urlInput.getValue()).init();
2020-04-11 12:25:15 +02:00
mwm = await new MediaWikiManager().init(mw);
} catch (error) {
messageHandler.handle("error", error);
2020-04-11 12:25:15 +02:00
return;
}
previousUrl = urlInput.getValue();
}
// Discover
discoverNetwork(
2021-05-14 18:02:04 +02:00
mwm!,
articleInput.getValue(),
(level, message) => errorHandler.handle(level, message),
it => messageHandler.handle("progress", it)
)
2020-04-17 17:39:17 +02:00
.then(it => new InterlangNetwork(it.pages, it.redirects))
.then(network => {
messageHandler.handle("progress", "Creating table");
2020-04-11 12:25:15 +02:00
const form = $("#networkTableForm");
form.textContent = "";
2021-04-24 22:05:20 +02:00
form.appendChild((new InterlangTable()).render("networkTable", network));
2020-04-11 12:25:15 +02:00
2021-05-14 18:02:04 +02:00
switch (network.getNetworkVerdict()) {
case "perfect":
messageHandler.handle("complete", "A perfect network! 🙂");
break;
case "broken":
messageHandler.handle("warning", "The network is broken 😞<br />Hover over an icon in the left column for more information.");
break;
case "flawed":
messageHandler.handle("warning", "The network is complete but flawed 😕<br />Hover over an icon in the left column for more information.");
break;
}
2020-04-11 12:25:15 +02:00
})
.catch(error => messageHandler.handle("error", error));
2020-04-11 12:25:15 +02:00
};
urlInput.input.addEventListener("keypress", (event) => {
if (event.key.toLowerCase() === "enter") submit();
});
articleInput.input.addEventListener("keypress", (event) => {
2020-04-11 12:25:15 +02:00
if (event.key.toLowerCase() === "enter") submit();
});
checkButton.addEventListener("click", () => submit());
2020-06-07 13:08:22 +02:00
urlInput.input.focus() // Default focus
// Read inputs from cookies
const apiUrl = localStorage.getItem("/tools/interlanguage-checker//api-url");
2020-08-12 11:32:23 +02:00
if (apiUrl !== null && apiUrl.trim() !== "") {
urlInput.setValue(apiUrl);
articleInput.input.focus();
}
// Read inputs from URL
const currentParams = new URLSearchParams(window.location.search);
if (currentParams.has("api")) {
2021-05-14 18:02:04 +02:00
urlInput.setValue(currentParams.get("api")!);
articleInput.input.focus();
}
2021-05-14 18:02:04 +02:00
if (currentParams.has("article")) articleInput.setValue(currentParams.get("article")!);
if (currentParams.has("api") && currentParams.has("article")) await submit();
// Set global debug function
2021-05-14 18:02:04 +02:00
// @ts-ignore
window.ilc.getCurrentInputAsUrl = () =>
location.href.split("?")[0] +
`?api=${encodeURI(urlInput.getValue())}` +
`&article=${encodeURI(articleInput.getValue())}`;
2020-04-11 12:25:15 +02:00
});