Пишем программу (в Delphi) для создания книг FB2 - страница 2

стр.

>

>n:= pos('|', s); // находим разделитель

>/ / хотя это лишнее, n всегда = 4 / когда писал это еще не было ясно, утрясался формат…

>// в окончательном варианте n можно удалить

>delete(S, 1, n+1); // удаляем информацию о стиле

>// Записывается строка с новым стилем. Приводить SetStyle не буду, она очень простенькая

>Items[curIndex]:= SetStyle1(LStyle)+ S;

>if ItemIndex < Items.Count – 1

>then ItemIndex:= ItemIndex+1;

>SetFocus; // активным снова становится список с содержимым книги.

>end;

>end;

>// конец кода

(Одно предложение: можно, и не трудно, предоставить пользователю возможность возврата старого стиля)

Теперь о расстановке заголовков

Для этой работы предназначены три кнопки: [+] [H1] [-]. Вообще-то средняя кнопка будем менять свое название, и показывать этим текущий (в данном месте текста) стиль заголовка.

Посмотрим, как это делается:

При любом клике на ListBox вызывается процедура >ShowHeadStyle ее параметром является индекс выделенной строки.

>// начало кода

>procedure ShowHeadStyle(n: integer);

>var

>LStyle: TmyStyle;

>begin

>LStyle:= ScanUpStyle(n); // получаем тип заголовка к которому относится эта строка

>Form1.Button2.Caption:= SetStyle(LStyle); // меняем название кнопки

>Form1.Button2.Tag:= integer(LStyle); // запоминаем этот стиль, чтобы потом меньше возиться.

>end;

>// конец кода

Теперь посмотрим, как мы получаем информацию о стиле.

Элементарно, Ватсон!

>// начало кода

>function ScanUpStyle(n: integer):TmyStyle;

>var

>i: integer;

>LStyle: TmyStyle;

>begin

>with Form1.ListBox1 do

>for i:= n downto 0 do

>begin // просматриваем список от заданной строки вверх

>GetStyle(Items[i], LStyle); // получаем стиль строки

>if LStyle in [H1..H5] then

>begin // если стиль строки заголовочный

>result:= LStyle; // записываем его в результат

>exit; // и выходим, нечего больше время терять!

>end;

>end; // если дошли до начала списка, а заголовков не найдено…

>result:= H1; // присваиваем тип заголовка H1

>end;

>// конец кода

Устанавливаем стиль заголовка

Выбираем строку в тексте

И если указанный на кнопке стиль подходит, нажимаем ее.

При этом вызывается процедура >ChangeStyle(TmyStyle(Button2.Tag));

Параметром ее будет ранее сохраненные сведения о текущем стиле заголовка.

Процедура >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 можно получить соответствующее оформление выделенного текста (т. е. если текст не выделен ничего не произойдет).

Тут два замечания: отмена такого форматирования возможна только вручную удалением соответствующих тегов, второе, не допустимо форматирование такого вида:

какой либо текст . Можно конечно отслеживать такую ошибку и программным путем, но небольшое облегчение жизни пользователя, резко усложняет жизнь программиста.

Концевые сноски.

Книга может содержать концевые сноски. Я поленился и сделал пока так: необходимые сноски записываются в файл EndNotes.txt и этот файл должен находится в папке программы.

Внимание! Каждая сноска ― одна строка в файле.

В тексте книги в местах сносок надо расставить значки тильды ― ~

Ударения.

В первой же книге, которую я делал, в одном слове мне потребовалось сделать ударение и поэтому пришлось ввести значок «крышки» ^

Создание FB2

Наконец добрались.

Казалось бы, что проще, бери строку за строкой и вперед…

>// начало кода

>with Form1.ListBox1 do

>for i:= 0 to Count – 1 do // просматриваем текст абзац за абзацем

>begin

>S:= Items[i]; // считываем строку

>Ss:= GetStyle(S, CurStyle); // получаем чистую строку и стиль