Files
website/themes/hugo-theme-monochrome/assets/js/emgithub.js
Simon Gardling 032679b34a setup
2023-10-11 17:38:05 -04:00

74 lines
2.6 KiB
JavaScript

var currentScript = document.currentScript;
function removeMask (container) {
const emgithubPre = container.querySelector(".emgithub-pre");
const emgithubLoading = container.querySelector(".emgithub-loading");
emgithubLoading.classList.add("hide");
emgithubPre.classList.remove("hide");
emgithubPre.classList.remove("loading");
}
function embedTextToEle (codeText, container, lang, lineBegin, lineEnd) {
const emgithubPre = container.querySelector(".emgithub-pre");
const emgithubCode = document.createElement("code");
emgithubPre.appendChild(emgithubCode);
if (lineBegin > 0) {
const codeTextSplit = codeText.split("\n");
codeText = codeTextSplit.slice(lineBegin - 1, lineEnd).join("\n") + '\n';
}
// Dynamically adjust padding of pre to fit in the line numbers
const lineBeginDigit = lineBegin.toString().length;
const lineEndDigit = lineEnd.toString().length;
if (lineBeginDigit >= 4 || lineEndDigit >= 4) {
emgithubPre.style.paddingLeft = "4.5rem";
} else if (lineBeginDigit >= 3 || lineEndDigit >= 3) {
emgithubPre.style.paddingLeft = "4rem";
} else if (lineBeginDigit >= 2 || lineEndDigit >= 2) {
emgithubPre.style.paddingLeft = "3.5rem";
}
emgithubCode.classList.add(`language-${lang}`);
emgithubCode.textContent = codeText;
Prism.highlightAllUnder(container, false, () => {
requestAnimationFrame(() => {
removeMask(container);
})
});
}
function embedErrorToEle (errText, container) {
const emgithubPre = container.querySelector(".emgithub-code .emgithub-pre");
const emgithubCode = document.createElement("code");
emgithubPre.appendChild(emgithubCode);
emgithubPre.classList.remove("line-numbers");
emgithubPre.classList.add("no-line-numbers");
emgithubCode.textContent = errText;
removeMask(container);
}
async function embed () {
const sourceURL = new URL(currentScript.src);
const params = sourceURL.searchParams;
const rawFileURL = new URL(params.get("raw_file_url"));
const lang = params.get("lang");
const id = params.get("id");
const lineBegin = Number(params.get("line_begin"));
const lineEnd = Number(params.get("line_end"));
const emgithubContainer = document.getElementById(id);
const response = await fetch(rawFileURL);
if (response.ok) {
const text = await response.text();
embedTextToEle(text, emgithubContainer, lang, lineBegin, lineEnd);
} else {
embedErrorToEle(`Failed to process ${rawFileURL}\n${response.status}`, emgithubContainer);
}
}
window.addEventListener("DOMContentLoaded", () => {
embed();
});