Шрифт:
Процедура ChangeStyle описана ранее.
Теперь кнопки [+] и [-]
Код процедур аналогичен, разница только в одной строчке
// начало кода
procedure TForm1.Button5Click(Sender: TObject);
var // кнопка плюс
LStyle: TmyStyle;
begin
LStyle:= TmyStyle(Button2.Tag); // получаем текущий стиль
if LStyle < H5 then ChangeStyle(Succ(LStyle)); // если он не слишком велик, прибавляем единицу
// а для кнопки минус, вот эта строчка. Вычитается единичка, если есть откуда вычитать
// if LStyle > H1 then ChangeStyle(Pred(LStyle));
end;
// конец кода
Редактирование строки
Двойной щелчок на строке и открывается окно редактирования
Текст можно исправить или строку разбить на несколько. После нажатия ОК все содержимое записывается в книгу с сохранением старого стиля.
Нажатием кнопок Bold и Italic можно получить соответствующее оформление выделенного текста
(т. е. если текст не выделен ничего не произойдет).
Тут два замечания: отмена такого форматирования возможна только вручную удалением соответствующих тегов, второе, не допустимо форматирование такого вида:
<strong> <emphasis> какой либо текст </strong></emphasis>. Можно конечно отслеживать такую ошибку и программным путем, но небольшое облегчение жизни пользователя, резко усложняет жизнь программиста.
Концевые сноски.
Книга может содержать концевые сноски. Я поленился и сделал пока так: необходимые сноски записываются в файл EndNotes.txt и этот файл должен находится в папке программы.
Внимание! Каждая сноска - одна строка в файле.
В тексте книги в местах сносок надо расставить значки тильды - ~
Ударения.
В первой же книге, которую я делал, в одном слове мне потребовалось сделать ударение и поэтому пришлось ввести значок «крышки» ^
Создание FB2
Наконец добрались.
Казалось бы, что проще, бери строку за строкой и вперед…
// начало кода
with Form1.ListBox1 do
for i:= 0 to Count - 1 do // просматриваем текст абзац за абзацем
begin
S:= Items[i]; // считываем строку
Ss:= GetStyle(S, CurStyle); // получаем чистую строку и стиль
s:= ''; // подготавливаемся к преобразованию строки
if ss <> '' then
for j:= 1 to length(Ss) do
begin // просматриваем строку посимвольно
case ss[j] of
'~': begin // если это концевая сноска
S:= S + '<a l: href="#" type="note">'
+IntToStr(EndNotes_count)+'</a>';
inc(EndNotes_count); // увеличиваем счетчик сносок
end;
'^': S:= S + ''; // ставим ударение
else S:= S + ss[j]; // иначе записываем символ в итоговую строку
end; // case
end;
…
// тут я пока немножко пропущу
…
// анализ стилей
case CurStyle of // в зависимости от стиля абзаца
Norm,Epig,Citat: OutList.Add(''+S+'');
H1..H5: StyleStucture; // Heading
Sub: OutList.Add('<subtitle>'+s+'</subtitle>'); // Subtitle
// конец кода
Давайте рассмотрим все по порядку:
Начнем со стихов. В стандарте FB2 используется три тега для работы со стихами, я использую только один стиль "P".
Для разделения стихов на строфы я предлагаю использовать пустые строки помеченные стилем "P".
// начало кода
if (CurStyle <> oldStyle) then // если предыдущий стиль отличен от текущего
begin // а нынешний стиль есть в данном списке, то значит надо начинать нужный блок.
case CurStyle of // начало блока
Poem: OutList.Add('<poem><stanza>');
Epig: OutList.Add('<epigraph>');
Citat: OutList.Add('<cite>');
end; // case начало блока
end;
// конец кода
А для обработки стиля используется следующие строки
// начало кода
case CurStyle of // в зависимости от стиля абзаца
Norm,Epig,Citat: OutList.Add(''+S+'');
Poem: begin
if S = ''
then OutList.Add('</stanza><stanza>')