Модераторы: Vitalik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение типа: строка/коментарий, предложение 
:(
    Опции темы
Sep.
Дата 7.9.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: 6
Всего: 6



Тема определения в подсветке для каждого стиля, является ли он строкой или комментарием, уже была затронута Seldon. Добавлю лишь, что если сделать это по намеченному пути - с доступом через GetHighlighterAttriAtRowCol возможны проблемы с расстановкой FoldRanges. 
  Я реализовал проверку строка/комметарий при определении CodeFolding.FoldRanges и для типа токена Character работает еще более-менее, но для Keyword - уже слишком медленно. (Загрузка файла SynEdit.pas 400кб при подсветке delphi.hgl занимает около 5 секунд!) В данный момент проверка осуществляется через имя стиля, так же как уже реализовано в MatchBracket.
Код
                GetHighlighterAttriAtRowCol(CharIndexToRowCol(Ptr-Start-1),s,a);      
                if Assigned(a) then s:=LowerCase(a.Name)                            
                else s:='';                                                         
                if (s<>'')and((pos('string',s)=1)or                             
                              (pos('comment',s)=1)or                              
                              (pos('remark',s)=1))then break;

Т.е. через смещение от начала файла высчитывается положение токена, потом берутся его аттрибуты, потом pos'ы вносят свой вклад. Если добавить еще какую нибудь переменную в аттрибут, которая будет задаваться в подсветке и показывать тип токена, то pos'ов конечно не станет. Но все равно не очень рационально.
Для этого уже есть встроенный более быстрый механизм SkipRegions, но к нему нет доступа в SynUniHL и дизайнере.
Можно только задать самому программно:
Код

edit.CodeFolding.FoldRegions.SkipRegions.Add('//','','',itSingleLineComment);
edit.CodeFolding.FoldRegions.SkipRegions.Add('/*','*/','',itMultiLineComment);
edit.CodeFolding.FoldRegions.SkipRegions.Add('"','"','\',itString);

Но тогда получается, что надо дорабатывать дизайнер, и нет никакой связи со строками/коментариями которые уже определены в подсветке. Есть и еще один минус, сейчас при закрытии SynEdit при использовании SkipRegions выдает exception. Скорее всего перестарались с модом на освобождение памяти.
Так как вообще порациональней бы придумать определение строка/комментарий с быстрым доступом? Есть ли возможность обойти CharIndexToRowCol? В TSynTokenMatch вообще используется некий GetTokenKind который есть в стандарных подсветках SynEdit.
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Seldon
Дата 7.9.2006, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 23.12.2005
Где: Minsk

Репутация: 2
Всего: 2



Цитата(Sep. @  7.9.2006,  18:39 Найти цитируемый пост)
для типа токена Character работает еще более-менее, но для Keyword - уже слишком медленно.
хм, почему? и то и то  объект класса TSynHighlighterAttributes...

Цитата(Sep. @  7.9.2006,  18:39 Найти цитируемый пост)
Так как вообще порациональней бы придумать определение строка/комментарий с быстрым доступом? Есть ли возможность обойти CharIndexToRowCol?
но ведь CharIndexToRowCol как я понимаю используецца не для получения стиля.... судя по куску кода, ты как-то перебираешь все слова в тексте и для каждого получаешь атрибуты? Я не в курсе как функционирует CodeFolding, но всё же вышли проблемный исходник на seldon.mib пёсик gmail точка com - попытаюсь оптимизировать. только вышли пожалуйста со всеми зависимостями (вроде пропатченного тобой и иностранцем smile SynEdit.pas) - чтобы я мог сходу всё это скомпилить.

Цитата
TSynTokenMatch вообще используется некий GetTokenKind который есть в стандарных подсветках SynEdit.
насколько я понимаю механизм, скорости это не прибавит, это просто другой метод идентификации чем являецца токен...
--------------------
MiBEditor v2.Alpha 10 - Программерский редактор
PM MAIL WWW   Вверх
Sep.
Дата 7.9.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: 6
Всего: 6



Цитата

но ведь CharIndexToRowCol как я понимаю используецца не для получения стиля

ага, мне нужно пересчитывать позицию от начала файла в позицию колонка:строка для обращения к GetHighlighterAttriAtRowCol, лишнее действие.
Цитата

судя по куску кода, ты как-то перебираешь все слова в тексте и для каждого получаешь атрибуты?

я получаю аттрибуты когда найден открывающий или закрывающий токен для foldrange и смотрю можно ли его использовать или нет
Цитата

Я не в курсе как функционирует CodeFolding, но всё же вышли проблемный исходник на seldon.mib пёсик gmail точка com - попытаюсь оптимизировать. только вышли пожалуйста со всеми зависимостями (вроде пропатченного тобой и иностранцем  SynEdit.pas) - чтобы я мог сходу всё это скомпилить.

Дак это он и есть, можешь скачать сегодняшний SynMix и раскоментировать строки для //###mod CF-range in comments в ScanUsingFoldRegions.
Цитата

насколько я понимаю механизм, скорости это не прибавит, это просто другой метод идентификации чем являецца токен

ага, но он хоть без pos'ов =)
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




[ Время генерации скрипта: 0.0643 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.