Skip to content

Instantly share code, notes, and snippets.

@AlexeyTolstopyatov
Created August 9, 2024 11:02
Show Gist options
  • Save AlexeyTolstopyatov/9d8d5c33723c66ce7218e87afbb6bae6 to your computer and use it in GitHub Desktop.
Save AlexeyTolstopyatov/9d8d5c33723c66ce7218e87afbb6bae6 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using UnityEngine; // база
using TMPro; // TextMeshPro
/// <summary>
/// Определение типа "Слова".
/// Если я помню правильно, аттрибут нужен, чтобы Юня
/// увидела это как группу/поле в свойствах
/// </summary>
[Serializable]
public class Keyword
{
/// <summary>
/// Создает экземпляр Слова
/// </summary>
/// <param name="what">Что за слово</param>
/// <param name="which">Как подсвечивать</param>
public Keyword(string what, Color which)
{
Value = what;
HColor = which;
}
public string Value;
public Color HColor; // Чтобы не было повторений с названием класса.
}
/// <summary>
/// Логика поведения текстового поля
/// </summary>
public class SyntaxHighlightTextField : MonoBehavoiur
{
// Выдам пару экземплятор для расцветки, чтобы удобнее было жить
// * комментарий,
// * ключевое слово (function/end/return/local),
// * процедуры (yield()/print()/...),
// * поля (переменные)
public static Color Comment = new Color(0, 255, 255);
public static Color Word = new Color(255, 0, 0);
public static Color Procedure = new Color(0, 0, 0);
public static Color Field = new Color(255, 255, 255);
private TMP_InputField _codef; // Code Field
private TMP_Text _reff; // Reference Field
/// <summary>
/// Карта с ключевыми словами.
/// </summary>
private Keyword[] _keyws = { // Keywords
new Keyword("function", Word),
new Keyword("end", Word),
new Keyword("return", Word),
new Keyword("local", Word)
// и т.д.
}
/// <summary>
/// База от MonoBehaviour. По идее логика при (или после)
/// инициализации сцены....начинается отсюда.
/// </summary>
private void Start()
{
// tobj объект Unity для обработки текста. Значение new GameObject(String)
// это название элемента (объекта) на сцене.
GameObject tobj = new GameObject("CodeField");
// Чтобы поле ввода обрабатывало значения, могу предположить можно сделать это:
_codef.onValueChanged.AddListener(HighlightValueChanged);
HighlightValueChanged(_codef.text);
}
/// <summary>
/// Применяет подсветку
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
private string ApplyHighlighting(string text)
{
string textf = // Text Formatted
$"<color=#{ColorUtility.ToHtmlStringRGB(Color.white)}>{text}</color>";
// Применить подсветку на все слова...
foreach (var keyw in _keyws)
{
textf =
textf.Replace(
keyw.keyword,
$"<color=#{ColorUtility.ToHtmlStringRGB(mapping.color)}>{mapping.keyword}</color>"
);
}
return textf;
}
/// <summary>
/// Обработчик событий для поля
/// </summary>
private void HighlightValueChanged(string text)
{
// Очистить предыдущий текст
reff.text = string.Empty;
// Применить подсветку на текст
reff.text = ApplyHighlighting(text);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment