- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Пишем программу для создания книг FB2 (СИ) - Карпов Юрий
Шрифт:
Интервал:
Закладка:
Ну хорошо мы заполнили и 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><p>Примечания</p></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><p>'+IntToStr(i+1)+'</p>');
OutList.Add('</title><p>'+S+'</p>');
OutList.Add('</section>');
end;
OutList.Add('</body>');
end;
// конец кода
Согласитесь, что здесь все просто, просматриваем список сносок и соблюдаем формат FB2. Но остается один маленький вопрос, а что если нам нужно будет вывести многострочную (точнее много абзачную) сноску. Да, возникает вопрос, приходят и варианты решения…
Ладно, кое-что в коде я пропустил. Но основные недостатки программы, я кажется описал. Правда, наверняка есть ляпы, которые я не заметил…
Наконец файл книги в формате FB2 создан.
На этом все? Ну нет, сейчас все авторы заканчивают книги словами "Продолжение следует". И я замыслил по крайней мере одно продолжение. Мне кажется оно просто необходимо.
Программа должна уметь не только создавать, но и читать файл FB2. Тогда можно растягивать удовольствие изготовления книги на несколько дней, и не потребуется каждый раз заново: читать текстовый файл, расставлять стили, форматировать строки и т. д. и все это с одной и той же книгой - ужас.
Но, как известно из математики, обратная задача всегда сложнее прямой. И т. к. я считаю, что на сегодня уже достаточно утомил Вас. Давайте рассказ о второй версии программы отложим.
Связаться со мной Вы сможете по адресу [email protected] (обратите внимание, 2 подчеркивания, т. к. [email protected] оказался уже занят). Предупреждаю сразу, я ленив, почту смотрю не каждый день, да и отвечать всем может и не смогу (я же не знаю сколько найдется желающих мне написать). Второе, эту почту я специально завел для этой программки, и если Вы, друзья мои завалите ее спамом или матом, я просто забуду туда дорогу.
Лицензионные условия таковы, пользуйтесь на здоровье, копируйте, переделывайте, если сможете заработать на этом деньги, буду только рад.
Карпов Юрий.
Кохтла-Ярве.
2010.
Итак.
Продолжение следует…
Приложение
Исходный код программы.
Выложил исходник на один сайт, но боюсь, что там ему и потерянному быть…
Поэтому, не буду ждать милости, справимся и сами.
Для начала, извлечем исходник из этого файла.
«Нет таких задач, которые не могли бы решить комму… (извиняюсь) программисты!»
Сделаем копию этого файла. Переименуем его как текст. В этом тексте найдем слово «Приложение». Удалим все до этого слова, да и немного далее, до начала исходного текста.
Теперь заменим все <p> и </p> на пустое место.
Еще заменим:
<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

