Вступление:
Решил я на днях написать хорошую IDE для OpenComputers и столкнулся с тем, что в ванильной OpenOS
напрочь отсутствует подсветка синтаксиса. Надо это исправить!
Если найдутся какие-либо недочеты в плане правильности подсветки - пишите, пофиксим.
Скачать библиотеку:
https://github.com/IgorTimofeev/MineOS/blob/2967e780d35c2e4363dd7fe81de5ba78310c3d55/lib/oldSyntax.lua
Инструкция по использованию:
--Подключаем библиотеку
local syntax = require("syntax")
--Создаем любую строку с операторами lua
local stroka = "while true do print(\"Hello world!\")"
--x, y - стартовые координаты отрисовки текста.
--limit - ограничение отрисовки по ширине строки. Зачем рисовать лишние пиксели?
local x, y, limit = 2, 2, 20
--Выводим строку на экран в подсвеченном варианте
syntax.highlightAndDraw(x, y, limit, stroka)
На экране отобразится следующее:
Другие функции:
● syntax.setColorScheme(цветовая схема)
Устанавливает цветовую схему по выбору пользователя.
На данный момент есть лишь две схемы: "midnight" и "sunrise".
● syntax.highlightFileForDebug(путь к файлу [,цветовая схема])
Открывает обычный файл по указанному пути и выводит его содержимое
в подсвеченном виде на экран. Размер содержимого ограничен размером экрана.
Пример использования этой функции предоставлен на самом первом скриношоте.
Насчет оптимизации и ускорения:
Я постарался минимизировать задержки в выполнении скрипта различными путями.
Во-первых, отрисовка выполняется не попиксельно, а построчно. То есть если мы имеем строку красного цвета,
то функция отрисовки выведет на экран сразу всю строку, а не каждый символ по отдельности.
Во-вторых, цвет текста изменяется только тогда, когда это необходимо, а не каждый раз при смене символов.
На данный момент у программы есть существенный минус: при отрисовке выполняется поиск совпадений шаблонов
по строке через оператор string.find(), однако изначально он не дружит с юникодом. Поэтому пришлось использовать
костыль unicode.find(), существенно замедляющий процесс поиска. Если у кого-то имеется более оптимизированный
костыль или способ поиска по юникоду, буду крайне благодарен за помощь в этом деле.
Для ясности прикладываю видосик:
http://www.youtube.com/watch?v=T-f8jGdYO0M&feature=youtu.be
Исходный код unicode.find():
function unicode.find(str, pattern, init, plain)
if init then
if init < 0 then
init = -#unicode.sub(str,init)
elseif init > 0 then
init = #unicode.sub(str,1,init-1)+1
end
end
a, b = string.find(str, pattern, init, plain)
if a then
local ap,bp = str:sub(1,a-1), str:sub(a,b)
a = unicode.len(ap)+1
b = a + unicode.len(bp)-1
return a,b
else
return a
end
end