
- •Аннотация
- •1. Файл конфигурации 4
- •2. Разработка программы 7
- •3. Тестовый пример 13
- •Введение
- •Файл конфигурации
- •1.1 Формат файла конфигурации
- •1.2 Формат файла проверки
- •2. Разработка программы
- •2.1 Загрузка файла конфигурации
- •2.2 Разбор текста и применение к нему стилей
- •3. Тестовый пример
- •Заключение
- •Список литературы
- •Приложение 2.
- •Приложение 3.
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>