diff --git a/StabilityMatrix.Avalonia/Assets.cs b/StabilityMatrix.Avalonia/Assets.cs
index 56fd74b9..bcbfe733 100644
--- a/StabilityMatrix.Avalonia/Assets.cs
+++ b/StabilityMatrix.Avalonia/Assets.cs
@@ -24,6 +24,12 @@ internal static class Assets
public static AvaloniaResource LicensesJson => new(
"avares://StabilityMatrix.Avalonia/Assets/licenses.json");
+
+ public static AvaloniaResource ImagePromptLanguageJson => new(
+ "avares://StabilityMatrix.Avalonia/Assets/ImagePrompt.tmLanguage.json");
+
+ public static AvaloniaResource ThemeMatrixDarkJson =>
+ new("avares://StabilityMatrix.Avalonia/Assets/ThemeMatrixDark.json");
[SupportedOSPlatform("windows")]
[SupportedOSPlatform("linux")]
diff --git a/StabilityMatrix.Avalonia/Assets/ImagePrompt.tmLanguage.json b/StabilityMatrix.Avalonia/Assets/ImagePrompt.tmLanguage.json
new file mode 100644
index 00000000..16cb19f8
--- /dev/null
+++ b/StabilityMatrix.Avalonia/Assets/ImagePrompt.tmLanguage.json
@@ -0,0 +1,149 @@
+{
+ "name": "Image Prompt",
+ "scopeName": "source.prompt",
+ "patterns": [
+ {
+ "include": "#value"
+ }
+ ],
+ "repository": {
+ "comment": {
+ "captures": {
+ "1": {
+ "name": "punctuation.definition.comment.prompt"
+ }
+ },
+ "match": "(#).*$\\n?",
+ "name": "comment.line.number-sign.prompt"
+ },
+ "parenthesized": {
+ "begin": "\\(",
+ "beginCaptures": {
+ "0": {
+ "name": "punctuation.definition.array.begin.prompt"
+ }
+ },
+ "end": "\\)",
+ "endCaptures": {
+ "0": {
+ "name": "punctuation.definition.array.end.prompt"
+ }
+ },
+ "name": "meta.structure.array.prompt",
+ "patterns": [
+ {
+ "include": "#colon"
+ },
+ {
+ "include": "#number"
+ },
+ {
+ "include": "#value"
+ },
+ {
+ "match": "[^\\s\\)]",
+ "name": "invalid.illegal.expected-array-separator.prompt"
+ }
+ ]
+ },
+ "array": {
+ "begin": "\\[",
+ "beginCaptures": {
+ "0": {
+ "name": "punctuation.definition.array.begin.prompt"
+ }
+ },
+ "end": "\\]",
+ "endCaptures": {
+ "0": {
+ "name": "punctuation.definition.array.end.prompt"
+ }
+ },
+ "name": "meta.structure.array.prompt",
+ "patterns": [
+ {
+ "include": "#value"
+ },
+ {
+ "match": "[^\\s\\]]",
+ "name": "invalid.illegal.expected-array-separator.prompt"
+ }
+ ]
+ },
+ "network": {
+ "begin": "<",
+ "beginCaptures": {
+ "0": {
+ "name": "punctuation.definition.network.begin.prompt"
+ }
+ },
+ "end": ">",
+ "endCaptures": {
+ "0": {
+ "name": "punctuation.definition.network.end.prompt"
+ }
+ },
+ "name": "meta.structure.network.prompt",
+ "patterns": [
+ {
+ "include": "#colon"
+ },
+ {
+ "include": "#number"
+ },
+ {
+ "include": "#text"
+ },
+ {
+ "match": "[^\\s\\>]",
+ "name": "invalid.illegal.expected-array-separator.prompt"
+ }
+ ]
+ },
+ "number": {
+ "match": "(?x) # turn on extended mode\n -? # an optional minus\n (?:\n 0 # a zero\n | # ...or...\n [1-9] # a 1-9 character\n \\d* # followed by zero or more digits\n )\n (?:\n (?:\n \\. # a period\n \\d+ # followed by one or more digits\n )?\n (?:\n [eE] # an e character\n [+-]? # followed by an option +/-\n \\d+ # followed by one or more digits\n )? # make exponent optional\n )? # make decimal portion optional",
+ "name": "constant.numeric"
+ },
+ "separator": {
+ "match": ",\\s*",
+ "name": "punctuation.separator.variable.prompt"
+ },
+ "colon": {
+ "match": ":",
+ "name": "punctuation.separator.variable.prompt"
+ },
+ "keyword": {
+ "match": "\\b(?:BREAK|AND)\\b",
+ "name": "keyword.control"
+ },
+ "text": {
+ "match": "[^,:\\[\\]\\(\\)]+",
+ "name": "meta.embedded"
+ },
+ "value": {
+ "patterns": [
+ {
+ "include": "#comment"
+ },
+ {
+ "include": "#parenthesized"
+ },
+ {
+ "include": "#array"
+ },
+ {
+ "include": "#network"
+ },
+ {
+ "include": "#separator"
+ },
+ {
+ "include": "#keyword"
+ },
+ {
+ "include": "#text"
+ }
+ ]
+ }
+ }
+}
diff --git a/StabilityMatrix.Avalonia/Assets/ThemeMatrixDark.json b/StabilityMatrix.Avalonia/Assets/ThemeMatrixDark.json
new file mode 100644
index 00000000..e2a569ce
--- /dev/null
+++ b/StabilityMatrix.Avalonia/Assets/ThemeMatrixDark.json
@@ -0,0 +1,659 @@
+{
+ "type": "dark",
+ "colors": {
+ "dropdown.background": "#525252",
+ "list.activeSelectionBackground": "#707070",
+ "quickInputList.focusBackground": "#707070",
+ "list.inactiveSelectionBackground": "#4e4e4e",
+ "list.hoverBackground": "#444444",
+ "list.highlightForeground": "#e58520",
+ "button.background": "#565656",
+ "editor.background": "#1e1e1e",
+ "editor.foreground": "#c5c8c6",
+ "editor.selectionBackground": "#676b7180",
+ "minimap.selectionHighlight": "#676b7180",
+ "editor.selectionHighlightBackground": "#575b6180",
+ "editor.lineHighlightBackground": "#303030",
+ "editorLineNumber.activeForeground": "#949494",
+ "editor.wordHighlightBackground": "#4747a180",
+ "editor.wordHighlightStrongBackground": "#6767ce80",
+ "editorCursor.foreground": "#c07020",
+ "editorWhitespace.foreground": "#505037",
+ "editorIndentGuide.background": "#505037",
+ "editorIndentGuide.activeBackground": "#707057",
+ "editorGroupHeader.tabsBackground": "#282828",
+ "tab.inactiveBackground": "#404040",
+ "tab.border": "#303030",
+ "tab.inactiveForeground": "#d8d8d8",
+ "tab.lastPinnedBorder": "#505050",
+ "peekView.border": "#3655b5",
+ "panelTitle.activeForeground": "#ffffff",
+ "statusBar.background": "#505050",
+ "statusBar.debuggingBackground": "#505050",
+ "statusBar.noFolderBackground": "#505050",
+ "titleBar.activeBackground": "#505050",
+ "statusBarItem.remoteBackground": "#3655b5",
+ "ports.iconRunningProcessForeground": "#CCCCCC",
+ "activityBar.background": "#353535",
+ "activityBar.foreground": "#ffffff",
+ "activityBarBadge.background": "#3655b5",
+ "sideBar.background": "#272727",
+ "sideBarSectionHeader.background": "#505050",
+ "menu.background": "#272727",
+ "menu.foreground": "#CCCCCC",
+ "pickerGroup.foreground": "#b0b0b0",
+ "inputOption.activeBorder": "#3655b5",
+ "focusBorder": "#3655b5",
+ "terminal.ansiBlack": "#1e1e1e",
+ "terminal.ansiRed": "#C4265E",
+ "terminal.ansiGreen": "#86B42B",
+ "terminal.ansiYellow": "#B3B42B",
+ "terminal.ansiBlue": "#6A7EC8",
+ "terminal.ansiMagenta": "#8C6BC8",
+ "terminal.ansiCyan": "#56ADBC",
+ "terminal.ansiWhite": "#e3e3dd",
+ "terminal.ansiBrightBlack": "#666666",
+ "terminal.ansiBrightRed": "#f92672",
+ "terminal.ansiBrightGreen": "#A6E22E",
+ "terminal.ansiBrightYellow": "#e2e22e",
+ "terminal.ansiBrightBlue": "#819aff",
+ "terminal.ansiBrightMagenta": "#AE81FF",
+ "terminal.ansiBrightCyan": "#66D9EF",
+ "terminal.ansiBrightWhite": "#f8f8f2"
+ },
+ "tokenColors": [
+ {
+ "settings": {
+ "foreground": "#C5C8C6"
+ }
+ },
+ {
+ "scope": [
+ "meta.embedded",
+ "source.groovy.embedded"
+ ],
+ "settings": {
+ "foreground": "#C5C8C6"
+ }
+ },
+ {
+ "name": "Comment",
+ "scope": "comment",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9A9B99"
+ }
+ },
+ {
+ "name": "String",
+ "scope": "string",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "String Embedded Source",
+ "scope": "string source",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D08442"
+ }
+ },
+ {
+ "name": "Number",
+ "scope": "constant.numeric",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Built-in constant",
+ "scope": "constant.language",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#408080"
+ }
+ },
+ {
+ "name": "User-defined constant",
+ "scope": "constant.character, constant.other",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#8080FF"
+ }
+ },
+ {
+ "name": "Keyword",
+ "scope": "keyword",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Support",
+ "scope": "support",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#C7444A"
+ }
+ },
+ {
+ "name": "Storage",
+ "scope": "storage",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Class name",
+ "scope": "entity.name.class, entity.name.type, entity.name.namespace, entity.name.scope-resolution",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9B0000"
+ }
+ },
+ {
+ "name": "Inherited class",
+ "scope": "entity.other.inherited-class",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#C7444A"
+ }
+ },
+ {
+ "name": "Function name",
+ "scope": "entity.name.function",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#CE6700"
+ }
+ },
+ {
+ "name": "Function argument",
+ "scope": "variable.parameter",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Tag name",
+ "scope": "entity.name.tag",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Tag attribute",
+ "scope": "entity.other.attribute-name",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Library function",
+ "scope": "support.function",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Keyword",
+ "scope": "keyword",
+ "settings": {
+ "fontStyle": "italic",
+ "foreground": "#676867"
+ }
+ },
+ {
+ "name": "Class Variable",
+ "scope": "variable.other, variable.js, punctuation.separator.variable",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Meta Brace",
+ "scope": "punctuation.section.embedded -(source string source punctuation.section.embedded), meta.brace.erb.html",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#008200"
+ }
+ },
+ {
+ "name": "Invalid",
+ "scope": "invalid",
+ "settings": {
+ "fontStyle": "underline",
+ "foreground": "#FF0B00"
+ }
+ },
+ {
+ "name": "Normal Variable",
+ "scope": "variable.other.php, variable.other.normal",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Function Object",
+ "scope": "meta.function-call.object",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Function Call Variable",
+ "scope": "variable.other.property",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Keyword Control / Special",
+ "scope": [
+ "keyword.control",
+ "keyword.operator.new.cpp",
+ "keyword.operator.delete.cpp",
+ "keyword.other.using",
+ "keyword.other.operator"
+ ],
+ "settings": {
+ "fontStyle": "italic",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Tag",
+ "scope": "meta.tag",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "Tag Name",
+ "scope": "entity.name.tag",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Doctype",
+ "scope": "meta.doctype, meta.tag.sgml-declaration.doctype, meta.tag.sgml.doctype",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "Tag Inline Source",
+ "scope": "meta.tag.inline source, text.html.php.source",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "Tag Other",
+ "scope": "meta.tag.other, entity.name.tag.style, entity.name.tag.script, meta.tag.block.script, source.js.embedded punctuation.definition.tag.html, source.css.embedded punctuation.definition.tag.html",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Tag Attribute",
+ "scope": "entity.other.attribute-name, meta.tag punctuation.definition.string",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "Tag Value",
+ "scope": "meta.tag string -source -punctuation, text source text meta.tag string -punctuation",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Meta Brace",
+ "scope": "punctuation.section.embedded -(source string source punctuation.section.embedded), meta.brace.erb.html",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "HTML ID",
+ "scope": "meta.toc-list.id",
+ "settings": {
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "HTML String",
+ "scope": "string.quoted.double.html, punctuation.definition.string.begin.html, punctuation.definition.string.end.html, punctuation.definition.string.end.html source, string.quoted.double.html source",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "HTML Tags",
+ "scope": "punctuation.definition.tag.html, punctuation.definition.tag.begin, punctuation.definition.tag.end",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "CSS ID",
+ "scope": "meta.selector.css entity.other.attribute-name.id",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "CSS Property Name",
+ "scope": "support.type.property-name.css",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#676867"
+ }
+ },
+ {
+ "name": "CSS Property Value",
+ "scope": "meta.property-group support.constant.property-value.css, meta.property-value support.constant.property-value.css",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#C7444A"
+ }
+ },
+ {
+ "name": "JavaScript Variable",
+ "scope": "variable.language.js",
+ "settings": {
+ "foreground": "#CC555A"
+ }
+ },
+ {
+ "name": "Template Definition",
+ "scope": [
+ "punctuation.definition.template-expression",
+ "punctuation.section.embedded.coffee"
+ ],
+ "settings": {
+ "foreground": "#D08442"
+ }
+ },
+ {
+ "name": "Reset JavaScript string interpolation expression",
+ "scope": [
+ "meta.template.expression"
+ ],
+ "settings": {
+ "foreground": "#C5C8C6"
+ }
+ },
+ {
+ "name": "PHP Function Call",
+ "scope": "meta.function-call.object.php",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "PHP Single Quote HMTL Fix",
+ "scope": "punctuation.definition.string.end.php, punctuation.definition.string.begin.php",
+ "settings": {
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "PHP Parenthesis HMTL Fix",
+ "scope": "source.php.embedded.line.html",
+ "settings": {
+ "foreground": "#676867"
+ }
+ },
+ {
+ "name": "PHP Punctuation Embedded",
+ "scope": "punctuation.section.embedded.begin.php, punctuation.section.embedded.end.php",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D08442"
+ }
+ },
+ {
+ "name": "Ruby Symbol",
+ "scope": "constant.other.symbol.ruby",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "Ruby Variable",
+ "scope": "variable.language.ruby",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "Ruby Special Method",
+ "scope": "keyword.other.special-method.ruby",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D9B700"
+ }
+ },
+ {
+ "name": "Ruby Embedded Source",
+ "scope": [
+ "punctuation.section.embedded.begin.ruby",
+ "punctuation.section.embedded.end.ruby"
+ ],
+ "settings": {
+ "foreground": "#D08442"
+ }
+ },
+ {
+ "name": "SQL",
+ "scope": "keyword.other.DML.sql",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "diff: header",
+ "scope": "meta.diff, meta.diff.header",
+ "settings": {
+ "fontStyle": "italic",
+ "foreground": "#E0EDDD"
+ }
+ },
+ {
+ "name": "diff: deleted",
+ "scope": "markup.deleted",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#dc322f"
+ }
+ },
+ {
+ "name": "diff: changed",
+ "scope": "markup.changed",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#cb4b16"
+ }
+ },
+ {
+ "name": "diff: inserted",
+ "scope": "markup.inserted",
+ "settings": {
+ "foreground": "#219186"
+ }
+ },
+ {
+ "name": "Markup Quote",
+ "scope": "markup.quote",
+ "settings": {
+ "foreground": "#9872A2"
+ }
+ },
+ {
+ "name": "Markup Lists",
+ "scope": "markup.list",
+ "settings": {
+ "foreground": "#9AA83A"
+ }
+ },
+ {
+ "name": "Markup Styling",
+ "scope": "markup.bold, markup.italic",
+ "settings": {
+ "foreground": "#6089B4"
+ }
+ },
+ {
+ "name": "Markup Inline",
+ "scope": "markup.inline.raw",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#FF0080"
+ }
+ },
+ {
+ "name": "Markup Headings",
+ "scope": "markup.heading",
+ "settings": {
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "Markup Setext Header",
+ "scope": "markup.heading.setext",
+ "settings": {
+ "fontStyle": "",
+ "foreground": "#D0B344"
+ }
+ },
+ {
+ "name": "Markdown Headings",
+ "scope": "markup.heading.markdown",
+ "settings": {
+ "fontStyle": "bold"
+ }
+ },
+ {
+ "name": "Markdown Quote",
+ "scope": "markup.quote.markdown",
+ "settings": {
+ "fontStyle": "italic",
+ "foreground": ""
+ }
+ },
+ {
+ "name": "Markdown Bold",
+ "scope": "markup.bold.markdown",
+ "settings": {
+ "fontStyle": "bold"
+ }
+ },
+ {
+ "name": "Markdown Link Title/Description",
+ "scope": "string.other.link.title.markdown,string.other.link.description.markdown",
+ "settings": {
+ "foreground": "#AE81FF"
+ }
+ },
+ {
+ "name": "Markdown Underline Link/Image",
+ "scope": "markup.underline.link.markdown,markup.underline.link.image.markdown",
+ "settings": {
+ "foreground": ""
+ }
+ },
+ {
+ "name": "Markdown Emphasis",
+ "scope": "markup.italic.markdown",
+ "settings": {
+ "fontStyle": "italic"
+ }
+ },
+ {
+ "scope": "markup.strikethrough",
+ "settings": {
+ "fontStyle": "strikethrough"
+ }
+ },
+ {
+ "name": "Markdown Punctuation Definition Link",
+ "scope": "markup.list.unnumbered.markdown, markup.list.numbered.markdown",
+ "settings": {
+ "foreground": ""
+ }
+ },
+ {
+ "name": "Markdown List Punctuation",
+ "scope": [
+ "punctuation.definition.list.begin.markdown"
+ ],
+ "settings": {
+ "foreground": ""
+ }
+ },
+ {
+ "scope": "token.info-token",
+ "settings": {
+ "foreground": "#6796e6"
+ }
+ },
+ {
+ "scope": "token.warn-token",
+ "settings": {
+ "foreground": "#cd9731"
+ }
+ },
+ {
+ "scope": "token.error-token",
+ "settings": {
+ "foreground": "#f44747"
+ }
+ },
+ {
+ "scope": "token.debug-token",
+ "settings": {
+ "foreground": "#b267e6"
+ }
+ },
+ {
+ "name": "this.self",
+ "scope": "variable.language",
+ "settings": {
+ "foreground": "#c7444a"
+ }
+ }
+ ],
+ "semanticHighlighting": true
+}
diff --git a/StabilityMatrix.Avalonia/Assets/sdprompt.xshd b/StabilityMatrix.Avalonia/Assets/sdprompt.xshd
new file mode 100644
index 00000000..ea538e4e
--- /dev/null
+++ b/StabilityMatrix.Avalonia/Assets/sdprompt.xshd
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [?,.()\[\]{}+\-/%*<>^!|]+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AND
+ BREAK
+
+
+
+ PROMPT
+ WEIGHT
+
+
+
+ SELECT
+ DYNAMIC
+
+
+ \b0[xX][0-9a-fA-F]+|(\b\d+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?
+
+
+
+
diff --git a/StabilityMatrix.Avalonia/Extensions/TextMateExtensions.cs b/StabilityMatrix.Avalonia/Extensions/TextMateExtensions.cs
new file mode 100644
index 00000000..771e2d59
--- /dev/null
+++ b/StabilityMatrix.Avalonia/Extensions/TextMateExtensions.cs
@@ -0,0 +1,41 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using TextMateSharp.Grammars;
+using TextMateSharp.Internal.Grammars;
+using TextMateSharp.Internal.Grammars.Reader;
+using TextMateSharp.Internal.Types;
+using TextMateSharp.Registry;
+
+namespace StabilityMatrix.Avalonia.Extensions;
+
+public static class TextMateExtensions
+{
+
+ public static IGrammar LoadGrammarFromStream(
+ this Registry registry,
+ Stream stream,
+ int? initialLanguage = default,
+ Dictionary? embeddedLanguages = default)
+ {
+ IRawGrammar rawGrammar;
+ using (var sr = new StreamReader(stream))
+ {
+ rawGrammar = GrammarReader.ReadGrammarSync(sr);
+ }
+
+ var locatorField = typeof(Registry).GetField("locator", BindingFlags.NonPublic | BindingFlags.Instance);
+ var locator = (IRegistryOptions) locatorField!.GetValue(registry)!;
+
+ var injections = locator.GetInjections(rawGrammar.GetScopeName());
+
+ var syncRegistryField = typeof(Registry).GetField("syncRegistry", BindingFlags.NonPublic | BindingFlags.Instance);
+ var syncRegistry = (SyncRegistry) syncRegistryField!.GetValue(registry)!;
+
+ syncRegistry.AddGrammar(rawGrammar, injections);
+ return registry.GrammarForScopeName(
+ rawGrammar.GetScopeName(),
+ initialLanguage ?? 0,
+ embeddedLanguages ?? new Dictionary());
+ }
+}
diff --git a/StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj b/StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj
index 2acc5271..c4c93d3d 100644
--- a/StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj
+++ b/StabilityMatrix.Avalonia/StabilityMatrix.Avalonia.csproj
@@ -52,6 +52,10 @@
+
+
+
+
diff --git a/StabilityMatrix.Core/Models/Api/Comfy/ComfySampler.cs b/StabilityMatrix.Core/Models/Api/Comfy/ComfySampler.cs
new file mode 100644
index 00000000..7ae0ecdc
--- /dev/null
+++ b/StabilityMatrix.Core/Models/Api/Comfy/ComfySampler.cs
@@ -0,0 +1,30 @@
+namespace StabilityMatrix.Core.Models.Api.Comfy;
+
+public readonly record struct ComfySampler(string Name)
+{
+ /// SAMPLERS = ["euler", "euler_ancestral", "heun", "dpm_2", "dpm_2_ancestral",
+ /// "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", "dpmpp_sde", "dpmpp_sde_gpu",
+ /// "dpmpp_2m", "dpmpp_2m_sde", "dpmpp_2m_sde_gpu", "ddim", "uni_pc", "uni_pc_bh2"]
+ private static Dictionary ConvertDict { get; } = new()
+ {
+ ["euler"] = "Euler",
+ ["euler_ancestral"] = "Euler Ancestral",
+ ["heun"] = "Heun",
+ ["dpm_2"] = "DPM 2",
+ ["dpm_2_ancestral"] = "DPM 2 Ancestral",
+ ["lms"] = "LMS",
+ ["dpm_fast"] = "DPM Fast",
+ ["dpm_adaptive"] = "DPM Adaptive",
+ ["dpmpp_2s_ancestral"] = "DPM++ 2S Ancestral",
+ ["dpmpp_sde"] = "DPM++ SDE",
+ ["dpmpp_sde_gpu"] = "DPM++ SDE GPU",
+ ["dpmpp_2m"] = "DPM++ 2M",
+ ["dpmpp_2m_sde"] = "DPM++ 2M SDE",
+ ["dpmpp_2m_sde_gpu"] = "DPM++ 2M SDE GPU",
+ ["ddim"] = "DDIM",
+ ["uni_pc"] = "UniPC",
+ ["uni_pc_bh2"] = "UniPC BH2"
+ };
+
+ public string DisplayName => ConvertDict.TryGetValue(Name, out var displayName) ? displayName : Name;
+}