Пишем программу для создания книг FB2 - [3]

Шрифт
Интервал

Epig: OutList.Add('');

Citat: OutList.Add('');


end; // case завершение предыдущего блока

end;

// конец кода


Но как Вы увидите в исходнике последний программный кусок находится выше предыдущего (и вообще все немного не так), но в данном тексте, мне пришлось расположить их так для последовательного, логичного объяснения, а в программе: сначала проверяется завершенность предыдущих блоков, затем при необходимости начинается другой, а затем обрабатываем текущий стиль.

В данном сочинении, я часто буду пользоваться таким приемом, отступлением от порядка следования текста в исходнике, что делать, человеческая логика и машинная не совсем совпадают.


Если Вы внимательно следите за процессом, то заметили " and (CurStyle <> Auth) " в предыдущем кусочке о начале блока, я это дело опустил, что бы не затуманивать описание.

Это достаточно забавный код призван выполнить требования формата:

// начало цитаты

Внутри тэгов , и возможно указать автора соответственно стихотворения, цитаты или эпиграфа. Для этого служит тэг . Этот тэг должен стоять в самом конце родительского тэга, то есть непосредственно перед его закрытием.

// конец цитаты


А теперь как это я сделал.

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

Auth: begin

OutList.Add(''+S+'');

if oldStyle in [Poem, Epig, Citat]

then CurStyle:= oldStyle;

// т. е. корректно отработается закрытие родительских блоков

end;

// конец кода


Т.к. естественно я сделаю эту брошюрку с помощью своей программки. Опробуем вышеизложенные методы форматирования на следующем оптимистичном стихотворении.

ДОПОТОПНАЯ КОСТЬ[1]
Аполлон Майков
Я с содроганием смотрел
На эту кость иного века…
И нас такой же ждет удел:
Пройдет и время человека…
Умолкнет славы нашей шум;
Умрут о людях и преданья;
Всё, чем могуч и горд наш ум,
В иные не войдет созданья.
Оледенелою звездой
Или потухнувшим волканом
Помчится, как корабль пустой,
Земля небесным океаном.
И, странствуя между миров,
Воссядет дух мимолетящий
На остов наших городов,
Как на гранит неговорящий
Так разум в тайнах бытия
Читает нам… Но сердце бьется,
Надежду робкую тая -
Авось он, гордый, ошибется!
1857

Структура

Теперь, после лирического отступления, самое интересное: структурирование книги.

Книга может иметь разделение на части, главы, тома и книги, ну мало ли чего придумает автор…

