Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пт окт 20, 2017 1:49 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 11 сообщений ] 
Автор Сообщение
СообщениеДобавлено: Сб окт 07, 2017 9:16 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4219
Я уже давно очень хочу две вещи (на самом деле пять). Те, которые я теоретически смогу реализовать это текстовый редактор и редактор иконок (а которые не смогу это unarchiver, wifi и С-- в Колибри).

Эта тема посвящена теории разработки текстового редактора с подсветкой синтаксиса.
Дабы не велосипедить, я вначале хочу обсудить как правильно его реализовать.

Основные вещи, которые вызовут трудности. Интересует ваше мнение. Я буду писать как я это вижу.

1. как хранить текст документа.
При открытиии все строки разбиваем на массив данных: id (unic, enum), line_number, string_data
Пример:
Код:
Примет мир
Я вторая строка.
Будет хранится как: 0, 0, "Привет мир"
1, 1, "Я вторая строка"
Для текста используется один буффер, в котором хранятся строки. Если строка именяется, она переносится в конец буфера. При этом старая строка больше не будет использоваться в программе.
"Привет мир\0Я вторая строка\0" > "Привет мир\0Я вторая строка\0\Привет мир измененная"
При сохранении документа можно проводить дефрагментацию.

2. поиск лексем для применения стилей
Стили могут применятся или к словам или к блокам.
Слова: int, void, else, #define
Блоки: после //, между /* */, между ""
Как правильно реализовать такой поиск и как хранить стили?
Каждую подстроку разбивать еще на массив строк-стилей? Звучит сложно...

3. как выводить текст
Надо решить или в буфер или рисовать фоновый прямоугольник, а наверх текст - не знаю.

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Вс окт 08, 2017 12:19 am 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 541
Leency писал(а):
Дабы не велосипедить, я вначале хочу обсудить как правильно его реализовать.

А вариант переноса или идей компонента Scintilla не рассматривался?


Вернуться к началу
СообщениеДобавлено: Вс окт 08, 2017 1:39 am 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1187
Учитывая, что Scintilla разрабатывают уже 16 лет, портирование - наиболее логичный вариант.

Leency
Я ещё когда с TinyPad возился, чуть фейспалмом лоб не пробил... А массив указателей на строки сделать не вариант? Зачем в массив структур включать сами строки? Почто текст мучить? Может даже лучше связный список структур с указателями на строки.


Вернуться к началу
СообщениеДобавлено: Вс окт 08, 2017 3:01 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 83
Leency, во-первых в твоих программах вывод текста в буфер сделан неправильно. Ты создаешь огромный буфер и рисуешь туда текст, затем, выводишь в окно программы ту часть буфера, которая требуется. Это совершенно неприличный расход памяти (и её может не хватить). Надо, чтобы буфер соответствовал размеру окна программы. При обновлении окна программы, содержимое буфера стирается и текст рисуется заново, естественно, только те строки, которые попадают в окно.

Текст можно представить как список строк, где строка представляет собой структуру, главное поле которой -- символьный массив (или его адрес) (потребуются еще и другие поля: длина, флаг изменения, флаг сохранения...). Хранить номер строки не надо: при вставке, удалении строк нумерация нарушится и каждый раз ее поправлять -- это лишний геморрой. Если строк в тексте не миллионы, то номер строки можно узнать путем простого пересчета структур в списке до текущей строки.

Подсветку синтаксиса я делал так:
Каждая строка перед выводом в буфер парсится и, по мере нахождения в строке той или иной лексемы, лексема выводится в графический буфер заданным цветом. Никакие списки лексем не создаются, потому что строки изменяемы и списки лексем тоже придется менять. Парсить надо только те строки, которые попадают в окно программы. На экране помещается всего несколько десятков строк, и поэтому такой способ, если сделать правильно, будет эффективен.
Здесь еще надо обратить внимание на многострочные комментарии. Начало комментария может быть выше видимой части текста. Поэтому, перед началом работы с текстом, надо найти все комментарии и пометить строки, в которых комментарий начинается, заканчивается или продолжается. И после изменения любой строки, проверить её на наличие в ней начала или конца комментария, чтобы поддерживать информацию о расположении комментариев актуальной.

Разработка текстового редактора -- дело сложное. У меня есть некоторый опыт, хотя на идеал я не притендую.

