// 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(); }); })();