В 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('');</p><p>end;</p><p>OutList.Add('<p>'+s+'</p>'); // записываем заголовок секции</p><p>end; // StyleStucture;</p><p>// конец кода</p><br><p>Пожалуй, это самый тяжелый код в данном манускрипте, но он вроде работает, хотя я вижу в нем по крайней мере две неувязки, но что это, не скажу…</p><br><p>Ну вот с обработкой книги почти закончили, мелкие подробности увидите в исходнике.</p><br><p>Нажимаем пункт меню File - Save as FB2.</p><p>И - ничего не получается. Запланированная шутка. Вылезла надпись "Заполнить поля" и фокус перенаправлен на начальную закладку.</p><p>Напоминаю FB2 - это не только легкоусвояемый (легкоусваиваемый) текст, но и очень нужный и полезный заголовок книги.</p><p>Давайте посмотрим, все таки, что происходит при выборе пункта Save as FB2</p><p>// начало кода</p><p>procedure TForm1.SaveasFB21Click(Sender: TObject);</p></div></div> <div class="show-more show-more_reader text-center my-4"> <a class="btn btn-primary" href="/chi/pishem-programmu-dlya-sozdaniya-knig-fb2-karpov?p=4" > Продолжить чтение </a> </div> </section> <section> <div class="pagination-container"> <nav> <ul class="pagination"> <li class="page-item"> <a class="page-link" href="/k/pishem-programmu-dlya-sozdaniya-knig-fb2-karpov#tx">1</a> </li> <li class="page-item"> <a class="page-link" href="/chi/pishem-programmu-dlya-sozdaniya-knig-fb2-karpov?p=2#tx">2</a> </li> <li class="page-item active"> <span class="page-link">3</span> </li> <li class="page-item"> <a class="page-link" href="/chi/pishem-programmu-dlya-sozdaniya-knig-fb2-karpov?p=4#tx">4</a> </li> <li class="page-item"> <a class="page-link" href="/chi/pishem-programmu-dlya-sozdaniya-knig-fb2-karpov?p=5#tx">5</a> </li> <li class="page-item disabled"> <span class="page-link">…</span> </li> </ul> </nav> </div> </section> <hr class="w-100"> </div> <section> <div class="h2 text-break">Еще от автора Юрий Карпов </div> <div class="container"> <div class="row"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/izvlekaem-arhiv-iz-fb2-karpov" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/build/oblozhka.dc6e36b8.jpg" alt="Извлекаем архив из fb2" > </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/yuriy-karpov" > Юрий Карпов </a> </div> <div> <a href="/k/izvlekaem-arhiv-iz-fb2-karpov"><b>Извлекаем архив из fb2</b></a> </div> <div class="book-card__description"> <p>Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/angliyskiy-po-metodu-w-cat-karpov" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/83/837cace9f50ddf7adf5c27240ed0a4dcc46185e8.jpg" alt="Английский по методу w_cat" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/yuriy-karpov" > Юрий Карпов </a> </div> <div> <a href="/k/angliyskiy-po-metodu-w-cat-karpov"><b>Английский по методу w_cat</b></a> </div> <div class="book-card__description"> <p> В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность. </p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/rekursiya-karpov" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/build/oblozhka.dc6e36b8.jpg" alt="Рекурсия" > </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/yuriy-karpov" > Юрий Карпов </a> </div> <div> <a href="/k/rekursiya-karpov"><b>Рекурсия</b></a> </div> <div class="book-card__description"> <p>Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...</p> </div> </div> </div> <hr class="w-100"> </div> </div> </section> <section> <div class="h2 text-break">Рекомендуем почитать </div> <div class="container"> <div class="row"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/izuchaem-java-ee-7-gonsalves" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/e0/e0ee9b7e3e4f168a93df98d7e47d66089eac3652.jpg" alt="Изучаем Java EE 7" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/entoni-gonsalves" > Энтони Гонсалвес </a> </div> <div> <a href="/k/izuchaem-java-ee-7-gonsalves"><b>Изучаем Java EE 7</b></a> </div> <div class="book-card__description"> <p>Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/ischerpyvayushchee-rukovodstvo-po-napisaniyu-vsplyvayushchih-dzhek" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/build/oblozhka.dc6e36b8.jpg" alt="Исчерпывающее руководство по написанию всплывающих подсказок" > </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/rodzher-dzhek" > Роджер Джек </a> </div> <div> <a href="/k/ischerpyvayushchee-rukovodstvo-po-napisaniyu-vsplyvayushchih-dzhek"><b>Исчерпывающее руководство по написанию всплывающих подсказок</b></a> </div> <div class="book-card__description"> <p> В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность. </p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/mfc-i-opengl-avtor" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/build/oblozhka.dc6e36b8.jpg" alt="MFC и OpenGL" > </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/neizvestnyy-avtor" > Неизвестный Автор </a> </div> <div> <a href="/k/mfc-i-opengl-avtor"><b>MFC и OpenGL</b></a> </div> <div class="book-card__description"> <p> В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность. </p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/kak-funkcii-ne-yavlyayushchiesya-metodami-uluchshayut-meyers" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/build/oblozhka.dc6e36b8.jpg" alt="Как функции, не являющиеся методами, улучшают инкапсуляцию" > </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/skott-meyers" > Скотт Мейерс </a> </div> <div> <a href="/k/kak-funkcii-ne-yavlyayushchiesya-metodami-uluchshayut-meyers"><b>Как функции, не являющиеся методами, улучшают инкапсуляцию</b></a> </div> <div class="book-card__description"> <p>Когда приходится инкапсулировать, то иногда лучше меньше, чем большеЯ начну со следующего утверждения: Если вы пишете функцию, которая может быть выполнена или как метод класса, или быть внешней по отношению к классу, Вы должны предпочесть ее реализацию без использования метода. Такое решение увеличивает инкапсуляцию класса. Когда Вы думаете об использовании инкапсуляции, Вы должны думать том, чтобы не использовать методы.Удивлены? Читайте дальше.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/programmnoe-obespechenie-vstroennyh-sistem-obshchie-gost" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/build/oblozhka.dc6e36b8.jpg" alt="Программное обеспечение встроенных систем. Общие требования к разработке и документированию" > </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/gost" > ГОСТ </a> </div> <div> <a href="/k/programmnoe-obespechenie-vstroennyh-sistem-obshchie-gost"><b>Программное обеспечение встроенных систем. Общие требования к разработке и документированию</b></a> </div> <div class="book-card__description"> <p>Embedded system software. General requirements for development and documentationСтандарт подготовлен в развитие ГОСТ Р ИСО/МЭК 12207-99 «Информационная технология. Процессы жизненного цикла программных средств» с целью учета специфики разработки и документирования программного обеспечения встроенных систем реального времени.</p> </div> </div> </div> <hr class="w-100"> <div class="col-12 book-card d-flex flex-column flex-md-row "> <a class="card__img-link book-card__img-link text-center mr-3" href="/k/kak-pasti-kotov-nastavlenie-dlya-programmistov-reynvoter" > <img class="card__img book-card__img book-img img img-fluid lazyload" width="200" height="300" data-src="/storage/book-covers/42/427231b52fc0abfd4799a269c29ab7b4cd48bc00.jpg" alt="Как пасти котов. Наставление для программистов, руководящих другими программистами" > <div class="lazy__img-spinner" style="width: 200px; height: 300px;" ></div> </a> <div class="book-card__meta"> <div> <a class="text-dark book-card__author" href="/a/dzh-hank-reynvoter" > Дж Рейнвотер </a> </div> <div> <a href="/k/kak-pasti-kotov-nastavlenie-dlya-programmistov-reynvoter"><b>Как пасти котов. Наставление для программистов, руководящих другими программистами</b></a> </div> <div class="book-card__description"> <p>«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.</p> </div> </div> </div> <hr class="w-100"> </div> </div> </section> </main> </div> <script type="text/template" id="counter"> (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js", "ym"); ym(92475221, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true }); </script> <script> var commonTargetUrl = '3=p?voprak-2bf-gink-ayinadzos-ayld-ummargorp-mehsip/tatihc/ten.vkubrim//:sptth'; </script> <script src="/build/runtime.5332280c.js" defer></script><script src="/build/site.2f232b70.js" defer></script> </div> <div class="modal fade" id="cookieModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Добро пожаловать</h5> </div> <div class="modal-body"> Наш сайт использует куки для сбора анонимной статистики. </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Отказаться</button> <button type="button" class="btn btn-primary" data-dismiss="modal">Согласиться</button> </div> </div> </div> </div> </body> </html>