diff options
| author | kj_sh604 | 2026-04-18 14:53:14 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-04-18 14:53:14 -0400 |
| commit | cf2ac83ea865c52639d9efeaad1f03f54d4d4edd (patch) | |
| tree | 382324f4136a3735d33b6bcb98597718dd8b4f72 | |
| parent | f4b6ffce91bcf9cd3c4ef85dd1a2b30b043c2d4d (diff) | |
fix: highlighting for some languages
also makes highlighting safer and more secure
| -rw-r--r-- | src/server.py | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/src/server.py b/src/server.py index 303c1bf..1946439 100644 --- a/src/server.py +++ b/src/server.py @@ -595,6 +595,7 @@ def paste_page(paste, csp_nonce): paste_id_json = json.dumps(paste_id) code_lang_class = f"language-{language}" if language else "" code_lang_class_json = json.dumps(code_lang_class) + language_json = json.dumps(language) script_nonce_attr = f' nonce="{html_escape_attr(csp_nonce)}"' @@ -650,7 +651,13 @@ def paste_page(paste, csp_nonce): codeInner.textContent = data.content; codeEl.appendChild(codeInner); el.appendChild(codeEl); - hljs.highlightElement(codeInner); + const ready = window.kjClipboardHighlightReady; + if (ready && typeof ready.then === "function") {{ + await ready; + }} + if (window.hljs && typeof hljs.highlightElement === "function") {{ + hljs.highlightElement(codeInner); + }} '''} {"" if is_code else ''' const pre = document.createElement("pre"); @@ -676,7 +683,34 @@ def paste_page(paste, csp_nonce): if is_code: highlight_css = '<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/vs2015.min.css">' highlight_js = f"""<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script> - <script{script_nonce_attr}>hljs.highlightAll();</script>""" + <script{script_nonce_attr}> + // load uncommon languages on demand; run highlighting either way, if code + window.kjClipboardHighlightReady = new Promise((resolve) => {{ + const runHighlight = () => {{ + if (window.hljs && typeof hljs.highlightAll === "function") {{ + hljs.highlightAll(); + }} + resolve(); + }}; + + const lang = {language_json}; + if (!lang || !window.hljs || typeof hljs.getLanguage !== "function") {{ + runHighlight(); + return; + }} + + if (hljs.getLanguage(lang)) {{ + runHighlight(); + return; + }} + + const langScript = document.createElement("script"); + langScript.src = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/languages/" + encodeURIComponent(lang) + ".min.js"; + langScript.onload = runHighlight; + langScript.onerror = runHighlight; + document.head.appendChild(langScript); + }}); + </script>""" return f"""<!DOCTYPE html> <html lang="en"> |
