Читать онлайн «Пишем программу для создания книг FB2 (СИ)». Страница 4

Автор Карпов Юрий

Ну хорошо мы заполнили и Title-info и Document-info и Publish-info.

Давайте-ка глянем, что там в коде записи файла FB2.

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

Procedure Make_fb2(S: string);

begin //

if Form1.ListBox1.Items.Count = 0 then exit;

SytleStack.Clear; // подготовка стека стилей

OutList.Clear; // подготовка выходного списка

SaveDescription;

SaveBodyFB2; // это мы уже в общем рассмотрели

SaveEndnotes;

OutList.Add('</FictionBook>'); // закрываем книгу

OutList.SaveToFile(S); // Запись в файл

showMessage('Done.'); // Сообщаем об удачном завершении

end;

// конец кода

Как видите мы еще не рассмотрели две процедуры.

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

procedure SaveDescription;

const

max = 5; // может я захочу изменить число строк в массиве, тогда я изменю только одну цифру

mas: array[1.. max] of string =

(// массив для заголовочной части FB2 файла

'<?xml version="1.0" encoding="windows-1251"?>', // как видите я делаю файл в кодировке Win

// я не вижу смысла в применении юникода, но если речь идет не о русском языке,

// то сделайте здесь изменение.

'<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0"',

' xmlns: l="http://www.w3.org/1999/xlink">',

' <description>',

' <title-info>'

);

var i: byte;

begin

// Выводим в выходной файл начало FB2 файла

for i:= 1 to max do

OutList.Add(Mas[i]);

// конец кода

Дальше просматриваем списки Жанров, Автором и Переводчиков и выводим оттуда информацию (если она там есть).

Т.е. проверяем все заполненные поля форм описывающих книгу и выводим информацию в соответствующие секции заголовка книги.

Будем считать, что с Description - покончили.

Осталось только

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

procedure SaveEndnotes;

var

S: string;

i: integer;

begin

if Form1.EndNotesList.Items.Count = 0 then exit;

OutList.Add('<body name="notes"><title>

Примечания

</title>');

for i:= 0 to Form1.EndNotesList.Items.Count - 1 do

begin

S:= Form1.EndNotesList.Items[i];

OutList.Add('<section id="n_'+IntToStr(i+1)+'"><title>

'+IntToStr(i+1)+'

');

OutList.Add('</title>

'+S+'

');

OutList.Add('</section>');

end;

OutList.Add('</body>');

end;

// конец кода

Согласитесь, что здесь все просто, просматриваем список сносок и соблюдаем формат FB2. Но остается один маленький вопрос, а что если нам нужно будет вывести многострочную (точнее много абзачную) сноску. Да, возникает вопрос, приходят и варианты решения…

Ладно, кое-что в коде я пропустил. Но основные недостатки программы, я кажется описал. Правда, наверняка есть ляпы, которые я не заметил…

Наконец файл книги в формате FB2 создан.

На этом все? Ну нет, сейчас все авторы заканчивают книги словами "Продолжение следует". И я замыслил по крайней мере одно продолжение. Мне кажется оно просто необходимо.

Программа должна уметь не только создавать, но и читать файл FB2. Тогда можно растягивать удовольствие изготовления книги на несколько дней, и не потребуется каждый раз заново: читать текстовый файл, расставлять стили, форматировать строки и т. д. и все это с одной и той же книгой - ужас.

Но, как известно из математики, обратная задача всегда сложнее прямой. И т. к. я считаю, что на сегодня уже достаточно утомил Вас. Давайте рассказ о второй версии программы отложим.

Связаться со мной Вы сможете по адресу [email protected] (обратите внимание, 2 подчеркивания, т. к. [email protected] оказался уже занят). Предупреждаю сразу, я ленив, почту смотрю не каждый день, да и отвечать всем может и не смогу (я же не знаю сколько найдется желающих мне написать). Второе, эту почту я специально завел для этой программки, и если Вы, друзья мои завалите ее спамом или матом, я просто забуду туда дорогу.

Лицензионные условия таковы, пользуйтесь на здоровье, копируйте, переделывайте, если сможете заработать на этом деньги, буду только рад.

Карпов Юрий.

Кохтла-Ярве.

2010.

Итак.

Продолжение следует…

Приложение

Исходный код программы.

Выложил исходник на один сайт, но боюсь, что там ему и потерянному быть…

Поэтому, не буду ждать милости, справимся и сами.

Для начала, извлечем исходник из этого файла.

«Нет таких задач, которые не могли бы решить комму… (извиняюсь) программисты!»

Сделаем копию этого файла. Переименуем его как текст. В этом тексте найдем слово «Приложение». Удалим все до этого слова, да и немного далее, до начала исходного текста.

Теперь заменим все

и

на пустое место.

Еще заменим:

<empty-line/> на пустое место.

& на &

< на <

> на >

«Цели определены, задачи поставлены, за работу товарищи…»

Программа состоит из 4 форм и 6 файлов pas, всего около 50 кбайт.

Далее, последует инструкция, как сделать программку.

Если Delphi 5 и выше то все просто.

Получившийся пирожок, нужно разрезать на отдельные файлы и назвать так как они подписаны

И запустить проект.

Иначе придется повозится.

В новой папочке создайте пустой проект Delphi.

На форме кликните правой кнопкой мыши и выберите View as Text

Скопируйте код формы из книги (не захватывая слова "начало кода" и "конец кода"). Вставьте его в открытое окно. Нажмите правую кнопку мыши и выберите View as Form. Если все сделано правильно Вы увидите форму.

Скопируйте код соответствующего unit. Замените им код в окне Code.

Хорошо, одна форма сделана.

Теперь создайте новую форму File - New - Form

И повторите предыдущие операции

Форм и соответствующих им Юнитов нужно сделать 4:

Unit1.dfm, genres.dfm, EditStr.dfm, authors.dfm

Unit1.pas, genres.pas, EditStr.pas, authors.pas

Файлы UmFB2.pas и dm.pas форм не имеют т.е. просто сделайте их из текстовых.

Итак, начали.

Unit1.dfm

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

object Form1: TForm1

Left = 187

Top = 98

Width = 722

Height = 463

Caption = 'Form1'

Color = clBtnFace

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'MS Sans Serif'

Font.Style = []

Menu = MainMenu1

OldCreateOrder = False

OnCreate = FormCreate

PixelsPerInch = 96

TextHeight = 13

object PageControl1: TPageControl

Left = 0

Top = 0

Width = 714

Height = 417

ActivePage = TabSheet2

Align = alClient

TabIndex = 3

TabOrder = 0

object TabSheet1: TTabSheet