Перейти к содержимому
ECS

Подсветка синтаксиса Lua.

Рекомендуемые сообщения

6e2c59edf4ca9eaf03cfae2b07b2b5a4.png

 

Вступление:

Решил я на днях написать хорошую 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)

На экране отобразится следующее:

 

4c5c4b4dd2c8c3e259f16e9a8b232ac0.png

 

 

Другие функции:

 

● 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если я правильно помню, unicode.find() удалили из мода, можно поискать в старой версии мода или на OpenPrograms.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если я правильно помню, unicode.find() удалили из мода, можно поискать в старой версии мода или на OpenPrograms.

Нет, ты помнишь неправильно. unicode.find недавно написал gamax92 в ответ на мою просьбу о помощи в IRC. И кстати, эта реализация find работает неправильно со сложными паттернами.

 

А вот подсветка замечательная, хотелось бы увидеть ее в стандартном edit.lua

Изменено пользователем Krutoy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так можно русские буквы вообще не обрабатывать - нету русских букс  синтаксисе lua.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Лайк, за отсутствие ругательств в комментах)

Зато в коде на видео если приглядеться то можно найти очень интересную функцию с занимательным названием :D

Я смотрю автор очень любить РУССКУЮ РЕЧЬ :)

 

А в целом респект автору за аддончик к стандартному редактору! :smile9:

Продолжай нас радовать своими разработками, @.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так можно русские буквы вообще не обрабатывать - нету русских букс  синтаксисе lua.

Подумай ещё немного. Не понял?

Содержимое строк ты тоже всегда на английском пишешь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отрисовать OC сможет и так, без find.

На счет матов: нашел парочку)

Жми "Ответить" под сообщение, неудобно ориентироваться.

Отрисовать он сможет и так, согласен. А вот отыскать в строке юникодовскую последовательность? Он ведь этим занимается сначала (см. код).

Ну а маты — не зацикливайся на этом)) Сам же нецензурную лексику употребляешь. Тем более, что в программах важна работоспособность в первую очередь, а комменты большинство почти не читают.

 


Штука хорошая, выглядит удобной. Надо бы впилить в едит такое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Штука хорошая, выглядит удобной. Надо бы впилить в едит такое.
 

Это легко)

 

 

Ну а маты — не зацикливайся на этом)) Сам же нецензурную лексику употребляешь. Тем более, что в программах важна работоспособность в первую очередь, а комменты большинство почти не читают.

Когда общаешься, а когда читаешь код - это разные вещи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Давно хотел заняться вводом цветов в редактор, но и так загружен несколькими задумками. Не совсем понял для чего использовать библиотеку отдельно, на мой взгляд будет удобнее сделать копию оригинального редактора и дополнить уже его. Нецензурные словечки в коде напрягают :unsure:.  Скорость прорисовки надо будет еще допиливать, хотя не уверен, что сильно возрастет

 

PS: В циклах используй кеширование функций для unicode.find, получишь прирост скорости на 20% минимум

for i = 1, 1000 do
   math.sin(i)
end
  работает на 30% медленее, чем
local sin = math.sin //кеширование функции
for i = 1, 1000 do
   sin(i)
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Не совсем понял для чего использовать библиотеку отдельно

 

Для сторонних программ, разумеется. Меня стандартный Edit не устраивает ни коим образом, буду допиливать свою среду разработки. А помимо этой среды подсветку буду юзать в предпросмотре файлов в клиенте Pastebin - то есть мы уже имеем как минимум две программы, где потребуется данная либа. Не дублировать же один и тот же код в каждой из них, верно?  :D

 

В циклах используй кеширование функций для unicode.find,

 

А вот за это большое спасибо, люблю конструктив. Сейчас потестирую быстродействие. 

 


 

UPD: прироста скорости не заметил вовсе. Если она и возросла, то визуально это не подтвердилось.

Изменено пользователем EliteClubSessions

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В этой среде должно быть много вкусняшек,копирование тоже не помешает,причём работающий во всех вещах,где только текст можно вводить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

UPD: прироста скорости не заметил вовсе. Если она и возросла, то визуально это не подтвердилось.

Реальный прирост лишь во время длительной обработки циклами

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не понял назначения параметра limit. По моему ничего он там не ограничивает.

Библиотеку попробую использовать в редакторе форм. Обрезку строк нужно будет допилить. Причем не только справа, но и слева.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Не понял назначения параметра limit. По моему ничего он там не ограничивает.

 

Это аналог string:sub() по сути. Если строка имеет 1000 символов, то логично, что ее нужно обрезать по ширине экрана, чтобы не рисовался лишний кал и не нагружался gpu. Limit этим и занимается. И не нужно писать "по-моему" - мне, как автору либы, лучше знать, ограничивает данный аргумент что-то или нет. Насчет обрезки слева - да, сделаю в ближайшем времени, спасибо ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я лишь высказал свое скромное мнение по поводу файла, выложенного Вами на гитхаб на момент высказывания:

 

 

--Нарисовать созданный массив по указанным координатам и обрезать строку до указанной длины.
function syntax.highlightAndDraw(x, y, limit, text)
	--Чутка левее делаем координату, т.к. цикл начинается с 1
	x = x - 1
	--Получаем подсвеченный массив
	local massiv = syntax.highlight(text)
	--Задаем стартовый цвет
	local currentColor = currentColorScheme.text
	gpu.setForeground(currentColor)
	--Перебираем все элементы полученного массива
	local symbol = 1
	while symbol <= #massiv do
		--Легкая оптимизация. Меняет цвет текста только в случае несоответствия текущего цвета и цвета из массива
		if currentColor ~= massiv[symbol].color then currentColor = massiv[symbol].color; gpu.setForeground(massiv[symbol].color) end
		--Жирная оптимизация. Анализирует ближайшие цвета создает одну строку из массы символов вместо одного символа
		local stro4ka = massiv[symbol].symbol
		--Считаем кол-во последующих символов с таким же цветом, как и у этого
		local counter = 1
		--Перебираем все символы с последующего и до конца
		for nextSymbol = (symbol + 1), #massiv do
			--Если цвет последующего равен текущему
			if massiv[nextSymbol].color == massiv[symbol].color then
				--То прибавить к строчке следующий символ
				stro4ka = stro4ka .. massiv[nextSymbol].symbol
				--Записать в counter, что символы совпали, значит, +1 к нему
				counter = counter + 1
			else
				break
			end
		end
		--Отрисовываем целую строку сразу одним цветом
		gpu.set(x + symbol, y, stro4ka)
		--Прибавляем к символу столько, сколько схожего цвета насчитало
		symbol = symbol + counter
		--Очищаем память
		stro4ka, counter = nil, nil
	end
end 

 

 

Но Вам, как автору, конечно лучше знать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

мне, как автору либы, лучше знать, ограничивает данный аргумент что-то или нет. 
Ты попал в неловкое положение, потому что параметр limit действительно нигде не используется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты попал в неловкое положение, потому что параметр limit действительно нигде не используется.

Мне одному кажется, что там аж 5 раз употреблён аргумент "limit"?

(А судить старую версию не надо)

 

 

w9UXzDi.png

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...