feat(viewer): couverture pretty print tous langages code (aliases hljs, langues hors bundle common, Dockerfile/Makefile)
CI / lint (push) Successful in 1m18s
CI / security (push) Successful in 56s
CI / test (push) Successful in 2m31s
CI / build (push) Successful in 48s
CI / e2e (push) Successful in 10m41s

This commit is contained in:
2026-09-14 20:33:54 -04:00
parent 686a6da019
commit 24b5dd033a
5 changed files with 60 additions and 7 deletions
+19 -2
View File
@@ -1506,7 +1506,14 @@ EXT_TO_LANG = {
".cs": "csharp", ".go": "go", ".rs": "rust", ".rb": "ruby",
".php": "php", ".sql": "sql", ".r": "r", ".swift": "swift",
".kt": "kotlin", ".txt": "plaintext", ".log": "plaintext",
".dockerfile": "dockerfile", ".makefile": "makefile", ".cmake": "cmake",
".lua": "lua", ".pl": "perl", ".pm": "perl", ".ex": "elixir", ".exs": "elixir",
".dart": "dart", ".tf": "haskell", ".gradle": "groovy", ".groovy": "groovy",
".graphql": "graphql", ".gql": "graphql", ".prisma": "sql", ".proto": "c",
".vb": "basic", ".asm": "x86asm", ".s": "armasm",
".vue": "xml", ".svelte": "xml", ".astro": "xml",
".properties": "ini", ".service": "ini", ".hosts": "ini",
".ksh": "bash", ".dockerfile": "dockerfile",
".makefile": "makefile", ".cmake": "cmake",
}
@@ -2500,7 +2507,17 @@ async def api_file(vault_name: str, path: str = Query(..., description="Relative
}
else:
# Non-markdown: wrap in syntax-highlighted code block
lang = EXT_TO_LANG.get(ext, "plaintext")
lang = EXT_TO_LANG.get(ext, "")
if not lang:
# Fichiers sans extension usuels (Dockerfile, Makefile, etc.)
NAME_TO_LANG = {
"dockerfile": "dockerfile", "makefile": "makefile",
"cmakelists.txt": "cmake", "jenkinsfile": "groovy",
"vagrantfile": "ruby", "rakefile": "ruby", "gemfile": "ruby",
"procfile": "plaintext", "bashrc": "bash", "bash_profile": "bash",
"zshrc": "bash", "profile": "bash", "gitignore": "plaintext",
}
lang = NAME_TO_LANG.get(file_path.name.lower(), "plaintext")
escaped = html_mod.escape(raw)
html_content = f'<pre><code class="language-{lang}">{escaped}</code></pre>'
+11
View File
@@ -88,6 +88,17 @@
/>
<!-- defer: ne bloque pas le premier paint (le splash inline s'affiche immédiatement) -->
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<!-- Langues highlight.js hors bundle "common" (enregistrement auto apres le core) -->
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/dockerfile.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/powershell.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/dos.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/cmake.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/dart.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/elixir.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/haskell.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/nginx.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/http.min.js"></script>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/plaintext.min.js"></script>
<script defer src="https://unpkg.com/[email protected]/dist/umd/lucide.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script>
<script type="importmap">
+22
View File
@@ -259,6 +259,28 @@ function safeHighlight(block) {
if (block.className && block.className.indexOf('language-mermaid') !== -1) return;
if (typeof hljs !== "undefined" && hljs.highlightElement) {
try {
// Alias pour les extensions que highlight.js (bundle common) ne connaît pas
const PP_LANG_ALIAS = {
md: "markdown", markdown: "markdown", rst: "plaintext",
pl: "perl", lua: "lua", dart: "dart",
vue: "html", svelte: "html", astro: "html",
graphql: "graphql", prisma: "sql", proto: "c",
vb: "basic", vba: "basic", asm: "x86asm",
tf: "haskell", gradle: "groovy", groovy: "groovy",
properties: "ini", gitignore: "plaintext", hosts: "ini",
fish: "bash", ksh: "bash", systemd: "ini", batch: "dos", bat: "dos",
shell: "bash", golang: "go", toml: "ini", avsc: "json", jsonc: "json", json5: "json",
};
const m = /\blanguage-([\w-]+)/.exec(block.className || "");
if (m) {
const lang = m[1];
const alias = PP_LANG_ALIAS[lang];
if (alias && hljs.getLanguage && !hljs.getLanguage(lang) && hljs.getLanguage(alias)) {
block.className = block.className.replace("language-" + lang, "language-" + alias);
} else if (hljs.getLanguage && !hljs.getLanguage(lang) && !hljs.getLanguage(alias || "")) {
block.className = block.className.replace("language-" + lang, "language-plaintext");
}
}
hljs.highlightElement(block);
} catch (e) {
/* CDN not loaded */
+3 -5
View File
@@ -506,12 +506,10 @@ function fallbackTokenize(text) {
return out;
}
// Applique la coloration: hljs si le langage est connu et que des tokens
// sortent, sinon fallback regex générique.
// Applique la coloration: hljs (avec aliases de languages) si des tokens
// sortent, sinon fallback regex generique.
function applyPrettyHighlight(codeEl, lang, text) {
if (typeof hljs !== "undefined" && lang !== "plaintext") {
try { hljs.highlightElement(codeEl); } catch (_) { /* CDN pas charge */ }
}
safeHighlight(codeEl); // gerne les alias language-xxx inconnus de hljs
const tokens = codeEl.querySelectorAll('[class^="hljs-"]').length;
if (!tokens && text.trim()) {
codeEl.innerHTML = fallbackTokenize(text);
+5
View File
@@ -43,6 +43,11 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css" id="hljs-theme-dark">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css" id="hljs-theme-light" disabled>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/dockerfile.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/powershell.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/dos.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/cmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/plaintext.min.js"></script>
<script src="https://unpkg.com/[email protected]/dist/umd/lucide.min.js"></script>
<script type="importmap">
{