From 05eab4145c13249c70f2dfee97b21935f929742d Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 14 May 2026 01:17:15 +0200 Subject: [PATCH] Mist highlighting --- content/blog/memory-system-proposition.mdx | 8 +- public/mist.tmLanguage.json | 231 +++++++++++++++++++++ source.config.ts | 9 +- 3 files changed, 243 insertions(+), 5 deletions(-) create mode 100644 public/mist.tmLanguage.json diff --git a/content/blog/memory-system-proposition.mdx b/content/blog/memory-system-proposition.mdx index 6f44faa..db2d068 100644 --- a/content/blog/memory-system-proposition.mdx +++ b/content/blog/memory-system-proposition.mdx @@ -17,7 +17,7 @@ The pattern is clear: ## New proposition (Scope Counting) I want to propose a new memory system (to my understanding), Scope Counting, which you have to see in action to understand it. -```cpp +```mist { var x = new Box(10); // sc = 0 @@ -25,7 +25,7 @@ I want to propose a new memory system (to my understanding), Scope Counting, whi } ``` -```cpp +```mist var r; // sc = 0 { @@ -47,7 +47,7 @@ What makes this better is that it can still live with Rust's lifetime model when ## More examples In rust this is a very limiting issue, but with SC, it goes how it's supposed to go -```cpp +```mist str* longest(str* x, str* y) { if (x.len() > y.len()) return x; else return y; @@ -57,7 +57,7 @@ str* longest(str* x, str* y) { Why? because both x and y are already a level higher. if x is an outer scope of y (generally means lives longer), y would actually push it's sc to live as long as x, a better example is this: -```cpp +```mist str* greet() { return "hello, world!"; // Impossible in Rust } diff --git a/public/mist.tmLanguage.json b/public/mist.tmLanguage.json new file mode 100644 index 0000000..a17ff05 --- /dev/null +++ b/public/mist.tmLanguage.json @@ -0,0 +1,231 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "mist", + "scopeName": "source.mist", + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#keywords" + }, + { + "include": "#attributes" + }, + { + "include": "#strings" + }, + { + "include": "#macros" + }, + { + "include": "#type_declarations" + }, + { + "include": "#constants" + }, + { + "include": "#lifetimes" + }, + { + "include": "#generics" + }, + { + "include": "#types" + }, + { + "include": "#namespaces" + }, + { + "include": "#functions" + }, + { + "include": "#numbers" + }, + { + "include": "#operators" + }, + { + "include": "#punctuation" + } + ], + "repository": { + "comments": { + "match": "//.*", + "name": "comment.line.double-slash.mist" + }, + "attributes": { + "begin": "#!?\\[", + "beginCaptures": { + "0": { + "name": "punctuation.definition.attribute.begin.mist" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "punctuation.definition.attribute.end.mist" + } + }, + "name": "meta.attribute.mist", + "patterns": [ + { + "include": "$self" + } + ] + }, + "strings": { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.mist" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.mist" + } + }, + "name": "string.quoted.double.mist", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.mist" + } + ] + }, + "macros": { + "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)(!)", + "captures": { + "1": { + "name": "entity.name.function.macro.mist" + }, + "2": { + "name": "keyword.operator.macro.mist" + } + } + }, + "type_declarations": { + "match": "\\b(struct|enum|class|trait)\\s+([a-zA-Z_][a-zA-Z0-9_]*)", + "captures": { + "1": { + "name": "storage.type.mist" + }, + "2": { + "name": "entity.name.type.mist" + } + } + }, + "keywords": { + "patterns": [ + { + "match": "\\b(if|else|while|for|in|return|break|continue|match)\\b", + "name": "keyword.control.mist" + }, + { + "match": "\\b(struct|enum|class|trait|var)\\b", + "name": "storage.type.mist" + }, + { + "match": "\\b(pub|mut|constructor)\\b", + "name": "storage.modifier.mist" + }, + { + "match": "\\b(impl|use|mod|new|void|self)\\b", + "name": "keyword.other.mist" + } + ] + }, + "constants": { + "match": "\\b(true|false)\\b", + "name": "constant.language.boolean.mist" + }, + "lifetimes": { + "match": "'[a-zA-Z_][a-zA-Z0-9_]*\\b", + "name": "storage.modifier.lifetime.mist" + }, + "generics": { + "begin": "<", + "beginCaptures": { + "0": { + "name": "punctuation.brackets.angle.mist" + } + }, + "end": ">", + "endCaptures": { + "0": { + "name": "punctuation.brackets.angle.mist" + } + }, + "patterns": [ + { + "include": "#lifetimes" + }, + { + "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b", + "name": "entity.name.type.mist" + }, + { + "match": ",", + "name": "punctuation.separator.mist" + }, + { + "match": ":|\\+", + "name": "keyword.operator.mist" + }, + { + "include": "#generics" + } + ] + }, + "types": { + "patterns": [ + { + "match": "(?=|==|!=|&&|\\|\\||\\+|-|\\*|/|%|<|>|=|=>|!)", + "name": "keyword.operator.mist" + }, + "punctuation": { + "match": "::|:|;|,|\\.|\\{|\\}|\\(|\\)|\\[|\\]", + "name": "punctuation.mist" + } + } +} \ No newline at end of file diff --git a/source.config.ts b/source.config.ts index 805f0be..5f14773 100644 --- a/source.config.ts +++ b/source.config.ts @@ -5,6 +5,7 @@ import { } from "fumadocs-mdx/config"; import { metaSchema, pageSchema } from "fumadocs-core/source/schema"; import { z } from "zod"; +import mist from "./public/mist.tmLanguage.json"; // You can customize Zod schemas for frontmatter and `meta.json` here // see https://fumadocs.dev/docs/mdx/collections @@ -33,6 +34,12 @@ export const blogPosts = defineCollections({ export default defineConfig({ mdxOptions: { - // MDX options + rehypeCodeOptions: { + langs: [mist], + themes: { + light: "github-light", + dark: "github-dark", + }, + }, }, });