static/app.js
browsing at commit = f94948ee920ac4654a97980edc83bf249aa160f5
// Client-side rendering: syntax highlighting for source files and markdown
// rendering for READMEs and .md files.
(function () {
"use strict";
// Map a filename to an explicit highlight.js language. Full-name matches
// (e.g. CMakeLists.txt) take priority over extensions.
var FILENAME_LANGUAGES = { "CMakeLists.txt": "cmake" };
var EXTENSION_LANGUAGES = {
cpp: "cpp",
hpp: "cpp",
js: "javascript",
json: "json",
yml: "yaml",
txt: "plaintext",
};
function languageForFilename(filename) {
if (!filename) return null;
if (FILENAME_LANGUAGES[filename]) return FILENAME_LANGUAGES[filename];
var dot = filename.lastIndexOf(".");
// Extensionless files (LICENSE, README, etc.) are treated as plain text
// rather than letting auto-detection guess a language.
if (dot === -1) return "plaintext";
return EXTENSION_LANGUAGES[filename.slice(dot + 1).toLowerCase()] || null;
}
function highlight() {
if (typeof hljs === "undefined") return;
document.querySelectorAll("pre.code > code.hljs").forEach(function (el) {
var lang = languageForFilename(el.dataset.filename);
if (lang) el.classList.add("language-" + lang);
hljs.highlightElement(el);
var detected = el.result && el.result.language ? el.result.language : "plaintext";
var label = document.createElement("p");
label.className = "lang-detected";
label.textContent = "Detected language: " + detected;
el.parentElement.insertAdjacentElement("afterend", label);
});
}
// Each ".markdown-src" element holds raw markdown and a data-target CSS
// selector pointing at the element to render it into.
function renderMarkdown() {
if (typeof marked === "undefined") return;
document.querySelectorAll(".markdown-src").forEach(function (src) {
var target = document.querySelector(src.dataset.target);
if (target) target.innerHTML = marked.parse(src.textContent);
});
}
document.addEventListener("DOMContentLoaded", function () {
highlight();
renderMarkdown();
});
})();