|
|
|
@@ -0,0 +1,94 @@
|
|
|
|
|
using Godot;
|
|
|
|
|
using Godot.Collections;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
|
|
|
|
|
namespace ReEdit.Syntax
|
|
|
|
|
{
|
|
|
|
|
public partial class Lua : SyntaxHighlighter
|
|
|
|
|
{
|
|
|
|
|
// Define Godot colors matching VS Code defaults
|
|
|
|
|
private static readonly Color ColorKeyword = Color.FromHtml("#C586C0"); // Purple
|
|
|
|
|
private static readonly Color ColorFunction = Color.FromHtml("#DCDCAA"); // Yellow
|
|
|
|
|
private static readonly Color ColorString = Color.FromHtml("#CE9178"); // Peach
|
|
|
|
|
private static readonly Color ColorLocal = Color.FromHtml("#CE7882"); // redish
|
|
|
|
|
private static readonly Color ColorNumber = Color.FromHtml("#B5CEA8"); // Sage Green
|
|
|
|
|
private static readonly Color ColorVariable = Color.FromHtml("#9CDCFE"); // Sky Blue
|
|
|
|
|
private static readonly Color ColorConstant = Color.FromHtml("#4FC1FF"); // Cyan Blue
|
|
|
|
|
private static readonly Color ColorComment = Color.FromHtml("#6A9955"); // Foliage Green
|
|
|
|
|
private static readonly Color ColorOperator = Color.FromHtml("#D4D4D4"); // Light Gray
|
|
|
|
|
|
|
|
|
|
// Token rule definition structure
|
|
|
|
|
private struct TokenRule
|
|
|
|
|
{
|
|
|
|
|
public Regex Regex;
|
|
|
|
|
public Color Color;
|
|
|
|
|
|
|
|
|
|
public TokenRule(string pattern, Color color)
|
|
|
|
|
{
|
|
|
|
|
Regex = new Regex("^(" + pattern + ")", RegexOptions.Compiled);
|
|
|
|
|
Color = color;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static readonly TokenRule[] Rules = new TokenRule[]
|
|
|
|
|
{
|
|
|
|
|
new TokenRule(@"--\[\[[\s\S]*?\]\]|--.*", ColorComment),
|
|
|
|
|
new TokenRule(@"\[\[[\s\S]*?\]\]|""([^""\\]|\\.)*""|'([^'\\]|\\.)*'", ColorString),
|
|
|
|
|
new TokenRule(@"\b(and|break|do|else|elseif|end|for|function|if|in|not|or|repeat|return|then|until|while)\b", ColorKeyword),
|
|
|
|
|
new TokenRule(@"\b(local)\b", ColorLocal),
|
|
|
|
|
new TokenRule(@"\b(true|false|nil)\b", ColorConstant),
|
|
|
|
|
new TokenRule(@"\b[a-zA-Z_][a-zA-Z0-9_]*(?=\s*\()", ColorFunction),
|
|
|
|
|
new TokenRule(@"\b0x[0-9a-fA-F]+\b|\b\d+(\.\d+)?\b", ColorNumber),
|
|
|
|
|
new TokenRule(@"==|~=|<=|>=|\.\.|[.+\-*/%^#=<>(){}\[\];,:]", ColorOperator),
|
|
|
|
|
new TokenRule(@"\b[a-zA-Z_][a-zA-Z0-9_]*\b", ColorVariable)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public override Godot.Collections.Dictionary _GetLineSyntaxHighlighting(int lineIdx)
|
|
|
|
|
{
|
|
|
|
|
var highlightingData = new Godot.Collections.Dictionary();
|
|
|
|
|
string lineText = GetTextEdit().GetLine(lineIdx);
|
|
|
|
|
|
|
|
|
|
int currentColumn = 0;
|
|
|
|
|
int lineLength = lineText.Length;
|
|
|
|
|
|
|
|
|
|
while (currentColumn < lineLength)
|
|
|
|
|
{
|
|
|
|
|
if (char.IsWhiteSpace(lineText[currentColumn]))
|
|
|
|
|
{
|
|
|
|
|
currentColumn++;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string remainingText = lineText.Substring(currentColumn);
|
|
|
|
|
bool matchFound = false;
|
|
|
|
|
|
|
|
|
|
foreach (var rule in Rules)
|
|
|
|
|
{
|
|
|
|
|
Match match = rule.Regex.Match(remainingText);
|
|
|
|
|
|
|
|
|
|
if (match.Success)
|
|
|
|
|
{
|
|
|
|
|
int tokenLength = match.Length;
|
|
|
|
|
|
|
|
|
|
var colorContainer = new Dictionary { { "color", rule.Color } };
|
|
|
|
|
highlightingData[currentColumn] = colorContainer;
|
|
|
|
|
|
|
|
|
|
currentColumn += tokenLength;
|
|
|
|
|
matchFound = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!matchFound)
|
|
|
|
|
{
|
|
|
|
|
var fallbackColor = new Dictionary { { "color", ColorVariable } };
|
|
|
|
|
highlightingData[currentColumn] = fallbackColor;
|
|
|
|
|
currentColumn++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return highlightingData;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|