EnglishРусскийУкраїнська
В теме много сообщений

Подсветка синтаксиса для редактора JavaLikeCalc


Автор Сообщение
Сообщение создано: 28. 10. 2010 [15:21]
kuzulis
Денис Шиенков
Создатель темы
Зарегистрирован(а) с: 10.07.2009
Сообщения: 128
А имел я в виду следующее:
...
...


Хм, раз весь (ну или почти весь) API скады работает через формат XML, то можно формально описать подсветку с помощью него.. И тогда передавать в TextEdit помимо самого выходного текста еще и правила подсветки,

Или же передавать не сами правила - а только како-то код типа подсветки.
А уже имея этот код, TextEdit будет откуда-нибудь (из конфига, или из оперативной памяти, неважно) считывать правила подсветки и светить.

Например, можно взять формальное описание правил из редактора nodepad++, там они как раз на XML, и немного переделать их под наши нужды. Думаю, особо усложнять описание не нужно.

Вот, к примеру предлагаю нечто типо этого:
HTML
<LightLanguages>
    <Language name="jlc" id="1">
        <Rule name="singleLineComments">
            <Regexp>//[^\n]*</Regexp>
            <Pattern></Pattern>
            <Font color="0,0,1" size="8" name="Courier" style="Bold" />
            <Background color="" />
        </Rule>
        <Rule name="multiLineComments">
            <Regexp></Regexp>
            <Pattern>/* */</Pattern>
            <Font color="0,0,1" size="8" name="Tahoma" style="Italic" />
            <Background color="" />
        </Rule>
        <Rule name="systemKeywords">
            <Regexp></Regexp>
            <Pattern>var if else while for in break continue return using true false</Pattern>
            <Font color="0,0,1" size="8" name="Tahoma" style="Italic" />
            <Background color="" />
        </Rule>
        <Rule name="systemFunctions">
            <Regexp></Regexp>
            <Pattern>sin cos tan sinh cosh tanh asin acos atan rand lg ln exp pow max min sqrt abs sign ceil floor</Pattern>
            <Font color="0,0,1" size="8" name="Tahoma" style="Italic" />
            <Background color="" />
        </Rule>
        <Rule name="systemConstants">
            <Regexp></Regexp>
            <Pattern>pi e EVAL_BOOL EVAL_INT EVAL_REAL EVAL_STR</Pattern>
            <Font color="0,0,1" size="8" name="Tahoma" style="Italic" />
            <Background color="" />
        </Rule>
        <Rule name="numeric">
            <Regexp>\b([0-9]+|0[xX][0-9a-fA-F]+|0[0-7]+)(\.[0-9]+)?([eE][0-9]+)?\b</Regexp>
            <Pattern></Pattern>
            <Font color="0,0,1" size="8" name="Tahoma" style="Italic" />
            <Background color="" />
        </Rule>
        <Rule name="customKeywords1">
            <Regexp></Regexp>
            <Pattern></Pattern>
            <Font color="0,0,1" size="8" name="Tahoma" style="Italic" />
            <Background color="" />
        </Rule>
        ....
        ....
        ....
        и т.п.
    </Language>
    <Language name="с" id="2">
    ...
     тут правила для описания подсветки например для Си
    ...
    </Language>
    и т.п.
 
</LightLanguages>


Также мое имхо, для универсальности можно выбросить тэги типа <Pattern></Pattern>, а вместо них оставить <Regexp></Regexp>
, куда писать готовые регулярные выражения для выбора необходимых ключевых слов и т.п.
Считаю это наипростейшим решением, т.к. наверняка в разных GUI тулкитах есть классы/функции для обработки Reg Exp.

т.е. как я думаю (подитожу) , возможны два пути/механизма, получения GUI виджетом правил подсветки.
1. Как вы, Роман, говорили - путем получения всех необходимых в данный момент правил подсветки кода через API
2. Как я думаю - путем получения только кода правил подсветки (т.е. какого то идентификатора).

В принципе, для TextEdit-а неважно каким образом он получил правила, главное чтобы он правильно их разобрал и подсветил.

Моё ИМХО, для реализации подсветки в Qt конфигураторе нужно просто переунаследовать и переименовать все QTextEdit от QPlainTextEdit и реализацию процесса подсветки возложить на этот класс.

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

Как то так.







[Сообщение редактировалось 1 раз(а), в последний раз 28.10.2010 в 15:22.]
Сообщение создано: 28. 10. 2010 [18:22]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
"kuzulis" wrote:

Также мое имхо, для универсальности можно выбросить тэги типа <Pattern></Pattern>, а вместо них оставить <Regexp></Regexp>
, куда писать готовые регулярные выражения для выбора необходимых ключевых слов и т.п.
Считаю это наипростейшим решением, т.к. наверняка в разных GUI тулкитах есть классы/функции для обработки Reg Exp.

Согласен.

"kuzulis" wrote:

т.е. как я думаю (подитожу) , возможны два пути/механизма, получения GUI виджетом правил подсветки.
1. Как вы, Роман, говорили - путем получения всех необходимых в данный момент правил подсветки кода через API
2. Как я думаю - путем получения только кода правил подсветки (т.е. какого то идентификатора).

