Pull to refresh

FB2 Backend к AsciiDoc

Reading time7 min
Views1.5K

Предыстория



С форматом FictionBook 2 отношения у меня изначально были сложные: сначала я его не признавал, потом допускал, как исходный материал для формирования своих книг, позже, с развитием формата и сопутствующих инструментов, он стал основой моей библиотеки.

Естественно, что одной из первых задач возникла проблема преобразования в этот формат. Из всех существующих средств ни одно меня не устроило, и для обычных художественных произведений мне было проще и быстрее сделать в своём привычном текстовом редакторе (jEdit или VIM).

Небольшими затруднениями для меня были: а) описание документа — это решалось с помощью использования шаблона; б) изображения — обычно это была обложка и её можно было добавить с помощью FB Editor'а (первого); в) сноски — они встречались не часто, понемногу, и, в принципе, зная формат, добавлялись без особых затруднений.

Некоторое время назад, появился конвертер из FB2 в PDF от KiR'а, помимо того, что это замечательный инструмент для получения pdf хорошего, почти издательского качества, это был пример использования формата DocBook, о котором я много слышал, но никак не мог начать и собрать все необходимые инструменты воедино.

DocBook, как и FictionBook — формат, основанный на технологии XML. И как для FictionBook'а его не очень удобно редактировать в своём природном формате, но, к счастью, существует такая утилита, как asciidoc, которая позволяет создать из текстового файла с довольно простой разметкой соответствующий документ в формате DocBook, html или других.

Создание fb2-backend'а



Как уже упоминалось, текущая ситуация вполне меня удовлетворяла: читаю я не очень часто, и процесс подготовки книги также приносит мне удовольствие. Но, когда мне захотелось преобразовать не художественную, а научно-популярную книгу с множеством иллюстраций и сносок, небольшие затруднения б) и в) оказались достаточно значительными. И в голову закралась мысль приспособить asciidoc к формированию книг в формате FictionBook.



В некотором роде это мне удалось. Полученный инструмент позволил оформить книгу «Почему мы не проваливаемся сквозь пол» Джеймса Гордона всего за день (не считая вычитки) с достаточно большим комфортом и лёгкостью.

Положительные качества (IMHO):
  1. Текстовый файл как исходник: лёгкость чтения, отсутствие лишней разметки, компактность, привычность;
  2. Удобное добавление сносок: текст сносок находится у места, которое он поясняет;
  3. Удобное добавление изображений: указывается имя файла, а добавление соответствующих секций в fb2-файл ложится на backend.


Отрицательные качества:
  1. Asciidoc предназначен для формирования DobBook, который более богат по набору тегов: это, в частности, приводит к тому, что иногда asciidoc обнаруживает форматирование, которого нет в FictionBook и создаёт неправильный fb2-файл. В таких ситуациях необходимо знать язык разметки asciidoc и способы её отключения;
  2. Нет прямой поддержки для стихов и прочей лирики: мне не удалось сделать такую настройку, думаю это возможно, но они не часто у меня встречаются, и можно обойтись прямой вставкой (см. прилагающийся пример);
  3. Изображения могут быть только форматов jpg и png: это произвольное ограничение и может быть легко расширено;
  4. Изображения должны быть в том же месте, что и исходный текст: так было проще;
  5. Необходимо лично следить, чтобы секции были либо с текстом, либо с другими секциями: этого ограничения у DobBook'а нет, а потому нет и автоматического контроля;
  6. Ссылки на части текста не реализованы: в этом месте DocBook и FictionBook похожи, так что если будет необходимость, это легко можно организовать, но пока не было необходимости;
  7. Исходный текст должен быть в кодировке utf-8;
  8. Имена изображений в тексте и на диске должны совпадать вплоть до регистра.


Приблизительная схема работы fb2-backend'а



Приложение было накидано «наспех», как вспомогательное, для достижения цели: набор одной книги — из этого вытекает вся негибкость, которая ему присуща.

Всё приложение собрано как набор простых скриптов, объединённых командным файлом txt2fb2.bat.

Итак, что происходит после вызова txt2fb2.bat SourceFile.txt:
  1. Вызывается asciidoc с backend'ом fb2. Его результатом является что-то, похожее по структуре на FictionBook 2, но требующее дальнейшей доработки: добавление изображений, вынос сносок в конец;
  2. Происходит подготовка изображений. Для всех изображений форматов jpg и png создаётся сопутствующий файл с расширением .b64 (это фактически элемент <binary>, который может быть помещён в результатирующий fb2-файл). Именно на этом этапе возникает произвольное ограничение на форматы графических файлов.
  3. Доводка 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 могут взять этот файл и доработать его напильником:
  1. Установить asciidoc 8.4.5 (и заменить asciidoc.conf на мой (или взять из trunk'а) );
  2. Установить привязку python к libxml, либо использовать xsltproc непосредственно;
  3. Переписать txt2fb2.bat в терминах используемого шелла.


Дальнейшее развитие



Проект находится на альфа-стадии и выкладывается в надежде, что кого-то ещё заинтересует или будет полезным. В таком случае можно будет подумать о том, чтобы его привести в приличный вид: с документацией, примерами и доработать.
Tags:
Hubs:
Total votes 2: ↑2 and ↓0+2
Comments1

Articles