К сожалению, когда я это делал, опыта у меня не хватало и о кроссплатформенности я не заботился. Программа жестко привязана к WINAPI.

Спойлер: Показать
Вложение:
1.png
1.png [ 16.9 КБ | 244 просмотра ]


Вернуться к началу
СообщениеДобавлено: Вс окт 08, 2017 11:11 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4219
Kopa
В идеале было бы круто, но я такое не потяну.

Leency
string_data и предполагался быть указателем.
> Может даже лучше связный список структур с указателями на строки.
Интересно, очень даже может быть.

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Вс окт 08, 2017 11:50 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4219
akron1
Спасибо за развернутое объяснение.

Цитата:
Leency, во-первых в твоих программах вывод текста в буфер сделан неправильно. Ты создаешь огромный буфер и рисуешь туда текст, затем, выводишь в окно программы ту часть буфера, которая требуется. Это совершенно неприличный расход памяти (и её может не хватить). Надо, чтобы буфер соответствовал размеру окна программы. При обновлении окна программы, содержимое буфера стирается и текст рисуется заново, естественно, только те строки, которые попадают в окно.
В WebView такое сделать сейчас нельзя, т.к. процесс парсинга и рисования однопроходный. Для того, чтобы реализовать буфер окна нужен DOM.
В Calypte такое можно попробовать следать уже сейчас.
Для TxtView чтобы такое сделать нужно две вещи:
1. перевести каждый символ KF шрифта в растр (как делаешь ты в BF view)
2. написать функцию, которая будет накладывать партинку на картинку

Цитата:
Подсветку синтаксиса я делал так:
Каждая строка перед выводом в буфер парсится и, по мере нахождения в строке той или иной лексемы, лексема выводится в графический буфер заданным цветом. Никакие списки лексем не создаются, потому что строки изменяемы и списки лексем тоже придется менять. Парсить надо только те строки, которые попадают в окно программы. На экране помещается всего несколько десятков строк, и поэтому такой способ, если сделать правильно, будет эффективен.
Здесь еще надо обратить внимание на многострочные комментарии. Начало комментария может быть выше видимой части текста. Поэтому, перед началом работы с текстом, надо найти все комментарии и пометить строки, в которых комментарий начинается, заканчивается или продолжается. И после изменения любой строки, проверить её на наличие в ней начала или конца комментария, чтобы поддерживать информацию о расположении комментариев актуальной.
Интересно. Вообще дело в том, что не только комментарии могут быть многострочными, но и строки "". Если реализовыватть только подсветку Си - вроде просто.
Но если универстально, чтобы использовались файлы подсветки разных систаксисов не думаю что твой вариант "надо найти все комментарии и пометить строки, в которых комментарий начинается, заканчивается или продолжается". Например в HTML таких мест будет очень много.

Цитата:
Разработка текстового редактора -- дело сложное. У меня есть некоторый опыт, хотя на идеал я не притендую.
У меня нет и я даже не имею ИТ образования. Многие студенты как курсовую делают редакторы. Смотрю исходники других проектов, анализирую. Возможно, стоит нанять человека на разработку или портирование редактора...

_________________
Через тернии к звездам


Вернуться к началу
СообщениеДобавлено: Пн окт 09, 2017 1:42 am 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1076
Некоторые рассматривали возможность портирования Scintilla. Интересует их мнение на этот счёт. Детально ещё не смотрел, возможно ли обойтись без GTK+?

_________________
я лишь учусь


Вернуться к началу
СообщениеДобавлено: Пн окт 09, 2017 5:04 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1071
punk_joker писал(а):
возможно ли обойтись без GTK+
Siemargl писал, что можно FLTK.


Вернуться к началу
СообщениеДобавлено: Пн окт 09, 2017 3:35 pm 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 268
Да, только я никак не возьмусь за ФЛТК - все же большой объем непонятного кода


Вернуться к началу
СообщениеДобавлено: Вт окт 10, 2017 11:42 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1071
Siemargl, если можно как-то разбить задачу на части, то может кто-нибудь ещё примет участие и тогда это будет быстрее.


Вернуться к началу
СообщениеДобавлено: Пт окт 13, 2017 1:24 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1071
Leency писал(а):
2. поиск лексем для применения стилей
Там вон какой-то лексер http://websvn.kolibrios.org/filedetails ... %2Flexer.h


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 11 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB