Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсач СПО (Емельянова).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
211.46 Кб
Скачать

2.2 Разбор текста и применение к нему стилей

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

Для хранения стилей используется структура Fl_Text_Display::Style_Table_Entry, определённая в файле Fl_Text_Display.H:

struct Style_Table_Entry

{

Fl_Color color;

Fl_Font font;

int size;

unsigned attr;

}

color задаёт цвет для текста, font задаёт индекс FLTK шрифта, size задаёт размер шрифта в пикселях. attr не используется.

Все семь стилей ассоциированы с латинскими буквами – A(обычный текст), B(строковый комментарий), C(блоковый комментарий), D(строки), E(директивы), F(типы), G(ключевые слова).

Каждый стиль в стилевом буфере описывается символом, начинающимся с 'A'.

Чтобы ассоциировать стилевую информацию и буфер с виджетом текстового редактора, нужно вызвать функцию highlight_data():

Fl_Text_Buffer * stylebuf;

w->editor->highlight_data(stylebuf, styletable,

sizeof(styletable)/sizeof(styletable[0])

‘A’, style_unfinished_cb, 0);

Затем мы добавляем callback к главному текстовому буферу, таким образом, изменения в текстовом буфере будут отбражаться в стилевом буфере:

textbuf->add_modify_callback(style_update, w->editor);

Функция style_update() вызывается когда текст добавлен или удалён из текстового буфера. Она отображает изменения в стилевом буфере и затем обновляет стилевую информацию.

Функция style_parse() сканирует копию текста в буфере и генерирует необходимые стилевые символы для отображения стиля. Разбор начинается с начала строки.

3. Тестовый пример

На рисунке 1 показано главное окно программы с загруженным текстом на языке С++.

Рисунок 1.

На рисунке 2 показано сообщение о ошибке при загрузке файла настроек.

Рисунок 2.

На рисунке 3 показано сообщение о ошибке при загрузке файла схемы.

Рисунок 3.

Заключение

В данном курсовом проекте был разработан текстовый редактор с подсветкой синтаксиса языков программирования с возможностью конфигурирования настроек подсветки синтаксиса и определением типов и ключевых слов языка. Данная программа является кроссплатформенной, т.к. она написана с применением кроссплатформенных библиотек FLTK 1.3.0 и LibXML2.

Список литературы

1. http://www.fltk.org

2. http://xmlsoft.com

Приложение 1.

<?xml version="1.0" encoding="UTF-8"?>

<language name="C++" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">

<style>

<entry name="Plain" color="FL_BLACK" font="FL_COURIER"/>

<entry name="Line Comments" color="FL_DARK_GREEN" font="FL_HELVETICA_ITALIC"/>

<entry name="Block Comments" color="FL_DARK_GREEN" font="FL_HELVETICA_ITALIC"/>

<entry name="Strings" color="FL_BLUE" font="FL_COURIER"/>

<entry name="Directives" color="FL_DARK_YELLOW" font="FL_TIMES_BOLD"/>

<entry name="Types" color="FL_DARK_RED" font="FL_COURIER_BOLD"/>

<entry name="Keywords" color="FL_BLUE" font="FL_COURIER_BOLD"/>

</style>

<keywords>

<keyword>and</keyword>

<keyword>and_eq</keyword>

<keyword>asm</keyword>

<keyword>bitand</keyword>

<keyword>bitor</keyword>

<keyword>break</keyword>

<keyword>case</keyword>

<keyword>catch</keyword>

<keyword>compl</keyword>

<keyword>continue</keyword>

<keyword>default</keyword>

<keyword>delete</keyword>

<keyword>do</keyword>

<keyword>else</keyword>

<keyword>false</keyword>

<keyword>for</keyword>

<keyword>goto</keyword>

<keyword>if</keyword>

<keyword>new</keyword>

<keyword>not</keyword>

<keyword>not_eq</keyword>

<keyword>operator</keyword>

<keyword>or</keyword>

<keyword>or_eq</keyword>

<keyword>return</keyword>

<keyword>switch</keyword>

<keyword>template</keyword>

<keyword>this</keyword>

<keyword>throw</keyword>

<keyword>true</keyword>

<keyword>try</keyword>

<keyword>while</keyword>

<keyword>xor</keyword>

<keyword>xor_eq</keyword>

</keywords>

<types>

<type>auto</type>

<type>bool</type>

<type>char</type>

<type>class</type>

<type>const</type>

<type>const_cast</type>

<type>double</type>

<type>dynamic_cast</type>

<type>enum</type>

<type>explicit</type>

<type>extern</type>

<type>float</type>

<type>friend</type>

<type>inline</type>

<type>int</type>

<type>long</type>

<type>mutable</type>

<type>namespace</type>

<type>private</type>

<type>protected</type>

<type>public</type>

<type>register</type>

<type>short</type>

<type>signed</type>

<type>sizeof</type>

<type>static</type>

<type>static_cast</type>

<type>struct</type>

<type>template</type>

<type>typedef</type>

<type>typename</type>

<type>union</type>

<type>unsigned</type>

<type>virtual</type>

<type>void</type>

<type>volatile</type>

</types>

</language>