Frontend: Added full code highlight support for markdown. Adjusted Markdown CSS.

This commit is contained in:
Yohan Boujon 2024-02-03 11:46:27 +01:00
parent 06acd72045
commit b9c39d517b
5 changed files with 130 additions and 13 deletions

View file

@ -12,6 +12,8 @@
"@jamescoyle/svelte-icon": "^0.1.1", "@jamescoyle/svelte-icon": "^0.1.1",
"@mdi/js": "^7.3.67", "@mdi/js": "^7.3.67",
"flag-icons": "^7.1.0", "flag-icons": "^7.1.0",
"highlight.js": "^11.9.0",
"highlightjs-svelte": "^1.0.6",
"sass": "^1.69.5", "sass": "^1.69.5",
"simple-icons": "^9.21.0", "simple-icons": "^9.21.0",
"svelte-markdown": "^0.4.1" "svelte-markdown": "^0.4.1"
@ -1167,6 +1169,19 @@
"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
"dev": true "dev": true
}, },
"node_modules/highlight.js": {
"version": "11.9.0",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz",
"integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==",
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/highlightjs-svelte": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/highlightjs-svelte/-/highlightjs-svelte-1.0.6.tgz",
"integrity": "sha512-aXuBPz8df3sOXg90q8rRcBLyxIR8ozPU39a6tJ2rpJUjjd9brRIr55aC0IccW4gsPhQxZ+B3rFugdXsg9/ckDw=="
},
"node_modules/immutable": { "node_modules/immutable": {
"version": "4.3.4", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz",

View file

@ -20,6 +20,8 @@
"@jamescoyle/svelte-icon": "^0.1.1", "@jamescoyle/svelte-icon": "^0.1.1",
"@mdi/js": "^7.3.67", "@mdi/js": "^7.3.67",
"flag-icons": "^7.1.0", "flag-icons": "^7.1.0",
"highlight.js": "^11.9.0",
"highlightjs-svelte": "^1.0.6",
"sass": "^1.69.5", "sass": "^1.69.5",
"simple-icons": "^9.21.0", "simple-icons": "^9.21.0",
"svelte-markdown": "^0.4.1" "svelte-markdown": "^0.4.1"

View file

@ -0,0 +1,83 @@
<script>
import "$lib/css/markdown.css";
import "highlight.js/styles/base16/atelier-estuary-light.min.css";
import hljs from "highlight.js/lib/core";
// Language support static import
import javascript from "highlight.js/lib/languages/javascript";
import bash from "highlight.js/lib/languages/bash";
import csharp from "highlight.js/lib/languages/csharp"
import c from "highlight.js/lib/languages/c";
import cpp from "highlight.js/lib/languages/cpp";
import armasm from "highlight.js/lib/languages/armasm";
import arduino from "highlight.js/lib/languages/arduino";
import cmake from "highlight.js/lib/languages/cmake";
import css from "highlight.js/lib/languages/css";
import json from "highlight.js/lib/languages/json";
import java from "highlight.js/lib/languages/java";
import latex from "highlight.js/lib/languages/latex";
import matlab from "highlight.js/lib/languages/matlab";
import nginx from "highlight.js/lib/languages/nginx";
import php from "highlight.js/lib/languages/php";
import python from "highlight.js/lib/languages/python";
import rust from "highlight.js/lib/languages/rust";
import sql from "highlight.js/lib/languages/sql";
import shell from "highlight.js/lib/languages/shell";
import vhdl from "highlight.js/lib/languages/vhdl";
import xml from "highlight.js/lib/languages/xml";
// Addons
import svelte from "highlightjs-svelte";
// Registering all languages
hljs.registerLanguage("javascript", javascript);
hljs.registerLanguage("bash", bash);
hljs.registerLanguage("csharp",csharp);
hljs.registerLanguage("c", c);
hljs.registerLanguage("cpp", cpp);
hljs.registerLanguage("armasm", armasm);
hljs.registerLanguage("arduino", arduino);
hljs.registerLanguage("cmake", cmake);
hljs.registerLanguage("css", css);
hljs.registerLanguage("json", json);
hljs.registerLanguage("java", java);
hljs.registerLanguage("latex", latex);
hljs.registerLanguage("matlab", matlab);
hljs.registerLanguage("nginx", nginx);
hljs.registerLanguage("php", php);
hljs.registerLanguage("python", python);
hljs.registerLanguage("rust",rust);
hljs.registerLanguage("sql",sql);
hljs.registerLanguage("shell", shell);
hljs.registerLanguage("vhdl", vhdl);
hljs.registerLanguage("xml", xml);
// Addons
svelte(hljs);
// Exporting values
export let lang;
export let text;
let littleLanguage;
let html = text;
if(hljs.getLanguage(lang) != undefined)
{
html = hljs.highlight(text, { language: lang }).value;
}
function showLang(visible) {
if (visible) littleLanguage.style.visibility = "visible";
else littleLanguage.style.visibility = "hidden";
}
</script>
<div
class="markdown-codeblock"
on:mouseover={() => showLang(true)}
on:mouseleave={() => showLang(false)}
on:focus={() => true}
role="link"
tabindex="0"
>
<div class="little-language" bind:this={littleLanguage}>{lang}</div>
<pre>{@html html}</pre>
</div>

View file

@ -21,6 +21,7 @@
mdiDownload, mdiDownload,
} from "@mdi/js"; } from "@mdi/js";
import SvelteMarkdown from "svelte-markdown"; import SvelteMarkdown from "svelte-markdown";
import MarkdownHighlight from "$lib/components/markdown-highlight.svelte";
import { formatMonth } from "$lib/js/date.js"; import { formatMonth } from "$lib/js/date.js";
// Variables // Variables
@ -65,6 +66,7 @@
archive_link = data.archive_link; archive_link = data.archive_link;
application_link = data.application_link; application_link = data.application_link;
filteredTags = filterTag(tags, id); filteredTags = filterTag(tags, id);
// Active set to true after the await to avoid conflict when clicking outside while the popup hasn't showed yet. // Active set to true after the await to avoid conflict when clicking outside while the popup hasn't showed yet.
setTimeout(() => { setTimeout(() => {
active = true; active = true;
@ -140,7 +142,10 @@
<p class="slide-subtitle slide-aftericon">Description</p> <p class="slide-subtitle slide-aftericon">Description</p>
</div> </div>
<div class="markdown"> <div class="markdown">
<SvelteMarkdown source={description} /> <SvelteMarkdown
source={description}
renderers={{ code: MarkdownHighlight }}
/>
</div> </div>
</div> </div>
<!-- Links --> <!-- Links -->
@ -218,7 +223,10 @@
<p class="slide-subtitle slide-aftericon">Description</p> <p class="slide-subtitle slide-aftericon">Description</p>
</div> </div>
<div class="markdown"> <div class="markdown">
<SvelteMarkdown source={description} /> <SvelteMarkdown
source={description}
renderers={{ code: MarkdownHighlight }}
/>
</div> </div>
</div> </div>
</div> </div>

View file

@ -48,18 +48,36 @@ li {
} }
/* Code Blcoks */ /* Code Blcoks */
.markdown pre { .markdown-codeblock {
position: relative;
font-family: 'Sometype Mono', monospace;
font-weight: 500;
color: var(--color-text);
}
.markdown-codeblock pre {
display: block; display: block;
padding: 9.5px; padding: 9.5px;
margin: 0 0 10px; margin: 0 0 10px;
font-size: 13px; font-size: 13px;
line-height: 1.42857143; line-height: 1.42857143;
color: var(--color-text);
word-break: break-all; word-break: break-all;
word-wrap: break-word; word-wrap: break-word;
background-color: var(--color-code); background-color: var(--color-code);
border-radius: 0.5rem; border-radius: 0.5rem;
box-shadow: #352b4027 0px 4px 6px -1px, #352b4016 0px 2px 4px -1px; box-shadow: #352b4027 0px 4px 6px -1px, #352b4016 0px 2px 4px -1px;
white-space: pre-wrap;
}
.little-language {
color: var(--color-subtext);
position: absolute;
visibility: hidden;
top: 0;
right: 0;
margin-top: 0.5rem;
margin-right: 0.5rem;
cursor: default;
} }
.markdown code { .markdown code {
@ -70,15 +88,6 @@ li {
box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px; box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
} }
.markdown pre>code {
font-family: 'Sometype Mono', monospace;
font-weight: 500;
padding: 0 !important;
border-radius: 0 !important;
color: var(--color-subtext) !important;
box-shadow: none !important;
}
.markdown blockquote { .markdown blockquote {
padding: 10px 20px; padding: 10px 20px;
margin: 0 0 20px; margin: 0 0 20px;