Предыстория
С форматом FictionBook 2 отношения у меня изначально были сложные: сначала я его не признавал, потом допускал, как исходный материал для формирования своих книг, позже, с развитием формата и сопутствующих инструментов, он стал основой моей библиотеки.
Естественно, что одной из первых задач возникла проблема преобразования в этот формат. Из всех существующих средств ни одно меня не устроило, и для обычных художественных произведений мне было проще и быстрее сделать в своём привычном текстовом редакторе (jEdit или VIM).
Небольшими затруднениями для меня были: а) описание документа — это решалось с помощью использования шаблона; б) изображения — обычно это была обложка и её можно было добавить с помощью FB Editor'а (первого); в) сноски — они встречались не часто, понемногу, и, в принципе, зная формат, добавлялись без особых затруднений.
Некоторое время назад, появился конвертер из FB2 в PDF от KiR'а, помимо того, что это замечательный инструмент для получения pdf хорошего, почти издательского качества, это был пример использования формата DocBook, о котором я много слышал, но никак не мог начать и собрать все необходимые инструменты воедино.
DocBook, как и FictionBook — формат, основанный на технологии XML. И как для FictionBook'а его не очень удобно редактировать в своём природном формате, но, к счастью, существует такая утилита, как asciidoc, которая позволяет создать из текстового файла с довольно простой разметкой соответствующий документ в формате DocBook, html или других.
Создание fb2-backend'а
Как уже упоминалось, текущая ситуация вполне меня удовлетворяла: читаю я не очень часто, и процесс подготовки книги также приносит мне удовольствие. Но, когда мне захотелось преобразовать не художественную, а научно-популярную книгу с множеством иллюстраций и сносок, небольшие затруднения б) и в) оказались достаточно значительными. И в голову закралась мысль приспособить asciidoc к формированию книг в формате FictionBook.
В некотором роде это мне удалось. Полученный инструмент позволил оформить книгу «Почему мы не проваливаемся сквозь пол» Джеймса Гордона всего за день (не считая вычитки) с достаточно большим комфортом и лёгкостью.
Положительные качества (IMHO):
- Текстовый файл как исходник: лёгкость чтения, отсутствие лишней разметки, компактность, привычность;
- Удобное добавление сносок: текст сносок находится у места, которое он поясняет;
- Удобное добавление изображений: указывается имя файла, а добавление соответствующих секций в fb2-файл ложится на backend.
Отрицательные качества:
- Asciidoc предназначен для формирования DobBook, который более богат по набору тегов: это, в частности, приводит к тому, что иногда asciidoc обнаруживает форматирование, которого нет в FictionBook и создаёт неправильный fb2-файл. В таких ситуациях необходимо знать язык разметки asciidoc и способы её отключения;
- Нет прямой поддержки для стихов и прочей лирики: мне не удалось сделать такую настройку, думаю это возможно, но они не часто у меня встречаются, и можно обойтись прямой вставкой (см. прилагающийся пример);
- Изображения могут быть только форматов jpg и png: это произвольное ограничение и может быть легко расширено;
- Изображения должны быть в том же месте, что и исходный текст: так было проще;
- Необходимо лично следить, чтобы секции были либо с текстом, либо с другими секциями: этого ограничения у DobBook'а нет, а потому нет и автоматического контроля;
- Ссылки на части текста не реализованы: в этом месте DocBook и FictionBook похожи, так что если будет необходимость, это легко можно организовать, но пока не было необходимости;
- Исходный текст должен быть в кодировке utf-8;
- Имена изображений в тексте и на диске должны совпадать вплоть до регистра.
Приблизительная схема работы fb2-backend'а
Приложение было накидано «наспех», как вспомогательное, для достижения цели: набор одной книги — из этого вытекает вся негибкость, которая ему присуща.
Всё приложение собрано как набор простых скриптов, объединённых командным файлом txt2fb2.bat.
Итак, что происходит после вызова txt2fb2.bat SourceFile.txt:
- Вызывается asciidoc с backend'ом fb2. Его результатом является что-то, похожее по структуре на FictionBook 2, но требующее дальнейшей доработки: добавление изображений, вынос сносок в конец;
- Происходит подготовка изображений. Для всех изображений форматов jpg и png создаётся сопутствующий файл с расширением .b64 (это фактически элемент <binary>, который может быть помещён в результатирующий fb2-файл). Именно на этом этапе возникает произвольное ограничение на форматы графических файлов.
- Доводка FictionBook 2 осуществляется xslt-скриптом adjust_fb2.xsl. На этом этапе секции «Аннотация» и «История документа» попадают в нужные места заголовка. Сноски выделяются и выносятся в конец. Добавляются изображения из файлов, полученных на этапе 2.
Полученный fb2-файл необходимо проверить валидатором.
Дополнительное форматирование
Рекомендую просмотреть документацию на asciidoc, чтобы ознакомиться с допустимой разметкой, а также взглянуть на книгу, которую я прикладываю как образец.
Для удобства преобразования в формат fb2 введены некоторые расширения разметки asciidoc, их я и опишу здесь.
Заголовок документа
Многие параметры определяются с помощью атрибутов документа:
:genre: sf -- жанр<br>
:firstname: Имя автора книги<br>
:middlename: Отчество автора книги<br>
:lastname: Фамилия автора книги<br>
:nickname: Прозвище автора книги<br>
:date: 2009 -- дата издания книги<br>
:lang: ru -- язык книги<br>
:src-lang: en -- язык оригинала<br>
:coverpage-image: Cover.png -- изображение обложки<br>
:sequence-name: Malazan Book of the Fallen -- Имя серии<br>
:sequence-number: 6 -- номер в серии<br>
:translator-firstname: Иван -- имя переводчика<br>
:translator-middlename: Иванович -- отчество переводчика<br>
:translator-lastname: Толмович -- фамилия переводчика<br>
:document-firstname: Stas -- имя создателя документа<br>
:document-lastname: Bushuev -- фамилия создателя документа<br>
:document-nickname: Xitsa -- прозвище создателя документа<br>
:document-date: 2009-05-07 -- дата создания документа<br>
:document-id: Xitsa-7AD2-4B5F-92E5-892DEA3AE559 -- идентификатор документа<br>
:document-version: 1.01 -- версия документа<br>
:program-used: FB Tools, sed, VIM, Far, asciidoc+fb2 backend -- использованные при создании документы программы<br>
Аннотацией является любой текст, который находится между заголовком и первой секцией.
История документа описывается в специальной секции верхнего уровня:
Document History
----------------
Сноски
AsciiDoc поддерживает два типа сносок: footnote и footnoteref, для правильного формирования сносок с помощью fb2-backend'а требуется использование только footnoteref и только с номерами (так как он используется для формирования заголовка сноски, можно было сделать и наоборот, запретив footnoteref и организовав автоматическую нумерацию по footnote, но я предпочёл оставить возможность повторной ссылки).
Пример:
Основной текстfootnoteref:[3,"Текст сноски, обратите \"внимание\", что кавычки необходимо экранировать"]
Текст с повторной ссылкой на ту же сноскуfootnoteref:[3]
В asciidoc 8.4.5 зачем-то сделали так, чтобы макрос footnoteref перед которой не пробел, а значащий символ, не срабатывал, потому в примере, который я выложил, asciidoc.conf исправлен и не соответствует оригиналу.
Дополнительные макросы
Дополнительного автора можно добавить с помощью макроса author, не нужные атрибуты можно опускать. Например:
author::[Семёнов,Сергей,Анатольевич,Nickname]
author::[Семёнов,Серёжа]
В FictionBook есть тег subtitle, которому я не нашёл аналога в DocBook, потому реализовал с помощью макроса:
subtitle::[* * *]
Тег <empty-line/> при необходимости можно вставить с помощью следующего макроса, который должен представлять из себя отдельный параграф:
empty::[]
Цитаты и эпиграфы
И цитаты, и эпиграфы выделяются из текста с помощью подчёркиваний. Атрибуты либо вместе должны быть в кавычках, либо не должны содержать запятых.
Примеры:
["quote","Автор цитаты","произведение"]
____________________________________________________________
Цитата с полной атрибутикой
____________________________________________________________
____________________________________________________________
Простое цитирование без лишних изысков
____________________________________________________________
[epigraph,А. С. Пушкин, Я помню...]
____________________________________________________________
++++++++++++++++++++++++++++++++++++++++
<poem><stanza><br>
<v>Я помню чудное мгновенье,</v><br>
<v>Передо мной явилась ты...</v><br>
</stanza></poem><br>
++++++++++++++++++++++++++++++++++++++++
Это пример того, как можно вставить стихи в текст.
____________________________________________________________
Как попробовать
Я собрал отдельное приложение, которое не требует установки, его можно взять здесь
Сразу же можете попробовать выполнить txt2fb2.bat materials.txt — это демонстрационная книга, в которой использовано большинство fb2-расширений asciidoc.
В каталоге doc лежит документация на asciidoc, которую желательно бы прочитать.
Пользователи linux могут взять этот файл и доработать его напильником:
- Установить asciidoc 8.4.5 (и заменить asciidoc.conf на мой (или взять из trunk'а) );
- Установить привязку python к libxml, либо использовать xsltproc непосредственно;
- Переписать txt2fb2.bat в терминах используемого шелла.
Дальнейшее развитие
Проект находится на альфа-стадии и выкладывается в надежде, что кого-то ещё заинтересует или будет полезным. В таком случае можно будет подумать о том, чтобы его привести в приличный вид: с документацией, примерами и доработать.