Пишем программу для создания книг FB2 | страница 6



В 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></div></div> <!-- Yandex.RTB R-A-5585048-7 --> <div id="yandex_rtb_R-A-5585048-7" class="rkl"><div class="rasporka"></div></div> <script> window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ "blockId": "R-A-5585048-7", "renderTo": "yandex_rtb_R-A-5585048-7" }) }) </script> </section> <section> <nav class="bottom-nav clr text-center ignore-select"> <ul class="pagination"> <li class=""> <a class="page-link" rel="prev" href="/r/62319?p_=5">« </a> </li> <li class=""> <a class="page-link" href="/r/62319?p_=5">5</a> </li> <li class="active"> <span class="page-link">6</span> </li> <li class=""> <a class="page-link" href="/r/62319?p_=7">7</a> </li> <li class=""> <a class="page-link" rel="next" href="/r/62319?p_=7"> »</a> </li> </ul> </nav> <div class="text-center"> <label for="reader-pagination-page mt-1"> Перейти на страницу </label> <select name="page" class="js-reader-pagination__page-select" data-target-path="/r/62319" > <option value="1" >1</option> <option value="2" >2</option> <option value="3" >3</option> <option value="4" >4</option> <option value="5" >5</option> <option value="6" selected>6</option> <option value="7" >7</option> <option value="8" >8</option> <option value="9" >9</option> <option value="10" >10</option> <option value="11" >11</option> <option value="12" >12</option> <option value="13" >13</option> <option value="14" >14</option> <option value="15" >15</option> <option value="16" >16</option> <option value="17" >17</option> <option value="18" >18</option> <option value="19" >19</option> <option value="20" >20</option> <option value="21" >21</option> <option value="22" >22</option> <option value="23" >23</option> <option value="24" >24</option> <option value="25" >25</option> <option value="26" >26</option> </select> </div> </section> </div> </main> </div> <div class="sect sect-popular sect-related ignore-select"> <div class="sect-header fx-row fx-middle"> <div class="sect-title fx-1"> <i class="fa fa-puzzle-piece"></i> Книги, похожие на Пишем программу для создания книг FB2 </div> </div> <div class="sect-content"> <div class="relbooks-block"> <div class="relbook-item"> <a class="top-in img-resp-vert" href="/b/83211" > <div class="top-desc fx-col fx-center anim"> <div class="top-title">Английский по методу w_cat - Юрий Карпов</div> <div class="top-subtitle">Иностранные языки</div> </div> <img class="book_image lazyload" title="Читать онлайн Пишем программу для создания книг FB2 - Юрий Карпов" data-src="/uploads/books/images/de/debe73c3ffa4195baf93df72cedffb37635ff6fb.jpg" alt="Пишем программу для создания книг FB2 - Юрий Карпов"> <i class="lazyload-spinner"></i> </a> </div> <div class="relbook-item"> <a class="top-in img-resp-vert" href="/b/64564" > <div class="top-desc fx-col fx-center anim"> <div class="top-title">Извлекаем архив из fb2 - Юрий Карпов</div> <div class="top-subtitle">Программирование</div> </div> <img class="book_image lazyload" title="Читать онлайн Пишем программу для создания книг FB2 - Юрий Карпов" data-src="/build/no_cover.f2a76ebc.jpg" alt="Пишем программу для создания книг FB2 - Юрий Карпов"> <i class="lazyload-spinner"></i> </a> </div> <div class="relbook-item"> <a class="top-in img-resp-vert" href="/b/39093" > <div class="top-desc fx-col fx-center anim"> <div class="top-title">FreeBSD - полезные советы - Сергей Супрунов</div> <div class="top-subtitle">Программирование</div> </div> <img class="book_image lazyload" title="Читать онлайн Пишем программу для создания книг FB2 - Юрий Карпов" data-src="/build/no_cover.f2a76ebc.jpg" alt="Пишем программу для создания книг FB2 - Юрий Карпов"> <i class="lazyload-spinner"></i> </a> </div> <div class="relbook-item"> <a class="top-in img-resp-vert" href="/b/51412" > <div class="top-desc fx-col fx-center anim"> <div class="top-title">Управление исходными текстами. Часть 1. Краткое руководство по CVS - Илья Петрович Рыженков</div> <div class="top-subtitle">Программирование</div> </div> <img class="book_image lazyload" title="Читать онлайн Пишем программу для создания книг FB2 - Юрий Карпов" data-src="/uploads/books/images/21/21540f0d3759171aab22cb9ee77d15cd864e512e.jpg" alt="Пишем программу для создания книг FB2 - Юрий Карпов"> <i class="lazyload-spinner"></i> </a> </div> <div class="relbook-item"> <a class="top-in img-resp-vert" href="/b/87808" > <div class="top-desc fx-col fx-center anim"> <div class="top-title">Программирование — вторая грамотность - Андрей Петрович Ершов</div> <div class="top-subtitle">Программирование</div> </div> <img class="book_image lazyload" title="Читать онлайн Пишем программу для создания книг FB2 - Юрий Карпов" data-src="/build/no_cover.f2a76ebc.jpg" alt="Пишем программу для создания книг FB2 - Юрий Карпов"> <i class="lazyload-spinner"></i> </a> </div> <div class="relbook-item"> <a class="top-in img-resp-vert" href="/b/90261" > <div class="top-desc fx-col fx-center anim"> <div class="top-title">HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов - Владимир Александрович Дронов</div> <div class="top-subtitle">Программирование</div> </div> <img class="book_image lazyload" title="Читать онлайн Пишем программу для создания книг FB2 - Юрий Карпов" data-src="/uploads/books/images/00/0031953e5ce50860c67707986ec95038aaaaee4a.jpg" alt="Пишем программу для создания книг FB2 - Юрий Карпов"> <i class="lazyload-spinner"></i> </a> </div> </div> </div> </div> </article> </div> </div> </div> </main> <aside class="sidebar"> <div class="side-box search-wrap"> <form id="quicksearch" method="get" action="/p"> <div class="search-box"> <input id="story" name="text" minlength="3" placeholder="Поиск по сайту..." type="text" autocomplete="off"> <button type="submit" class="search-btn"><span class="fa fa-search"></span></button> </div> </form> </div> <ul class="side-box side-nav to-mob"> <li><a href="/books">Книги</a> <ul class="subcat"> <li><a href="/c/55">Боевики</a></li> <li><a href="/c/21">Военное</a></li> <li><a href="/c/6">Детская литература</a></li> <li><a href="/c/74">Классика</a></li> <li><a href="/c/50">ЛитРПГ</a></li> <li><a href="/c/36">Любовная фантастика</a></li> <li><a href="/c/4">Любовные романы</a></li> <li><a href="/c/47">Попаданцы</a></li> <li><a href="/c/35">Постапокалипсис</a></li> <li><a href="/c/5">Приключения</a></li> <li><a href="/c/63">Триллеры</a></li> <li><a href="/c/1">Фантастика</a></li> <li><a href="/c/31">Фэнтези</a></li> </ul> </li> </ul> </aside> </div> <footer class="footer"> <div class="footer-in wrap-center"> <div class="footer-one fx-row"> <div class="footer-col footer-col-desc"> <div class="footer-col-title title"> 2025 Литфонд | Читать книги онлайн </div> </div> <div class="footer-col"> <div class="footer-col-title title">Контакты</div> <ul class="footer-col-content"> <li>Для связи и правообладателям: <a href="mailto:libs.pbn@gmail.com">libs.pbn@gmail.com</a> </li> </ul> </div> </div> </div> </footer> </div> </div> <script src="/build/runtime.68aa92de.js" defer></script><script src="/build/site.38e640f9.js" defer></script> <!-- Yandex.Metrika counter --> <script type="text/javascript" > (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(94963560, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/94963560" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> </body> </html>