feat(viewer): couverture pretty print tous langages code (aliases hljs, langues hors bundle common, Dockerfile/Makefile)
This commit is contained in:
+19
-2
@@ -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>'
|
||||
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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">
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user