По идентификатору проще, но не правильно. Иначе при добавлении подсветки специфичной конфигурационной записи для нового модуля прийдётся лезть править все конфигураторы.

"kuzulis" wrote:

Моё ИМХО, для реализации подсветки в Qt конфигураторе нужно просто переунаследовать и переименовать все QTextEdit от QPlainTextEdit и реализацию процесса подсветки возложить на этот класс.

И зачем ломать то, что уже работает?
Особенно если учесть, что есть QSyntaxHighlighter и он работает с QTextEdit.

P.S. Подумаю над передачей правил подсветки, для текстовых полей, через интерфейс управления.

Учиться, учиться и учиться лучше чем работать, работать и работать.
Сообщение создано: 28. 10. 2010 [22:57]
Aleksey
Попков Алексей
Contributor
Зарегистрирован(а) с: 31.07.2008
Сообщения: 321
Рома +10.
Вот это терпение.
Респект.
Сообщение создано: 02. 11. 2010 [10:09]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
Добавил API для подсветки синтаксиса.
Подсветка сделана для JavaLikeCalc.JavaScript и отображается в QTCfg и Vision.
Алгоритм подсветки имеет ряд не решенных проблем. Попробуйте их решить!

Учиться, учиться и учиться лучше чем работать, работать и работать.
Сообщение создано: 02. 11. 2010 [11:22]
kuzulis
Денис Шиенков
Создатель темы
Зарегистрирован(а) с: 10.07.2009
Сообщения: 128
Алгоритм подсветки имеет ряд не решенных проблем. Попробуйте их решить!


Каких именно?

---

И еще, бегло просмотрев изменения (через WEB SVN интерфейс репозитория) задам пару вопросов:
1. Где реализация метода: rehighlight(); ?
2. Откуда берутся (будут бряться) XML правила для подсветки ? Из конфигурационного файла или БД? т.е. где они изначально хранятся в текущей реализации?
3. Какой формат (описание правил для подсветки) будет иметь (имеет) XML узел? Желательно кратко пример привести.

ЗЫ: Я пока не нашел в изменениях исходников этих вопросов.



[Сообщение редактировалось 3 раз(а), в последний раз 02.11.2010 в 11:51.]
Сообщение создано: 02. 11. 2010 [12:21]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
"kuzulis" wrote:

Алгоритм подсветки имеет ряд не решенных проблем. Попробуйте их решить!

Каких именно?

В блоке строки "абвгд" нельзя поставить '\"','//','/*', хотя это допустимо языком
Нельзя отдельно подсвечивать символ '/' иначе ломается блок коментария /* ... */.

"kuzulis" wrote:

И еще, бегло просмотрев изменения (через WEB SVN интерфейс репозитория) задам пару вопросов:

Сейчас отвечу на эти вопросы, но после не буду отвечать на подобное, поскольку этими вопросами Вы продемонстрировали не уважение к времени других. Ответы на все вопросы есть в общедоступных источниках и нужно только уважение к другим, умение и внимательность. Чего из этого у Вас нет?

"kuzulis" wrote:

1. Где реализация метода: rehighlight(); ?

В QT

"kuzulis" wrote:

2. Откуда берутся (будут бряться) XML правила для подсветки ? Из конфигурационного файла или БД? т.е. где они изначально хранятся в текущей реализации?

Как я ранее и говорил. Из интерфейса управления OpenSCADA.

"kuzulis" wrote:

3. Какой формат (описание правил для подсветки) будет иметь (имеет) XML узел? Желательно кратко пример привести.

Похожий на тот, что в примере QT: richtext/syntaxhighlighter
В XML виде формат такой:
HTML
<rule expr="\b(if|else|for|while|in|using|new|var|break|continue|return|Array|Object)\b" color="darkblue" font_weight="1"/>
<rule expr="(\?|\:)" color="darkblue" font_weight="1"/>
<rule expr="(\b0[xX][0-9a-fA-F]*\b|\b[+-]?[0-9]*\.?[0-9]+[eE]?[-+]?[0-9]*\b|\btrue\b|\bfalse\b)" color="blue"/>
<rule expr="&quot;[^&quot;]*&quot;" color="darkgreen"/>
<rule expr="//[^\n]*" color="gray" font_italic="1"/>
<blk beg="/\*" end="\*/" color="gray" font_italic="1"/>


Написано здесь: http://wiki.oscada.org/Doc/API?v=ika#h154-1

Учиться, учиться и учиться лучше чем работать, работать и работать.
Сообщение создано: 03. 11. 2010 [13:04]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
"roman" wrote:

В блоке строки "абвгд" нельзя поставить '\"','//','/*', хотя это допустимо языком
Нельзя отдельно подсвечивать символ '/' иначе ломается блок коментария /* ... */.

Решил все эти проблемы и добавил подсветку синтаксиса конфигурации параметров модулей DAQ.BlockCalk, DAQ.ModBus и DAQ.OPC_UA.

Осталось добавить второй уровень подсветки синтаксиса для блоков текста. Понадобится для XML и XHTML.

Учиться, учиться и учиться лучше чем работать, работать и работать.



1597