ECS 1 903 Опубликовано: 5 сентября, 2015 Вступление: Решил я на днях написать хорошую 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 7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 5 сентября, 2015 Лайк, за отсутствие ругательств в комментах) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 5 сентября, 2015 Если я правильно помню, unicode.find() удалили из мода, можно поискать в старой версии мода или на OpenPrograms. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 5 сентября, 2015 (изменено) Если я правильно помню, unicode.find() удалили из мода, можно поискать в старой версии мода или на OpenPrograms. Нет, ты помнишь неправильно. unicode.find недавно написал gamax92 в ответ на мою просьбу о помощи в IRC. И кстати, эта реализация find работает неправильно со сложными паттернами. А вот подсветка замечательная, хотелось бы увидеть ее в стандартном edit.lua Изменено 5 сентября, 2015 пользователем Krutoy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 5 сентября, 2015 Так можно русские буквы вообще не обрабатывать - нету русских букс синтаксисе lua. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SDV 784 Опубликовано: 5 сентября, 2015 Лайк, за отсутствие ругательств в комментах)Зато в коде на видео если приглядеться то можно найти очень интересную функцию с занимательным названием Я смотрю автор очень любить РУССКУЮ РЕЧЬ А в целом респект автору за аддончик к стандартному редактору! Продолжай нас радовать своими разработками, @. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 5 сентября, 2015 Так можно русские буквы вообще не обрабатывать - нету русских букс синтаксисе lua. Подумай ещё немного. Не понял? Содержимое строк ты тоже всегда на английском пишешь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 5 сентября, 2015 Отрисовать OC сможет и так, без find. На счет матов: нашел парочку) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 5 сентября, 2015 Отрисовать OC сможет и так, без find. На счет матов: нашел парочку) Жми "Ответить" под сообщение, неудобно ориентироваться. Отрисовать он сможет и так, согласен. А вот отыскать в строке юникодовскую последовательность? Он ведь этим занимается сначала (см. код). Ну а маты — не зацикливайся на этом)) Сам же нецензурную лексику употребляешь. Тем более, что в программах важна работоспособность в первую очередь, а комменты большинство почти не читают. Штука хорошая, выглядит удобной. Надо бы впилить в едит такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov 34 Опубликовано: 5 сентября, 2015 Штука хорошая, выглядит удобной. Надо бы впилить в едит такое. Это легко) Ну а маты — не зацикливайся на этом)) Сам же нецензурную лексику употребляешь. Тем более, что в программах важна работоспособность в первую очередь, а комменты большинство почти не читают. Когда общаешься, а когда читаешь код - это разные вещи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 5 сентября, 2015 Давно хотел заняться вводом цветов в редактор, но и так загружен несколькими задумками. Не совсем понял для чего использовать библиотеку отдельно, на мой взгляд будет удобнее сделать копию оригинального редактора и дополнить уже его. Нецензурные словечки в коде напрягают . Скорость прорисовки надо будет еще допиливать, хотя не уверен, что сильно возрастет 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 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 5 сентября, 2015 (изменено) Не совсем понял для чего использовать библиотеку отдельно Для сторонних программ, разумеется. Меня стандартный Edit не устраивает ни коим образом, буду допиливать свою среду разработки. А помимо этой среды подсветку буду юзать в предпросмотре файлов в клиенте Pastebin - то есть мы уже имеем как минимум две программы, где потребуется данная либа. Не дублировать же один и тот же код в каждой из них, верно? В циклах используй кеширование функций для unicode.find, А вот за это большое спасибо, люблю конструктив. Сейчас потестирую быстродействие. UPD: прироста скорости не заметил вовсе. Если она и возросла, то визуально это не подтвердилось. Изменено 5 сентября, 2015 пользователем EliteClubSessions 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant 442 Опубликовано: 5 сентября, 2015 В этой среде должно быть много вкусняшек,копирование тоже не помешает,причём работающий во всех вещах,где только текст можно вводить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 5 сентября, 2015 UPD: прироста скорости не заметил вовсе. Если она и возросла, то визуально это не подтвердилось. Реальный прирост лишь во время длительной обработки циклами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 7 сентября, 2015 Не понял назначения параметра limit. По моему ничего он там не ограничивает. Библиотеку попробую использовать в редакторе форм. Обрезку строк нужно будет допилить. Причем не только справа, но и слева. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 8 сентября, 2015 Не понял назначения параметра limit. По моему ничего он там не ограничивает. Это аналог string:sub() по сути. Если строка имеет 1000 символов, то логично, что ее нужно обрезать по ширине экрана, чтобы не рисовался лишний кал и не нагружался gpu. Limit этим и занимается. И не нужно писать "по-моему" - мне, как автору либы, лучше знать, ограничивает данный аргумент что-то или нет. Насчет обрезки слева - да, сделаю в ближайшем времени, спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 8 сентября, 2015 Я лишь высказал свое скромное мнение по поводу файла, выложенного Вами на гитхаб на момент высказывания: --Нарисовать созданный массив по указанным координатам и обрезать строку до указанной длины. 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 Но Вам, как автору, конечно лучше знать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 8 сентября, 2015 мне, как автору либы, лучше знать, ограничивает данный аргумент что-то или нет. Ты попал в неловкое положение, потому что параметр limit действительно нигде не используется. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 9 сентября, 2015 Ты попал в неловкое положение, потому что параметр limit действительно нигде не используется. Мне одному кажется, что там аж 5 раз употреблён аргумент "limit"? (А судить старую версию не надо) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 9 сентября, 2015 И используется как-раз в алгоритме отрисовки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах