aboutsummaryrefslogtreecommitdiff
path: root/docs/src/highlight.ffi.mjs
diff options
context:
space:
mode:
authorHayleigh Thompson <me@hayleigh.dev>2023-09-09 19:18:39 +0100
committerHayleigh Thompson <me@hayleigh.dev>2023-09-09 19:18:39 +0100
commit6316595b7c9ac5d7ea6ac518edab96300140c9f7 (patch)
treefe3ffc5af9a365e6d34671b71ff4409d47fc2e8a /docs/src/highlight.ffi.mjs
parent9868860abb2aa31612a14254dfe2584d52f1b7e1 (diff)
downloadlustre-6316595b7c9ac5d7ea6ac518edab96300140c9f7.tar.gz
lustre-6316595b7c9ac5d7ea6ac518edab96300140c9f7.zip
:memo: Idk docs lol.
Diffstat (limited to 'docs/src/highlight.ffi.mjs')
-rw-r--r--docs/src/highlight.ffi.mjs151
1 files changed, 151 insertions, 0 deletions
diff --git a/docs/src/highlight.ffi.mjs b/docs/src/highlight.ffi.mjs
new file mode 100644
index 0000000..a67dfe2
--- /dev/null
+++ b/docs/src/highlight.ffi.mjs
@@ -0,0 +1,151 @@
+import "highlight.js/styles/github.css";
+
+let did_register_html = false;
+let did_register_js = false;
+let did_register_sh = false;
+let did_register_gleam = false;
+
+export async function highlight_element(el, lang) {
+ if (el.classList.contains("hljs")) return;
+
+ const { default: highlight } = await import("highlight.js/lib/core");
+
+ switch (lang) {
+ case !did_register_html && "html":
+ const { default: html } = await import("highlight.js/lib/languages/xml");
+ highlight.registerLanguage("html", html);
+ did_register_html = true;
+ break;
+
+ case !did_register_js && "javascript":
+ const { default: js } = await import(
+ "highlight.js/lib/languages/javascript"
+ );
+ highlight.registerLanguage("javascript", js);
+ did_register_js = true;
+ break;
+
+ case !did_register_sh && "shell":
+ const { default: sh } = await import("highlight.js/lib/languages/shell");
+ highlight.registerLanguage("sh", sh);
+ highlight.registerLanguage("shell", sh);
+ did_register_sh = true;
+ break;
+
+ case !did_register_gleam && "gleam":
+ highlight.registerLanguage("gleam", gleam);
+ did_register_gleam = true;
+ break;
+ }
+
+ highlight.highlightElement(el);
+}
+
+function gleam(hljs) {
+ const KEYWORDS =
+ "as assert case const fn if import let panic use opaque pub todo type";
+ const STRING = {
+ className: "string",
+ variants: [{ begin: /"/, end: /"/ }],
+ contains: [hljs.BACKSLASH_ESCAPE],
+ relevance: 0,
+ };
+ const NAME = {
+ className: "variable",
+ begin: "\\b[a-z][a-z0-9_]*\\b",
+ relevance: 0,
+ };
+ const DISCARD_NAME = {
+ className: "comment",
+ begin: "\\b_[a-z][a-z0-9_]*\\b",
+ relevance: 0,
+ };
+ const NUMBER = {
+ className: "number",
+ variants: [
+ {
+ // binary
+ begin: "\\b0[bB](?:_?[01]+)+",
+ },
+ {
+ // octal
+ begin: "\\b0[oO](?:_?[0-7]+)+",
+ },
+ {
+ // hex
+ begin: "\\b0[xX](?:_?[0-9a-fA-F]+)+",
+ },
+ {
+ // dec, float
+ begin: "\\b\\d(?:_?\\d+)*(?:\\.(?:\\d(?:_?\\d+)*)*)?",
+ },
+ ],
+ relevance: 0,
+ };
+
+ return {
+ name: "Gleam",
+ aliases: ["gleam"],
+ contains: [
+ hljs.C_LINE_COMMENT_MODE,
+ STRING,
+ {
+ // bit string
+ begin: "<<",
+ end: ">>",
+ contains: [
+ {
+ className: "keyword",
+ beginKeywords:
+ "binary bytes int float bit_string bits utf8 utf16 utf32 " +
+ "utf8_codepoint utf16_codepoint utf32_codepoint signed unsigned " +
+ "big little native unit size",
+ },
+ KEYWORDS,
+ STRING,
+ NAME,
+ DISCARD_NAME,
+ NUMBER,
+ ],
+ relevance: 10,
+ },
+ {
+ className: "function",
+ beginKeywords: "fn",
+ end: "\\(",
+ excludeEnd: true,
+ contains: [
+ {
+ className: "title",
+ begin: "[a-z][a-z0-9_]*\\w*",
+ relevance: 0,
+ },
+ ],
+ },
+ {
+ className: "attribute",
+ begin: "@",
+ end: "\\(",
+ excludeEnd: true,
+ },
+ {
+ className: "keyword",
+ beginKeywords: KEYWORDS,
+ },
+ {
+ // Type names and constructors
+ className: "title",
+ begin: "\\b[A-Z][A-Za-z0-9]*\\b",
+ relevance: 0,
+ },
+ {
+ className: "operator",
+ begin: "[+\\-*/%!=<>&|.]+",
+ relevance: 0,
+ },
+ NAME,
+ DISCARD_NAME,
+ NUMBER,
+ ],
+ };
+}