Часть II
Подробное описание формата FictionBook
§ 2.1 Структура файла FictionBook.
Базовые понятия
Книга FictionBook представляет собой XML-файл.
Структурно этот файл можно разделить на три части.
1) Desсription — заголовок (описание) книги;
2) Body — непосредственно текст книги. В книге может быть несколько body.
3) Binary — необязательная часть. Содержит бинарные файлы, в кодировке BASE64. [2.1] Как правило, это картинки.
§ 2.2 Пример книги в формате FictionBook
Cпецификация (schema) FictionBook находится на сайте Дмитрия Грибова, а также входит в комплект FB Tools. Поэтому размещать ее в электронной версии книги смысла нет.
Но пример книги в формате FictionBook привести необходимо:
<?xml version="1.0" encoding="windows-1251"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
<description>
<title-info>
<genre>reference</genre>
<author>
<first-name>Имя автора</first-name>
<last-name>Фамилия автора</last-name>
<nickname>Юзич</nickname>
</author>
<book-title>Пример книги в формате FictionBook 2.1</book-title>
<annotation>
<p>Это пример книги в формате FictiionBook</p>
</annotation>
<date value="2006-04-14">14 апреля 2006 г.</date>
<lang>ru</lang>
</title-info>
<document-info>
<author>
<nickname>Юзич</nickname>
</author>
<program-used>FB Tools</program-used>
<date value="2006-04-14">2006-04-14</date>
<id>1E693E16-8A80-4391-9800-C1A91A5E29A7</id>
<version>1.0</version>
<history>
<p>v 1.0 — создание книги (Юзич)</p>
</history>
</document-info>
</description>
<body>
<title>
<p>Юзич</p>
<p>ПРИМЕР КНИГИ В ФОРМАТЕ FictionBook 2.1</p>
</title>
<epigraph>
<p>Это эпиграф</p>
<text-author>Автор эпиграфа</text-author>
</epigraph>
<section>
<title>
<p>Первая секция</p>
</title>
<p>Секции обычно содержат текст.</p>
<empty-line/>
<p>Текст может разделяться пустыми строками.</p>
<subtitle>Подзаголовок</subtitle>
<p>Или подзаголовками.</p>
</section>
<section>
<title>
<p>Вторая секция</p>
</title>
<section>
<title>
<p>Первая вложенная секция</p>
</title>
<p>Текст может быть <strong>полужирным</strong> или <emphasis>курсивным</emphasis>.</p>
<p>Содержать <a l:href="#Sect3">линки</a> и <a l:href="#note01" type="note">[сноски]</a>.</p>
<p>В тексте могут быть картинки.</p>
<image l:href="#sampl.png"/>
<empty-line/>
</section>
<section>
<title>
<p>Вторая вложенная секция</p>
</title>
<cite>
<p>Это цитата.</p>
<text-author>Автор цитаты.</text-author>
</cite>
<p>Снова текст.</p>
</section>
</section>
<section id="Sect3">
<title>
<p>Третья секция</p>
</title>
<p>Стихи:</p>
<poem>
<title>
<p>Парус</p>
</title>
<stanza>
<v>А у дельфина взрезано брюхо винтом.</v>
<v>Выстрела в спину не ожидает никто.</v>
<v>На батарее нету снарядов уже.</v>
<v>Надо быстрее на вираже.</v>
</stanza>
<stanza>
<v>Но парус! Порвали парус!</v>
<v>Каюсь! Каюсь! Каюсь!</v>
</stanza>
<text-author>Владимир Высоцкий</text-author>
</poem>
<p>Снова обычный текст.</p>
</section>
</body>
<body name="notes">
<title>
<p>Примечания</p>
</title>
<section id="note01">
<title>
<p>1</p>
</title>
<p>Текст сноски.</p>
</section>
</body>
<binary id="sampl.png" content-type="image/png">iVBORw0KGgoAAAANSUhEUgAAAAkAAAAICAMAAAAcEyWHAAAABGdBTUEAAK/INwWK6QAAABl0
RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAGUExURQEBAf///+tZAq0AAAAY
SURBVHjaYmBAAEZGRjDGzsKvDgYAAgwABR4AH2mwMFgAAAAASUVORK5CYII=</binary>
</FictionBook>
§ 2.3 Элементы описания книги.
Базовые структурные элементы
В самом начале любого файла книги идет признак формата XML
Здесь указана сигнатура принадлежности к формату XML, его версия и кодировка файла. Для русскоязычных FictionBook это обычно windows-1251 или utf-8. [2.2]
За ним в обязательном порядке следует:
Элемент FictionBookКорневой элемент.
Cинтаксис : content.
Фактически, всегда используется в виде:
content
.
Используется в элементах : корневой элемент
Вложенные элементы : stylesheet , description , body , binary
Количество вхождений : одно
Атрибуты : xmlns
Версия формата : 2.0
Пример : см. пример книги FictionBook, § 2.2
Элемент stylesheetСписок стилей, позволяющих конкретно определить, как будет выглядеть книга на экране устройства для чтения. До последнего времени читалками не поддерживался и практически не использовался. Лишь в конце 2007 года появился CoolReader 3.09 с экспериментальной поддержкой stylesheet.
Cинтаксис : content.
Используется в элементах : FictionBook
Вложенные элементы : нет
Количество вхождений : одно или отсутствует.
Атрибуты : type
Версия формата : 2.0
Пример :
<stylesheet type="text/css">
.body{font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;}
.p{margin:0.5em 0 0 0.3em; padding:0.2em; text-align:justify;}
</stylesheet>
Элемент descriptionЗаголовок (описание) книги.
Cинтаксис : content.
Используется в элементах : FictionBook
Вложенные элементы : title-info , src-title-info , document-info , publish-info , custom-info , output
Количество вхождений : одно
Атрибуты : нет
Версия формата : 2.0
Пример :
<description>
<title-info>
<genre>nonfiction</genre>
<author>
<first-name>Имя автора</first-name>
<last-name>Фамилия автора</last-name>
</author>
<book-title>Название книги</book-title>
<date>2007 г.</date>
<lang>ru</lang>
</title-info>
<document-info>
<author>
<nickname>Юзич</nickname>
</author>
<program-used>FB Tools</program-used>
<date value="2006-07-10">2006-07-10</date>
<id>46C35002-014D-4AE4-8FE4-5E7881D72B0D</id>
<version>1.0</version>
</document-info>
</description>
2.1
Base64
Этот алгоритм был разработан для представления произвольных последовательностей байтов в форму, читаемую для человека. Кодирующий и декодирующий алгоритмы очень просты, но закодированные данные примерно на 33% больше, чем некодированные. Этот метод идентичен тому, который используется в приложениях PEM (Privacy Enhanced Mail), описанной в RFC 1421 с одним отличием: base64 не приемлет встроенного «чистого» текста.
Base64 использует 65-символьный поднабор из US-ASCII, выделяя 6 бит на каждый печатный символ. (65-й символ «=» используется для обозначения функции спец. обработки).
Этот поднабор имеет важное свойство: он идентичен всем версиям языковой кодировки ISO 646, включая US ASCII, а также всем версиям EBCDIC. Другие популярные механизмы кодирования (uuencode, base85 — часть уровня 2 PostScript) не разделяют этих свойств и поэтому не удовлетворяют требованиям переносимости для двоичных данных электронной почты.
Процесс кодирования преобразует 4 входных символа в виде 24-битной группы, обрабатывая их слева направо. Эти группы затем рассматриваются как 4 соединенные 6-битные группы, каждая из которых транслируется в одиночную цифру алфавита base64. При кодировании base64, входной поток байтов должен быть упорядочен старшими битами вперед.
Каждая 6-битная группа используется как индекс для массива 64-х печатных символов. Символ, на который указывает значение индекса, помещается в выходную строку. Эти символы выбраны так, чтобы быть универсально представимыми и исключают символы, имеющие специальное значение для SMTP-транспорта («.», CR, LF) и для синтаксиса вложенных тел MIME («-»).
Таблица: Алфавит Base64

