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",
|
".cs": "csharp", ".go": "go", ".rs": "rust", ".rb": "ruby",
|
||||||
".php": "php", ".sql": "sql", ".r": "r", ".swift": "swift",
|
".php": "php", ".sql": "sql", ".r": "r", ".swift": "swift",
|
||||||
".kt": "kotlin", ".txt": "plaintext", ".log": "plaintext",
|
".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:
|
else:
|
||||||
# Non-markdown: wrap in syntax-highlighted code block
|
# 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)
|
escaped = html_mod.escape(raw)
|
||||||
html_content = f'<pre><code class="language-{lang}">{escaped}</code></pre>'
|
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) -->
|
<!-- 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>
|
<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://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 defer src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js"></script>
|
||||||
<script type="importmap">
|
<script type="importmap">
|
||||||
|
|||||||
@@ -259,6 +259,28 @@ function safeHighlight(block) {
|
|||||||
if (block.className && block.className.indexOf('language-mermaid') !== -1) return;
|
if (block.className && block.className.indexOf('language-mermaid') !== -1) return;
|
||||||
if (typeof hljs !== "undefined" && hljs.highlightElement) {
|
if (typeof hljs !== "undefined" && hljs.highlightElement) {
|
||||||
try {
|
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);
|
hljs.highlightElement(block);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
/* CDN not loaded */
|
/* CDN not loaded */
|
||||||
|
|||||||
@@ -506,12 +506,10 @@ function fallbackTokenize(text) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Applique la coloration: hljs si le langage est connu et que des tokens
|
// Applique la coloration: hljs (avec aliases de languages) si des tokens
|
||||||
// sortent, sinon fallback regex générique.
|
// sortent, sinon fallback regex generique.
|
||||||
function applyPrettyHighlight(codeEl, lang, text) {
|
function applyPrettyHighlight(codeEl, lang, text) {
|
||||||
if (typeof hljs !== "undefined" && lang !== "plaintext") {
|
safeHighlight(codeEl); // gerne les alias language-xxx inconnus de hljs
|
||||||
try { hljs.highlightElement(codeEl); } catch (_) { /* CDN pas charge */ }
|
|
||||||
}
|
|
||||||
const tokens = codeEl.querySelectorAll('[class^="hljs-"]').length;
|
const tokens = codeEl.querySelectorAll('[class^="hljs-"]').length;
|
||||||
if (!tokens && text.trim()) {
|
if (!tokens && text.trim()) {
|
||||||
codeEl.innerHTML = fallbackTokenize(text);
|
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-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>
|
<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/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 src="https://unpkg.com/[email protected]/dist/umd/lucide.min.js"></script>
|
||||||
<script type="importmap">
|
<script type="importmap">
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user