git repos / sago_web_git

static/app.js

browsing at commit = 7df4218f1bb7efd0913733a5ae4f641268f5e8af

raw · blame · history

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