Пишем программу (в Delphi) для создания книг FB2 [Юрий Карпов] (fb2) читать постранично, страница - 3
[Настройки текста] [Cбросить фильтры]
- 1
- 2
- 3
- 4
- 5
- . . .
- последняя (12) »
Внутри тэгов <poem>, <cite> и <epigraph> возможно указать автора соответственно стихотворения, цитаты или эпиграфа. Для этого служит тэг <text-author>. Этот тэг должен стоять в самом конце родительского тэга, то есть непосредственно перед его закрытием.// конец цитаты А теперь как это я сделал. // начало кода Auth: begin OutList.Add('<text-author>'+S+'</text-author>'); if oldStyle in [Poem, Epig, Citat] then CurStyle:= oldStyle; // т. е. корректно отработается закрытие родительских блоков end; // конец кода Т.к. естественно я сделаю эту брошюрку с помощью своей программки. Опробуем вышеизложенные методы форматирования на следующем оптимистичном стихотворении.
ДОПОТОПНАЯ КОСТЬ[1]
Аполлон Майков
1857
Структура
Теперь, после лирического отступления, самое интересное: структурирование книги. Книга может иметь разделение на части, главы, тома и книги, ну мало ли чего придумает автор… В FB2 структура задается тэгами <section> разной степени вложенности. Но в любом случае эта структура – дерево. В корне(в первой строчке), я предлагаю писать название книги, а дальше части, главы или что там есть. Программе для обработки структуры понадобится стек (напомню, стек – это список с правилом «последний пришел – первый вышел» ) Полученный код 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('</section>'); // стили равны, ничего особенного делать не надо 1: SytleStack.Add(TObject(CurStyle)); // новый стиль больше, добавляем его в стек // предыдущая секция не закончилась, т. к. новая будет в ее входить как матрешка else // иначе, считаем что разность меньше нуля begin OutList.Add('</section>'); while CurStyle <>LastStyle do begin SytleStack.Delete(SytleStack.Count-1); // уменьшаем стек OutList.Add('</section>'); // завершаем секции до тех пор пока LastStyle:= TmyStyle(SytleStack.Last); // текущий стиль и стиль в- 1
- 2
- 3
- 4
- 5
- . . .
- последняя (12) »
Последние комментарии
22 часов 19 минут назад
1 день 6 часов назад
1 день 21 часов назад
2 дней 54 минут назад
2 дней 1 час назад
2 дней 1 час назад