Files
com.xaymar.www/assets/js/highlight.mjs
T
Michael Fabian 'Xaymar' Dirks 3f0782d1cf Add workaround for 429 Too Many Requests
Firefox has an annoying bug that they refuse to fix where returning a valid 429 response is considered an aborted connection. Firefox makes no additional attempts at retrying, no matter what the request may have been. Chromium and even Internet Explorer handle this correctly.
2024-06-02 06:24:10 +02:00

123 lines
2.5 KiB
JavaScript

'use strict';
// Highlight.JS: https://highlightjs.org/
async function initializeHighlightJS() {
const languageRE = /\blanguage-([a-zA-Z0-9_\-]+)\b/gi;
const noLanguageRE = /\bno-language\b/gi;
const languages = [
"apache",
"asciidoc",
"autohotkey",
"bash",
"basic",
"c",
"cmake",
"cpp",
"csharp",
"css",
"d",
"diff",
"gcode",
"glsl",
"go",
"gradle",
"graphql",
"http",
"ini",
"java",
"javascript",
"json",
"kotlin",
"latex",
"less",
"llvm",
"lua",
"makefile",
"markdown",
"nginx",
"objectivec",
"oxygene",
"perl",
"php",
"php-template",
"plaintext",
"protobuf",
"python",
"python-repl",
"r",
"ruby",
"rust",
"scss",
"shell",
"sql",
"swift",
"typescript",
"vbnet",
"wasm",
"xml",
"yaml",
];
console.log("highlight.JS: Loading...");
let highlightJS = await import("./highlightjs/highlight.mjs");
window.highlightJS = highlightJS.default;
console.log("highlight.JS: Configuring...");
window.highlightJS.configure({
"noHighlightRe": noLanguageRE,
"languageDetectRe": languageRE,
"cssSelector": "code.block[class*=\"language\"]",
"throwUnescapedHTML": true,
});
// Import all languages.
let langs = [];
for (let lang of languages) {
console.log(`highlight.JS: Importing language definition for '${lang}'...`);
langs.push(new Promise(async (resolve, reject) => {
const start = performance.now();
const max_attempts = 5;
let attempt = 0;
let mod = undefined;
let err = null;
for (let attempt = 1; attempt <= 5; attempt++) {
try {
mod = await import(`./highlightjs/languages/${lang}.min.js`);
break;
} catch(ex) {
err = ex;
await new Promise((resolve, reject) => {
setTimeout(() => {resolve()}, 1000);
})
}
}
if (!mod) {
reject(err);
} else {
window.highlightJS.registerLanguage(lang, mod.default);
console.log(`highlight.JS: Imported language definition for '${lang}' after ${(performance.now() - start).toFixed(2)}ms.`);
resolve(mod);
}
}));
}
await Promise.allSettled(langs)
// Highlight everything.
function highlightAllCode() {
console.log(`highlight.JS: Applying highlighting all valid code blocks...`);
window.highlightJS.highlightAll();
};
if (document.readyState === "complete"
|| document.readyState === "loaded"
|| document.readyState === "interactive") {
highlightAllCode();
} else {
document.addEventListener('DOMContentLoaded', () => {
highlightAllCode();
});
}
}
initializeHighlightJS();