Выходной поток (закодированные байты) должен иметь длину строк не более 76 символов. Все признаки перевода строки и другие символы, отсутствующие в таблице 1, должны быть проигнорированы декодером base64. Среди данных в Base64 символы, не перечисленные в табл. 1, переводы строки и т.п. должны говорить об ошибке передачи данных, и, соответственно, почтовая программа должна оповестить пользователя о ней.
Если в хвосте потока кодируемых данных осталось меньше, чем 24 бита, справа добавляются нулевые биты до образования целого числа 6-битных групп. А до конца 24-битной группы остается от 0 до 3-х недостающих 6-битных групп, вместо каждой из которых ставится символ-заполнитель «=». Поскольку весь входной поток представляет собой целое число 8-битных групп (т.е., просто байтных значений), то возможны лишь следующие случаи:
(1) входной поток как раз оканчивается 24-битной группой. В таком случае, выходной поток будет оканчиваться четырьмя символами Base64 без символа «=»;
(2) хвост входного потока имеет длину 8 бит. Тогда в конце выходного кода быдут два символа Base64, с добавлением двух символов «=»;
(3) хвост входного потока имеет длину 16 бит. Тогда в конце выходного будут стоять три символа Base64 и один символ «=».
Т.к. символ «=» является хвостовым заполнителем, его появление в теле письма может означать только то, что конец данных достигнут. Но такой гарантии нет, если число переданных битов кратно 24.
Любые бессмысленные последовательности в коде Base64 вроде «=====» должны быть игнорированы.
Основано на:
Спецификация RFC 1521 «MIME — Multipurpose Internet Mail Extensions. Part one.»
Перевод: Антон Воронин2.2
UTF-8 — это ASCII-совместимая многобайтная кодировка Unicode.
В отличие от стандартного Unicode, в utf-8 cимволы с кодами от 0x00000000 до 0x0000007f (стандартный набор US-ASCII) кодируются как байты с кодами от 0x00 до 0x7f (совместимость с кодовой таблицей ASCII). Это означает, что файлы и строки, содержащие только 7-битные ASCII-символы, будут иметь одинаковое представление как в ASCII, так и в UTF-8.