• § 3.1 Требования к исходному тексту
  • § 3.2 Any to FB2
  • § 3.3 ExportXML
  • § 3.4 doc2fb
  • § 3.5 Перенос через буфер обмена
  • § 3.6 Конвертор ExportToFB21 для Open Office
  • § 3.7 Написание собственного конвертора
  • Часть III

    Конвертирование книг из других форматов

    Cлучаи, когда книга готовится в формате FictionBook изначально, (как вот эта книга :) ) чрезвычайно редки. Обычно имеется готовый текст, который необходимо конвертировать в формат FictionBook.

    Вообще, создание книги в формате FictionBook можно разделить на три этапа.

    1) подготовка исходного текста;

    2) конвертация текста в формат FictionBook;

    3) вычитка, структурирование и окончательная доводка книги.

    Первый этап включает набор текста или сканирование исходного документа с распознаванием. Или же выдирание текста из PDF, или, какого-нибудь экзотического формата, например, ExeBook. Также сюда входит первичная вычитка текста.

    Второй этап — конвертация в формат FB2.

    Третий этап — доводка книги. По моему скромному мнению, самый тонкий и важный этап.

    Дело в том, существующие программные средства позволяют конвертировать документы txt, html, doc(rtf), что называется «одним кликом». Но, к сожалению, качественный FB2 таким образом создать совершенно невозможно. После конвертации такую книгу приходится загружать в редактор и доводить до ума вручную.

    Использование автоматической конвертации  без последующей доводки допустимо только в том случае, если текст конвертируется исключительно для того, чтобы закачать на КПК, прочесть и удалить.

    Но если книгу планируется выкладывать в Сеть, или распространять еще каким-то образом, то изготавливать ее «одним кликом» совершенно недопустимо. Не забывайте, что в этом случае, как бы еретически это ни звучало, вы фактически являетесь ИЗДАТЕЛЕМ книги. Проявите же уважение к автору и читателям.

    Распознавание и подготовка исходного текста — это тема для отдельной книги, поэтому здесь углубляться в нее не будем.

    Более того, на текущий момент нет острой необходимости заниматься сканированием. В Сети полным-полно уже распозннанных текстов, котоорые только и ждут, чтобы их перевели в FB2. В приложении А вы найдете ссылки на библиотеки, в которых такие тексты появляются практически ежедневно.

    ==ВАЖНО========================

    В последние годы значительную часть поступлений в популярные свободные онлайн-библиотеки составляют тексты, взятые с сетевых ресурсов, предназначенных для начинающих авторов.

    Дорогие создатели книг! Оставьте Самиздат, Прозу.Ру и прочие прибежища графоманов в покое! Не надо засорять сетевые библиотеки сырыми текстами, которые не делают чести авторам и не доставят удовольствия читателям.

    Давайте возьмем за правило оформлять в FB2 только те книги, которые дошли до официального издания, будь то бумажный или электронный вариант. Либо, в виде исключения, СВОИ СОБСТВЕННЫЕ творения.

    Не нужно умножать энтропию.

    ================================

    В общем, возьмем за основу, что исходный текст у вас уже есть.

    О редактировании и доводке книги будет подробно рассказано несколько ниже. Сейчас же речь пойдет именно о конвертировании текстов.

    § 3.1 Требования к исходному тексту

    Наиболее предпочтительными являются txt и RTF(DOC). Их, как будет сказано ниже, можно перенести в редактор книг, без каких-либо дополнительных программных средств.

    HTML в этом отношении гораздо хуже. Они, как правило, содержат кучу лишней информации, которую приходится отсекать. А еще HTML может быть разбит на кучу маленьких файлов.

    Если же книга представлена в PDF, вам придется потратить время, чтобы «выковырять» текст оттуда. Бывает, что это не так-то просто сделать, а бывает — вообще невозможно (например, если  в PDF собраны сканы страниц без распознавания, да еще и в низком разрешении).

    Ну и очень желательно, чтобы текст был максимально качественный.

    Автор этой книги сам убил массу времени при чистке книги В. Вагина «Заяц, стань тигром». И только потом обнаружилось, что в Internet имеются гораздо более качественные тексты книги…

    Поэтому, если вы берете текст из Сети, не поленитесь, поищите разные варианты и сравните их.

    Для преобразования текстов в FB2 существуют несколько программных пакетов. Рассмотрим их по порядку.

    § 3.2 Any to FB2

    Any to FB2 — «штатное» средство для конвертирования текстовых документов в формат FB2

    Для нормальной работы программе требуются MSXML 4.0 и Windows Script Host  версии 5.6.

    Если  MSXML можно скачать с сайта Micro$oft без каких-либо проблем, то при попытке загрузить Windows Script Host производится проверка на «подлинность», т.е. лицензионную чистоту вашей копии Windows.

    Поэтому проще обновить Internet Explorer до версии 6.0 SP1. Windows Script Host 5.6 входит в его состав.

    Посл установки щелкаем по иконке Any to FB2 GUI.

    Интерфейс программы представляет собой окошко с несколькими закладками.

    Самая первая строчка — путь ко входному файлу. По умолчанию там стоит «http://». Очевидно, программа может брать файлы на обработку прямо из Internet. Пусть вас это не смущает. Нажав кнопочку с многоточием, вы попадете в стандартное окно выбора файла.

    Чуть ниже расположено выпадающее меню «Setting». Здесь можно выбрать профиль настроек. Изначально их там всего три: «Last used» (последние использованные) «Default» (по умолчанию) и «Headers+»

    Внизу находятся кнопки:

    «Import» — запуск обработки файла. После того, как файл будет успешно преобразован, на месте кнопки «Import» появится кнопочка «Done». Щелкнув по ней, можно сохранить конечный файл.

    «Save settings…» — вызывает окошко управления профилями настроек («Manage export presets»). Можно сохранить текущие настройки. Вводим имя профиля в верхней строчке, например, «My priority» и жмем кнопочку «Save». Здеь же можно удалить ненужные профили, выделив их в списке и щелкнув по кнопочке «Delete…»

    «Cancel» — выход из программы.

    И кнопочка «?» позволяет узнать номер версии программы. Никакого файла помощи или руководства, к сожалению, не предусмотрено…

    Если установить галочку напротив расположенной в самом низу рабочего окна опции «Automatically close this window when finished», то сразу после обработки файла программа закроется.

    Теперь рассмотрим закладки.

    Первая закладка, «Document», содержит важнейшие настройки обработки файла.

    «Text structure» призвана помочь программе разобраться с разбиением текста на абзацы. Предусмотрены три положния радиокнопки.

    «Auto» — предоставляет программе решать этот вопрос самостоятельно.

    «Indented» — в начале каждого абзаца есть отступ.

    «EmptyLines» — после каждого абзаца идет пустая строка.

    ВНИМАНИЕ, БАГ!

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

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

    «Preserve <form>» — оставлять содержимое, обрамленное тэгом form. Меню, голосования и т.д. Включать не стоит.

    «Do not convert charset» — не менять кодовую таблицу файла.

    «No epigraphs» — не распознавать эпиграфы. Даже эту нехитрую операцию программа делает не всегда корректно, поэтому ставим галочку.

    «No </emptyline>» — не ставить пустых строк. Обычно эту опцию включать не требуется.

    «No description» — под «description» здесь понимается аннотация. Не делать аннотацию. Однозначно ставим галочку.

    «Allow 1000 error fixes» — разрешить программе попытаться восстановить битый документ. Пожалуй, галочку ставить не надо.

    «Do not convert "quotes" to «quotes»» — не конвертировать компьютерные кавычки в типографские. Эта операция нужная, и обычно программа отрабатывает ее без нареканий. Не ставим галочку.

    «Do not convert [text] and {text} into footnotes» — не конвертировать текст в квадратных и фигурных скобках в сноски. Ставить или не ставить галочку — дело вкуса. Я лично предпочитаю делать сноски вручную.

    «Do not convert _italic_ текст» — не конвертировать текст, обрамленный знаками подчеркивания в курсив. Ставим галочку. Не стоит разрешать программе делать это самой. Очень часто получается так называемый «рваный» курсив (<emphasis>С</emphasis> <emphasis>ло</emphasis> <emphasis>во</emphasis>) или, того хуже, курсивным становится только первое слово абзаца.

    «Do not restore broken paragraphs» — не восстанавливат разорванные абзацы. Ставим галочку.

    «Do not detect poems» — не выделять стихи. Ставим галочку однозначно. Программа определяет стихи исключитенльно по коротким строчкам и делает это крайне коряво.

    «Only use marked with <h#>|^T^U headers» — выделять как заголовки исключительно абзацы выделенные тэгами <h1>…<h6> и (или) esс-последовательностями ^T^U. Ставим галочку, если текст скачан из библиотеки Максима Мошкова (Lib.ru).

    «Ignore line indent (spaces at the line start)» — не считать пробелы в начале сроки признаком абзаца.

    «Convert leading '-' to long dash '—' (dialogs)» — конвертировать компьютерный «минус» в начале строки в длинное тире. Ставим галочку, особенно, если конвертируем DOS-текст.

    Вторая закладка — «Links», предназначена для настройки обработки html-файлов.

    Первый блок — «Images», относится к картинкам, если таковые во входном файле имеются.

    Опция «Remove ALL images from the document» убирает вообще все картинки.

    «Remove off-site images» — убирает только те картинки, которые располагаются не на сайте, с которого был загружен конкретный html.

    «Preserve dynamic images» — не удалять картинки с URL динамического вида, например, счетчики.

    Блок «Linked documents»

    «Remove external links» — просто убирает линки, ведущие за пределы документа.

    Включение опции «Follow links» делает активными все последующие опции.

    Теоретически, если исходный текст представлен в виде пачки html-файлов и имеется некий файл-оглавление со ссылками, можно включить эту опцию, открыть файл-оглавление, а остальные программа подстыкует автоматически. На практике это зачастую получается довольно коряво.

    «Follow off-site links» — следовать по линкам, ведущим за пределы сайта.

    Рядом находится уровень следования (level deep).

    «Only follow matching the expression» — следовать только линкам, совпадающим с нижеуказанным выражением.

    «Never follow matching the expression» — НЕ следовать линкам, совпадающим с нижеуказанным выражением.

    Третья закладка — «RegEXP» — обработка текста с помощью регулярных выражений.

    Подробнее о том, что такое регулярные выражения и как ими пользоваться, можно прочесть в приложении Д в конце книги.

    «Header detection regular expression» — регулярные выражения, с помощью которых программа может распознавать заголовки.

    «Regular expression to run on-load» — регулярные выражения, предназначенные для обработки исходного текста.

    Окошко разделено на два столбца. Первый (+new search pattern) предназначен для выражения поиска. Второй (+new replace pattern) — для выражений замены.

    Регулярных выражений может быть несколько.

    Вот  как можно обойти вышеописанный баг с неправильным распознаванием новых абзацев.

    в графе «+new search pattern» вводим:

    \r\n(\S)

    (перевод строки, новая строка, не-пробел).

    А в графу «+new replace pattern» вводим:

     $1

    Здесь не видно, но перед «$1» должен идти пробел.  То есть символы перевода строки и новой строки будут заменены на пробел. А само «$1» есть обращение к выражению в скобках в регэкспе поиска. Оно нужно, чтобы сохранить в неприкосновенности не-пробел, который идет сразу после символа новой строки.

    «Regular expression to run on result document» — регулярные выражения, предназначенные для обработки выходного документа.

    Устроено аналогично предыдущему.

    И, последняя, четвертая вкладка — «Log» — не имеет никаких опций. Там отображается ход операции преобразования.

    Программа умеет конвертировать файлы TXT, HTM, RTF, DOC. Для обработки последних она использует Micro$oft Word, для предварительного преобразования их в HTML.

    С разбиением на секции программа справляется плохо. Требуется последующая правка в редакторе.

    Резюме:

    Неплохое средство для конвертирования файлов TXT и HTML.

    Пользоваться программой имеет смысл, особенно, если книга конвертируется для того, чтобы «прочитать и удалить».

    Для пакетного конвертирования файлов написана надстройка (front-end) Batch2FB.

    § 3.3 ExportXML

    Программа представляет собой макрос M$ Word, предназначенный для преобразования в FB2 файлов DOC прямо из M$ Word.

    Макрос нормально запускается в M$ Word XP и 2003.

    Установка макроса заключается в копировании файла ExportXML.dot в папку автоматически запускаемых макросов Word. Обычно это папка C:\Program Files\Microsoft Office\Office10\Startup\. (Здесь и далее для M$ Office 2003 вместо «Office10» будет «Office11»).

    Затем нужно разрешить запуск макросов. Меню «Сервис\Параметры», закладка «Безопасность», кнопка «Защита от макросов». На закладке «Уровень безопасности» установите переключатель-радиокнопку в положение «Средняя. Решение о запуске потенциально опасных макросов принимается пользователем». Правда, теперь при каждом запуске Word будет выскакивать надоедливое сообщение, не нужно ли отключить макросы.

    Поэтому лучше поступить по-другому. Оставить высокий уровень безопасности и запускать нужные макросы без всяких запросов.

    Для этого макрос необходимо подписать.

    Вначале нужно создать сертификат. Запускаем программку selfcert.exe из директории MS Office (C:\Program Files\Microsoft Office\Office10\). В поле «Ваше имя» вводим какое-нибудь слово и жмем OK. Все, сертификат создан. Правда, он не подтвержден Micro$oft, но нам этого и не требуется.

    Теперь запускаем Word (макрос ExportXML.dot должен находиться в папке Startup). Запускаем редактор Visual Basic (Сервис\Макрос\Редактор Visual Basic). В окошке Project выбираем группу ExportXML.

    Затем вызывем команду Tools\Digital Signature. В окошке «Цифровая подпись» жмем кнопку «Выбрать», выбираем сертификат и жмем «OK».

    Закрываем редактор, выходим из Word. На запрос, надо ли сохранить изменения в документе ExportXML, отвечаем утвердительно.

    При следующем запуске Word сообщит, что файл ExportXML.dot содержит макросы, подписанные автором [имя вашего сертификата]. Ставим галочку напротив «Всегда доверять макросам из данного источника» и жмем ставшую активной кнопку «Не отключать макросы».

    Все! При последующих запусках Word будет прилежно запускать ExportXML, не докучая вам запросами.

    В меню «Файл» появилось подменю «FictionBook2» содержащее два пункта: «Export as Fictionboок2 xml…» и «Edit Fictionbook2 properties…»

    Последний пункт, как нетрудно догадаться, позволяет редактировать описание (description) будущего FB2-файла.

    Кнопочки «+» и «-» внизу позволяют соответственно добавлять копии полей или удалять оные. Чтобы отредактировать поле, выделите его и нажмите клавишу F2.

    Непосредственно экспорт производится предельно просто. Вводим путь и имя файла. Затем макрос предложит заполнить description. При этои можно выбрать кодировку файла (выпадающий список внизу «Export encoding»). По умолчанию текст экспортируется в utf-8.

    Макрос нормально обрабатывает полужирный шрифт, курсив, и даже Word-овские сноски. Пытается разбить книгу на секции, что чаще всего получается некоректно.

    Например, если название главы, состоит из двух строк, создаются лишние секции. Полученный файл в обязательном порядке требует правки в редакторе FB Editor.

    Внимание, картинки, если они есть, не экспортируются!

    Макрос позволяет «помочь» ему и выделить некоторые элементы непосредственно в Word.

    Для этого в нем есть стили, которые так и называются: Annotation, Cite, Cite Author, Epigraph, Epigraph Author, Poem Title, Stanza.

    Если они автоматически не появились в списке стилей после установки макроса, придется каждый раз добавлять их в документ вручную. Для этого файл ExportXML.dot должен быть скопирован в директорию C:\Documents and Settings\Имя текущего пользователя\Application Data\Microsoft\Шаблоны.

    Открыв нужный файл, выбираем команду меню Формат\Тема. В появившемся окошке жмем кнопку «Библиотека стилей». В списке стилей выбираем ExportXML и жмем «OK».

    Резюме: отвечающий своему назначению, но незаконченный продукт. Использовать рекомендуется лишь в отдельных случаях. Например, для преобразования документов, напичканных сносками.

    § 3.4 doc2fb

    Приложение doc2fb предназначено для преобразования в FB2 файлов RTF и M$ Word DOC.

    Чтобы утилита могла работать, на ПК должен быть установлен M$ Word 2003. Также должен наличествовать JavaScript версии не ниже 5 (входит в состав IE).

    Собственно утилита представляет собой XSL-скрипт и оболочку — HTA-приложение. [3.1]

    Интерфейс оболочки прост и понятен. Сразу бросается в глаза, что программка рассчитана на пакетное преобразование. То есть выбрать можно не конкретный файл, а только папку.

    Утилита умеет выделять главы и подглавы, жирный шрифт и курсив, сноски и ссылки, а также добавляет картинки.

    При этом векторные картинки Word, например, WMF, в итоговый файл не попадают. Растровые картинки, отличные от формата JPEG, преобразуются в PNG.

    Меню программки состоит из трех пунктов: «Файлы», «Настройки» и «Инфо»

    Пункт «Файлы» позволяет вызвать главную рабочую страницу оболочки (активна сразу после запуска). В строке «Папка» щелкаем кнопку с изображением «>>» и выбираем папку, которая содержит нужные DOC-файлы.

    После этого становится активной кнопка «преобразовывать».

    Нажимаем ее. Файлы тихо и быстро конвертируются в FB2.

    Ход операции отображается в области «Журнал», которая находится под кнопкой «преобразовывать».

    Настройки оболочки весьма немногочисленны.

    «Показывать MS Word при преобразовании», «Закрывать doc2fb после преобразования», «Удалять пустые строки» — назначение этих опций ясно без дополнительных комментариев.

    «Заменять Line-break на Paragraph-break» — заменяет коды принудительные разрывы строки на коды конца абзаца.

    Что есть такое принудительный разрыв строки? Обратимся к документации M$ Word.

    При вставке принудительного разрыва строки текущая строка обрывается, и текст продолжается на следующей строке. Предположим, например, что стиль абзаца включает в себя отступ перед первой строкой. Чтобы избежать появления отступа перед короткими строками текста (допустим, в написании адреса или в стихотворении), каждый раз, когда нужно начать новую строку, вместо того чтобы нажимать клавишу ENTER, вставляйте принудительный разрыв строки.

    Укажите место разрыва строки. Нажмите клавиши SHIFT+ENTER.

    «Определять сноски как <регулярное выражение>» и «Определять пояснения как... <регулярное выражение>» — перед конвертацией в FB2 M$ Word преобразует описанное регулярными выражениями в сноски и пояснения.

    «Сохранять изменения как версию документа» —  в процессе конвертации в документ вносятся изменения. Если опция включена, то эти изменения будут сохранены в документе как версия редактирования.

    Бич описанных выше программных средств — излишняя самостоятельность — проявил себя и тут. Стихи с отступами определяются как цитаты, для заголовков в две строчки делаются две секции и т.д.

    Как и в ExportXML, чтобы помочь программе найти элементы, документ можно дополнительно разметить. На страничке автора программы можно найти dot-файл с соответствующими стилями. Добавляются они в рабочий файл точно так же, как и стили ExportXML.

    Резюме. В целом программа отвечает своему назначению. Несмотря на некоторое своеволие, она позволяет быстро сконвертировать большое количество файлов.

    § 3.5 Перенос через буфер обмена

    Простой, но незаслуженно игнорируемый способ. Он, как нетрудно понять, заключается в выделении фрагмента текста, или же текста целиком, копировании его в буфер обмена Windows, и последующей вставке в FB Editor.

    Копирование через буфер обмена, как правило, сохраняет форматирование текста, в частности жирный и курсивный шрифт.

    Таким образом можно переносить тексты из MS Word, Интернет-браузера. Не обременяя машину дополнительными программными пакетами и dll-ками.

    Кроме того, при таком способе конвертирования наиболее удобно использовать заготовки-шаблоны, с частично заполненным description.

    Разумеется, затем текст надо полностью структурировать вручную. Но, по моему скромному мнению, гораздо удобнее структурировать файл «с нуля», чем исправлять огрехи программы конвертирования.

    Недостаток у переноса через буфер, кроме повышенных временных затрат на структурирование, в общем-то один — некорректная обработка форматирования исходного документа. Чаще всего пропадают пустые строки. Сдвоенные пустые строки превращаются в одинарные в девяти случаях из десяти. Еще при этом в выходной документ могут попасть нежелательные элементы, например, картинки, (редакторы FB2 не поддерживают вставку картинок из буфера, там работа с ними организована совершенно по-другому) которые потом приходится вычищать.

    Резюме. Весьма достойный, хотя и не лишенный недостатков способ конвертации документов.

    § 3.6 Конвертор ExportToFB21 для Open Office

    Пакет Open Office создавался как бесплатная альтернатива M$ Office. В последние годы разработчикам удалось довести его до ума, и Open Office (далее OO) начал потихоньку набирать популярность и отвоевывать пользователей у разработки Micro$oft.

    Поэтому нет ничего удивительного, что и для него появился конвертор в FB2. Тем более, что формат документов OO, как и в последней версии M$ Office представляет собой пачку XML-документов.

    Программка представляет из себя пакет макросов для  OpenOffice Writer. Естественно, она платформeнно-независима, т.е. работает на всех ОС, которые поддерживет OO.

    Программа прекрасно документирована, на сайте разработчика есть иллюстрированные руководства в формате OO Writer, а также PDF. Поэтому, во избежание плагиата, ограничимся общими советами и замечаниями.

    Данное описание справедливо для версии 2.2.

    На сайте разработчика ExportToFB21 существует в двух ипостасях: ExportToFB21_version2.2.zip и ExportToFB21_version2.2.oxt.zip. Отличаются они тем, что во втором случае пакет макросов упакован в специальный формат OO — .oxt, и его придется перед установкой доставать из архива.

    Итак, архив с конвертором загружен. Запускаем OO Writer и вызываем команду «Сервис\Управление расширениями». Щелкаем кнопку «Добавить» и открываем zip-архив или пакет .oxt.

     Теперь нужно создать кнопку для запуска макроса. Вызываем команду меню «Сервис\Настройка» и активируем закладку «Панели инструментов». В выпадающем меню «Панель инструментов» выбираем панель, на которую будет помещена кнопка. Руководство рекомендует создать новую, но, на мой взгляд, это излишество.

    Жмем кнопку «Добавить». В открывшемся окне в дереве «Категория» в самом низу находим группу «Макрос OpenOffice.org» и разворачивем ветку «Мои макросы» (или «Макросы OpenOffice.org», если при установке в окне «Управление расширениями» был активен пункт «Расширения OpenOffice.org»). Находим ветку ExportToFictionBook и раскрываем ее.

    Теперь щелкаем по группе «ExportToFB21» и в окне справа выбираем команду «ExportToFB21». Жмем кнопку «Добавить». Все!

    Как и макросы для M$ Office ExportToFB21 позволяет предварительно разметить документ при помощи стилей. Для этого на сайте имееется специальный файл стилей — fb21_styles.ott_2.0.zip. Как установить его в OO Writer подробно описано в руководстве.

    После вызова макрос может предложить вначале сохранить документ.

    Затем появится окно заполнения заголовка. Пусть вас не смущает обилие полей — обязательны к заполнению лишь некоторые из них. Также, обратите внимание, что хотя графы и можно дублировать (кнопки «Добавить» и «+»), вернуться к ним уже не получиться.

    Выходной файл по умолчанию формируется в той же папке, что и исходный.

    Чрезвычайно порадовало то, что, в отличие от продуктов, описанных выше, ExportToFB21 абсолютно не проявляет своеволия и не пытается самостоятельно структурировать документ (если он, конечно, предварительно не размечен стилями, конечно). Структурирование все-таки лучше делать в редакторе.

    Поэтому, если даже, потом, в процессе совершенствования у программки и появятся такие интеллектуальные наклонности, хорошо бы предусмотреть опцию их отключения.

    То, что получается на выходе достойно всяческих похвал. Файл прекрасно подходит как для чтения в FB2-читалке, так и для доводки в FB Editor. Это  и неудивительно. Корректный экспорт самой разной структуры документа заявлен, как «самая главная фишка конвертора».

    Как следует из названия, программа поддерживает инновации формата FictionBook 2.1. Это <sub>, <sup>, <code> и таблицы. Картинки, правда, конвертор пока экспортировать не умеет, но аккуратно вставляет в соответствующие места тэги.

    Более подробно все возможности, «фичи» и особенности конвертора описаны в офицальном руководстве к нему (п. 1.3.2–1.3.3).

    Вообще, ExportToFB21 производит впечатление добротного и хорошо проработанного продукта. Остается только надеяться, что, по мере совершенствования, он не растеряет эти качества.

    Означенное совершенствование продолжается. За 2008 год проект претерпел серьезные изменения, трансформировшись в пакет OOoFBTools, который может не только создавать, но и корректировать FB2.

    Peзюме. Хорошая вещь. 100% must have для тех, у кого на машине установлен OO Writer.

    § 3.7 Написание собственного конвертора

    Все перечисленные выше способы хороши лишь для так называемых среднестатических входных файлов. Когда попадается нечто нестандартное, остается только, сцепив зубы, долго и нудно склеивать файлы, вылавливать куски текста, редактировать погрешности, и т.д. и т.п.

    Решить эти проблемы может собственноручное написание конвертора. Помимо возможности тонкой настройки софта под конкретную задачу, этот метод имеет еще одну положительную сторону: претензии по поводу кривизны решений предъявлять просто некому. Кроме как самому себе…

    Для написания конвертора наиболее подходящи скриптовые языки программирования, заточенные для работы с текстом и поддерживающие регулярные выражения. TCL, Java, Perl, Python… Лично я остановил свой выбор на самом молодом и многобещающем из них. Имеется в виду язык программирования Ruby.

    Ruby был создан в середине 90-х японским программистом Юкихиро Мацумото. Это многогранный, элегантный и в то же время очень простой для изучения язык. Он вобрал все лучшее, что было у его предшественников: мощь регулярных выражений Perl, объектно-ориентированное программирование Java и Python, помноженные на феноменальные изящество и функциональность.

    Установка Ruby

    Скачать транслятор Ruby можно с официального сайта проекта www.ruby-lang.org.

    Вариант Ruby для Win32 представлен в двух вариантах. Обычный инсталлятор (rubyxxx-xx.exe)и zip-архив — ruby-xxx-pxxx-i386-mswin32.zip, где xxx — номера версий и обновления. На момент написания этого текста была доступна стабильная версия 1.8.6.

    Для наших целей вполне подойдет второй вариант — zip-архив.

    Только нужно будет папку, где находится запускной файл интерпретатора добавить в список папок, доступных по умолчанию. Для этого щелкаем правой кнопкой мыши по иконке «My computer», на панели «Advanced» жмем кнопку «Environment Variables». В списке «System variables» находим переменную Path и щелкаем по кнопке «Edit». В открывшемся окошке в поле «Variable Value» через «;» без пробела добавляем путь к нужной папке. Например C:\TOOLS\RUBY\bin.

    В принципе, для работы скрипта жизненно необходимы лишь два файла: exe-шник транслятора (ruby.exe) и служебная dll-ка (msvcrt-ruby18.dll). Поэтому, если не требуется использование библиотек, то можно просто забросить эти два файла в папку Windows, или любую другую, доступную по переменной Path. В крайнем случае, можно просто поместить их в ту же папку, где находятся скрипты.

    Разумеется, описывать программирование на языке Ruby прямо здесь нет ни необходимости, ни возможности. Это тема для отдельной книги, которуя, с Божьей помощью, я, возможно, напишу. А здесь ограничимся комментариями в самих скриптах.

    Если же вы не знаете, где взять документацию по Ruby, то вам прямая дорога на сайт www.flazx.com, где, среди множества другой ценной литературы, можно найти и исчерпывающую подборку книг по Ruby. Правда, англоязычных, но зато много и бесплатно. Из русскоязычных изданий могу посоветовать книгу М. Фицджеральда «Изучаем Ruby» (на момент написания книги была доступна только на бумаге), а также труд  П. Фултона «Программирование на языке Ruby» (доступен в Сети).

    Пример первый. Конвертирование форматированного dos-текста

    Данный скрипт размещается исключительно как классический пример. Так сказать для затравки.

    Скрипт выполняет простейшее преобразование текста, вмешательство в структуру будущей fb2-книги сведено практически к нулю. Но его ничего не стоит доработать. Например, чтобы он выделял главы, подзаголовки, при этом структурируя будущий файл. Вообще, средствами Ruby можно организовать такую интеллектуальную обработку текста, которая оставит Any2FB2 далеко позади.

    # Скрипт для конвертации форматированного текста DOS-866 в FB2

    # (C) Юзич, апрель 2008 г.

    #

    # запускать из директории, где находится входной файл

    # запуск: ruby dtxt_fb2.rb <input.txt>

    #

    # массив для перекодировки текста. Псевдографика заменяется на код 135,

    # символы, отсутствующие  в кодировке win-1251 - на код 138

    doswin = [192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,

        208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,

        224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,

        135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,

        135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,

        135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135,

        240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255,

        168, 184, 170, 186, 175, 191, 161, 162, 176, 149, 183, 138, 185, 164, 138, 138]

    # считываем входной файл в одну строку

    wtext=ARGF.readlines.to_s

    ARGF.close

    wtext.gsub!(/\n(\S)/,' \1') # склеиваем строки абзацев

    wtext.squeeze!(" ")         # убираем лишние пробелы

    wtext.gsub!(/^ /,"")        # убираем пробелы в начале строки

    # перекодировка текста

    for i in 0..(wtext.length-1)

      case wtext[i]

        when 20: wtext[i] = 182 # обработать символ "Пи"

        when 21: wtext[i] = 167 # обработать символ "параграф"

        when 128..255: wtext[i] = doswin[wtext[i]-128] # обработать все остальное

      end

    end

    wtext.gsub!("...", (133).chr) # многоточие - в символ "многоточие"

    wtext.gsub!(/(\s)-\s/,'\1'+(151).chr+" ") # компьютерное тире - в типографское

    # порубим строку в массив

    wtext = wtext.split(/\n/)

    wtext.collect! do |line|

      if line =="" then

        line = "<empty-line/>" # пустая строка?

      else

        line="<p>"+line+"</p>" # нет, не пустая

      end

    end

    # добавляем заголовок

    wtext.insert(0,"<?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>nonfiction</genre>

    <lang>ru</lang>

    </title-info>

    <document-info>

    <program-used>Yuzich Ruby script (dostxt -> FB2)</program-used>

    </document-info>

    </description>

    <body>

    <section>")

    # добавляем хвост

    wtext << "</section>\n</body>\n</FictionBook>\n"

    # сохраняем выходной файл

    wfile = File.new(ARGF.filename.dup.gsub!(/\.txt/i,".fb2"),"w")

    wfile.puts wtext

    wfile.close

    После того, как скрипт отработает, в директории появится файл <имя_исходного_файла>.fb2. Небольшая правка в FB Editor и он будет полностью готов к распространению.

    Пример второй. Конвертирование журналов c WiseSoft.ru

    Эта задачка гораздо интереснее первой. Как раз тот случай, когда написание специализированного конвертора полностью оправдано.

    На ресурсе http://www.wisesoft.ru находится множество различных журналов. Форматы в котором они представлены, различаются, Но один из них особо привлекателен для преобразования в FB2. Я говорю о журналах которые представлены в виде пачки html-файлов («Хакер», «Хакер-спец», «Мобильные компьютеры», «Хулиган» и др.). При всей простоте, конвертированию стандартными средствами этот способ хранения данных поддается с трудом.

    Более близкое знакомство выявило следующее. Имеется  файл index.htm с оглавлением. Статьи представляют собой кучки html-файлов, разбитые по папкам. Текст представляет собой обычные абзацы, обрамленные тэгами «<p>». Оформление html-ок везде стандартное.

    К сожалению, такая лафа наблюдается не везде. С декабря 2006 года формат журналов начал эволюционировать. Статьи стали вмещаться в одну html-ку, появились списки, картинки, дополнительные стили. Хотя и не во всех журналах. Основная масса изданий представлена именно в таком виде, как описано выше. Поэтому сосредочимся именно на них.

    Наша задача заключается в том, чтобы вырезать куски текста из html-файлов, склеить их в один файл.

    Скрипт, представленный ниже, не только блестяще справляется с этим, но и выдает на выходе вполне приличный FB2, с заполненным заголовком, готовой аннотацией и разбитый на секции.

    # Скрипт для конвертации журналов с WiseSoft.ru в FB2

    # (C) Юзич, апрель-май 2008 г.

    #

    # поддерживаемый формат файлов: пачка html, журналы сделанные c ноября 2003 г. по ноябрь 2006 г. включительно.

    # примечание: изменения в декабре 2006 и марте 2007 - некритичные

    # теоретически должен обрабатывать журналы сделанные по июль 2007 включительно

    # но уже с мая 2007 в тексте могут попадаться дополнительные тэги, мешающие правильной конвертации

    # хотя все это касается, в основном, журнала "Хакер" ("Хакер-спец").

    # "Мобильные компьютеры", к примеру, по-прежнему, как шли, так и идут в старом формате

    # да и чтобы обрабатывать журналы, сделанные до ноября 2003, достаточно подправить ключевые фразы

    #

    # запускать из директории, где находится файл-оглавление журнала (index.htm)

    # запуск: ruby ws_j_cnv.rb

    #

    # считываем файл-оглавление в строку

    wfile=File.open("index.htm")

    ltext=wfile.readlines.to_s

    wfile.close

    # выгрызаем заголовок

    fbtitle=/<SPAN CLASS="titleSet">(.+)<font color="#FF0000">(#\d{1,3})<\/font>(.+)<\/SPAN>/.match(ltext).captures

    # выгрызаем ссылки на статьи и разделители

    filtr=/<SPAN CLASS="minSet">(.+)<\/SPAN>|<a href="(\d{3}\/\d.htm)">(.+)<\/a>/

    lmas = ltext.grep(filtr)

    # начинаем формировать выходной текст

    outtext="<title><p>"+fbtitle[0]+fbtitle[1]+fbtitle[2]+"</p></title>\n"

    # начинаем формировать аннотацию

    annotation="<p>Содержание номера:</p>\n"

    # флажок открытой секции раздела

    flagSect=false

    # прокручиваем список ссылок

    lmas.each do |line|

      if line.include? "SPAN" then     # ССЫЛКА ИЛИ РАЗДЕЛИТЕЛЬ?

        if flagSect then outtext=outtext+"</section>\n" end # РАЗДЕЛИТЕЛЬ. Секцию закрывать надо?

        /<SPAN CLASS="minSet">(.+)<\/SPAN>/.match(line) # выгрызаем разделитель...

        outtext=outtext+"<section>\n<title><p>"+$1+"</p></title>\n" # открываем секцию раздела

        annotation=annotation+"<p>"+$1+":</p>\n" # и дополняем аннотацию

        flagSect=true # секция осталась открыта...

      else # НЕ-ЕТ, ВСЕ-ТАКИ ССЫЛКА...

        filtr.match(line)

        pathf = $2 # берем путь к первому файлу статьи...

        annotation=annotation+"<p>"+(149).chr+" "+$3+"</p>\n" # дополняем аннотацию...

        puts pathf[0..2] # это чтобы не скучно было ждать...

        outtext=outtext+"<section>\n" # открыли секцию...

        while File::exists?(pathf) do # обрабатываем статью

          # считали файлик в текстовую строку...

          wfile=File.open(pathf)

          wtext=wfile.readlines.to_s

          wfile.close

          wtext[/<html>.+?<\/p>/m]="" # чик! головка...

          wtext[/<center>.+<\/html>/m]="" # чик! хвостик...

          # заголовок статьи оставлять?

          wtext = pathf[4,2].to_i == 1 ? wtext.sub(/.*\n(.*\n.*\n).*\n.*\n/,' \1') : wtext.sub(/.*\n.*\n.*\n.*\n.*\n/,' \1')

          outtext=outtext+wtext  # оставшийся текст - к основному массиву

          # модифицируем имя файла

          if pathf[4,2].to_i >= 10

            pathf[4,2] = (pathf[4,2].to_i + 1).to_s

          else

            pathf[4] = (pathf[4,2].to_i + 1).to_s

          end

        end # конец цикла

        outtext=outtext+"</section>\n" # закрываем секцию

      end # усе. статью оформили...

    end # все статьи собрали в одну строку...

    # модифицируем выходной текст под FB2

    outtext.gsub!("<p><big><big><big><strong>","<title><p>")

    outtext.gsub!("</strong></big></big></big></p>","</p></title>")

    outtext.gsub!("<p><big><strong>","<epigraph><p>")

    outtext.gsub!("</strong></big></p>","</p></epigraph>")

    outtext.gsub!("&nbsp;",(160).chr)

    outtext.gsub!(/&(?!lt;|gt;)/,"&amp;")

    annotation.gsub!(/&(?!lt;|gt;)/,"&amp;")

    outtext.gsub!("<br>","</p><p>")

    outtext.gsub!("<br>","</p><p>")

    # чистим мусор

    outtext.gsub!(/\x01|\x12|\x18|\x1E/, "?")  # удаляем непечатные символы

    # корректируем неправильное использование "<" и ">"

    # заодно прибиваем ненужные тэги

    outtext.gsub!(/(<p>)(.*)(<\/p>)/) do |line|

      subl1,subl2,subl3 = $1,$2,$3

      subl2.gsub!("<","\x8b")

      subl2.gsub!(">","\x9b")

      line=subl1+subl2+subl3

    end

    # а линки выделим жирным

    outtext.gsub!(/\x8Ba href.+?\x9B(.*?)\x8B\/a\x9B/) {|line| line="<strong>"+$1+"<\/strong>"}

    # компьютерное тире - в типографское

    outtext.gsub!(/\s-\s/," \x97 ")

    outtext.gsub!("<p>-", "<p>\x97")

    annotation.gsub!(/\s-\s/," \x97 ")

    # добавляем заголовок

    outtext="<?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>nonfiction</genre>

    <author>

    <nickname>Редакция журнала</nickname>

    </author>

    <book-title>"+fbtitle[0]+fbtitle[1]+fbtitle[2]+"</book-title>

    <annotation>\n"+annotation+"</annotation>

    <date>"+fbtitle[2][-7,4]+"</date>

    <lang>ru</lang>

    <sequence name=\""+fbtitle[0]+"\" number=\""+fbtitle[1][1,2]+"\"/>

    </title-info>

    <document-info>

    <program-used>Yuzich Ruby script (WiseSoft -> FB2)</program-used>

    <src-url>http://www.wisesoft.ru</src-url>

    </document-info>

    </description>

    <body>\n"+outtext

    if flagSect then outtext=outtext+"</section>" end # если надо, закроем последнюю секцию раздела

    outtext=outtext+"</body>\n</FictionBook>\n" # добавляем хвост

    # в имени выходного файла не должно быть двоеточия

    fbtitle[0].gsub!(":","-")

    # и типографские кавычки - это не есть хорошо

    fbtitle[0].gsub!((171).chr,"`")

    fbtitle[0].gsub!((187).chr,"`")

    # сохраняем выходной файл

    wfile = File.new(fbtitle[0]+fbtitle[1]+".fb2","w")

    wfile.puts outtext

    wfile.close

    Вам останется только загрузить готовый FB2-файл в FB Editor и доделать, то, с чем не справился скрипт: вставить обложку, разметить подзаголовки и цитаты,  подправить эпиграфы. Но это не должно отнять много времени. Основную часть работы проделал скрипт.


    Рабочие версии этих скриптов вы можете взять с моего сайта http://yuzzich.narod.ru.


    Примечания:



    3.1

    HTA-приложение — приложение, выполняющееся средствами браузера. Фактически, это скрипт.







     

    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх