А для обработки стиля используется следующие строки
// начало кода
case CurStyle of // в зависимости от стиля абзаца
Norm,Epig,Citat: OutList.Add('
'+S+'
');Poem: begin
if S = ''
then OutList.Add('
else OutList.Add('
end;
// конец кода
В случае Нормальное стиля, Эпиграфа и Цитаты, просто добавляются абзацы, а для стихов еще отслеживается пустая строка…
Как видите блоки не завершены. Эту функцию выполняет следующий код.
// начало кода
if (CurStyle <> oldStyle) and (CurStyle <> Auth) then
begin
case oldStyle of // завершение предыдущего блока
Poem: OutList.Add('');
Epig: OutList.Add('');
Citat: OutList.Add('');
end; // case завершение предыдущего блока
end;
// конец кода
Но как Вы увидите в исходнике последний программный кусок находится выше предыдущего (и вообще все немного не так), но в данном тексте, мне пришлось расположить их так для последовательного, логичного объяснения, а в программе: сначала проверяется завершенность предыдущих блоков, затем при необходимости начинается другой, а затем обрабатываем текущий стиль.
В данном сочинении, я часто буду пользоваться таким приемом, отступлением от порядка следования текста в исходнике, что делать, человеческая логика и машинная не совсем совпадают.
Если Вы внимательно следите за процессом, то заметили " and (CurStyle <> Auth) " в предыдущем кусочке о начале блока, я это дело опустил, что бы не затуманивать описание.
Это достаточно забавный код призван выполнить требования формата:
// начало цитаты
Внутри тэгов
// конец цитаты
А теперь как это я сделал.
// начало кода
Auth: begin
OutList.Add('
if oldStyle in [Poem, Epig, Citat]
then CurStyle:= oldStyle;
// т. е. корректно отработается закрытие родительских блоков
end;
// конец кода
Т.к. естественно я сделаю эту брошюрку с помощью своей программки. Опробуем вышеизложенные методы форматирования на следующем оптимистичном стихотворении.
Я с содроганием смотрел
На эту кость иного века…
И нас такой же ждет удел:
Пройдет и время человека…
Умолкнет славы нашей шум;
Умрут о людях и преданья;
Всё, чем могуч и горд наш ум,
В иные не войдет созданья.
Оледенелою звездой
Или потухнувшим волканом
Помчится, как корабль пустой,
Земля небесным океаном.
И, странствуя между миров,
Воссядет дух мимолетящий
На остов наших городов,
Как на гранит
…
Так разум в тайнах бытия
Читает нам… Но сердце бьется,
Надежду робкую тая -
Авось он, гордый, ошибется!
Структура
Теперь, после лирического отступления, самое интересное: структурирование книги.
Книга может иметь разделение на части, главы, тома и книги, ну мало ли чего придумает автор…
В FB2 структура задается тэгами разной степени вложенности. Но в любом случае эта структура - дерево. В корне(в первой строчке), я предлагаю писать название книги, а дальше части, главы или что там есть.
Программе для обработки структуры понадобится стек (напомню, стек - это список с правилом "последний пришел - первый вышел")
Полученный код FB2, как эталоном, я проверяю программой "FictionBook Editor". Так вот, экзаменатору не нравится такая структура:
// начало примера
H1 | Кальман Миксат. ОСАДА БЕСТЕРЦЕ
S| (История одного чудака)
H2 | ВВЕДЕНИЕ
// конец примера
Т.е. между секциями не должно быть ничего лишнего…
А вот так будет все нормально:
// начало примера
H1 | Кальман Миксат. ОСАДА БЕСТЕРЦЕ
H1 | (История одного чудака)
H2 | ВВЕДЕНИЕ
// конец примера
Итак, когда при обработке списка ListBox1 встречается строка с типом от H1 до H5 вызывается процедура StyleStucture;
// начало кода
procedure StyleStucture;
begin
if CurStyle <> oldStyle then
begin // пока предположим, что предыдущий стиль был не заголовок
if SytleStack.Count = 0 then // если стек пуст
begin // записываем стиль в стек
SytleStack.Add(TObject(CurStyle))
end
else // если в стеке что-то есть
begin // значит надо проверить последний из заголовков
LastStyle:= TmyStyle(SytleStack.Last); // считываем последний стиль
case SubStyle(CurStyle, LastStyle) of // вычисляем разность текущий стиль минус последний
0: OutList.Add('
1: SytleStack.Add(TObject(CurStyle)); // новый стиль больше, добавляем его в стек
// предыдущая секция не закончилась, т. к. новая будет в ее входить как матрешка
else // иначе, считаем что разность меньше нуля
begin
OutList.Add('');
while CurStyle <>LastStyle do
begin
SytleStack.Delete(SytleStack.Count-1); // уменьшаем стек
OutList.Add(''); // завершаем секции до тех пор пока
LastStyle:= TmyStyle(SytleStack.Last); // текущий стиль и стиль в стеке не сравняются.
end;
end;
end;// case
end;
OutList.Add(''); // начинаем новую секцию
OutList.Add('
end;