Files
com.xaymar.www/assets/js/highlight.mjs
T
2024-06-02 06:31:08 +02:00

130 lines
2.7 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",
];
const selector = "code.block[class*=\"language\"]";
if (document.querySelectorAll(selector).length == 0) {
console.log("highlight.JS: Skipping, as it is not needed here.");
return;
}
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();