Часть 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 version="1.0" encoding="windows-1251"? >

Здесь указана сигнатура принадлежности к формату XML, его версия и кодировка файла. Для русскоязычных FictionBook это обычно windows-1251 или utf-8. [2.2]

За ним в обязательном порядке следует:

Элемент FictionBook

Корневой элемент.

Cинтаксис : <FictionBook >content</FictionBook >.

Фактически, всегда используется в виде:

<FictionBook xmlns=" http://www.gribuser.ru/xml/fictionbook/2.0 " xmlns:l=" http://www.w3.org/1999/xlink " >

content

</FictionBook >.

Используется в элементах : корневой элемент

Вложенные элементы : stylesheet , description , body , binary

Количество вхождений : одно

Атрибуты : xmlns

Версия формата : 2.0

Пример : см. пример книги FictionBook, § 2.2

Элемент stylesheet

Список стилей, позволяющих конкретно определить, как будет выглядеть книга на экране устройства для чтения. До последнего времени читалками не поддерживался и практически не использовался. Лишь в конце 2007 года появился CoolReader 3.09 с экспериментальной поддержкой stylesheet.

Cинтаксис : <stylesheet >content</stylesheet >.

Используется в элементах : 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интаксис : <description >content</description >.

Используется в элементах : 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

Создание электронных книг в формате FictionBook 2.1: практическое руководство (beta 4) bas64tab.png

Выходной поток (закодированные байты) должен иметь длину строк не более 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.»

Перевод: Антон Воронин



Перейти на страницу:
Изменить размер шрифта: