ModernLib.Net

FictionBook 2.1: . 1.0 Release Candidat 1 15.05.2008 .

ModernLib.Net / / FictionBook 2.1: . 1.0 Release Candidat 1 15.05.2008 . - (. 6)
:
:

 

 


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

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

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

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

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

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

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

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

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

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 и не выходило.

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

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

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

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

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

#

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

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

#

# массив для перекодировки текста. Псевдографика заменяется на код 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 = "" # пустая строка?

  else

    line="

"+line+"

" # нет, не пустая

  end

end

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

wtext.insert(0,"<?xml version=\"1.0\" encoding=\"windows-1251\"?>

nonfiction

ru

Yuzich Ruby script (dostxt -> FB2)

")

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

wtext << "\n

\n\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-файлов, разбитые по папкам. Текст представляет собой обычные абзацы, обрамленные тэгами «

». Оформление 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=/(.+)(#\d{1,3})<\/font>(.+)<\/SPAN>/.match(ltext).captures

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

filtr=/(.+)<\/SPAN>|даже если книга изначально русскоязычная, все равно заполняют эту графу, дублируя Language. Так поступать не следует.

Translators— переводчик. Если книга не переводная, оставляем пустыми. Иначе заполняем таким же образом, как и графу Authors. Фамилия, имя, отчество и т.д.

Sequence— если книга входит в серию, то в поле Nameвводим название серии, а в поле Number— порядковый номер в серии.

Обратите внимание, что в правой части строки, перед кнопкой дублирования строки есть кнопка с треугольничком. Она позволяет создавать вложенныесерии. К примеру, основная серия — «Звездные Войны», вложенная серия — трилогия «Адмирал Траун».

Название серии может быть образовано по названию первой книги серии («Завтра война», «Имперские танцы»), имени главного героя («Кирилл Мазур»), местности, где происходит действие («Керторийский цикл»).

Раздел Document Infoсодержит информацию о самой книге.

В строку Authorsвводим информацию о человеке, создавшем этот документ. Аналогично ранее заполнявшимся Authorsи Translators.

Programs used— программное обеспечение, использованное при создании книги. Обычно FB Editor сам пишет там — «FB Tools». Если вы использовали какие-нибудь дополнительные утилиты — можно упомянуть их там.

Поля Dateи Valueзаполняются аналогично таким же полям в Book Info. Впрочем, FBE старается заполнить их сам.

Source URLs— если исходный текст для создания книги был скачан с какого-нибудь сайта, здесь нужно указать ссылку на него.

Source OCR— если книга было отсканирована, то здесь указываем данные (обычно ник) сканнериста, а также человека, производившего вычитку. Страна должна знать своих героев!

ID— уникальный номер документа. Обычно генерируется самим FB Editor-ом или программой конвертации.

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

А как быть, если вы любите создавать новые книги, используя заготовки-шаблоны? Например, особенно удобно это делать при подготовке серии книг. Можно конечно, каждый раз редактировать ID вручную, но это нудно и, кроме того, можно запросто забыть это сделать.

Выход прост, как все гениальное. Подготовив шаблон, очищаем поле ID в description, и тут же сохраняем файл. Когда FB Editor откроет его вновь, он сгенерирует новый ID автоматически.

То же самое, кстати, относится и к полям Date и Value в разделе Document Info.

Version— номер версии книги. Обычно — 1.0. По мере редактирования книги, может (и должен!) изменяться.

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

Вообще-то, одно время существовало соглашение, что у вычитаннойкниги номер версии должен быть не ниже 2.0.

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

Следующий раздел — Publisher Info. Здесь собрана информация о бумажном оригинале книги, если таковой существовал в природе.

Book name. Обычно совпадает с названием произведения, но если оно было издано в составе сборника, то здесь следует указывать название сборника.

Publisher— название издательства.

City— город, в котором была напечатана книга.

Year— год выпуска.

ISBN— код ISBN.

Sequence — название ПЕЧАТНОЙ серии. «Библиотека приключений», например, или «Абсолютное оружие». Также допускает вложенные серии.

В раздел Custom Infoможет вноситься произвольная дополнительная информация. Копирайт, благодарности, реклама и т.д. и т.п. Вплоть до мистических проклятий средневековых переписчиков («Кто эту книгу украдёт, у того руки отсохнут и уши отвалятся») :-).

Раздел Binary Objectsзаполняется автоматически, по мере присоединения к книге бинарных объектов, обычно картинок.

Щелкая по кнопкам с крестиком и удаляя графы в этом разделе, вы одновременно удаляете присоединенные объекты.

§ 4.4 Структурирование документа

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

Непосредственно сам процесс можно разделить на следующие этапы:

1) Разбиение на секции;

2) Разметка элементов;

3) Оформление сносок;

4) Вставка иллюстраций.

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

Если текст уже размеченный, допустим, после FB2Any, то сперва следует пройтись по «дереву» структуры документа, правя некорректно оформленные элементы и убирая лишние секции. А потом, все равно очень желательно перечесть книгу, внося дополнительные правки.

Окончательное оформление сносок (если они не проставлены FB2Any) происходит только после окончания второго этапа.

И только потом, когда книга почти готова, прикрепляется обложка и вставляются иллюстрации.

Разбиение на секции

Текст книги в формате FictionBook делится на секции.

В окне редактирования каждая секция выделена зеленой полоской слева. Разрывы в этой полоске отмечают деление на секции. Для вложенных секций добавляются дополнительные полоски. Все очень наглядно.

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

Создать новую секцию просто. Выбираем команду Edit\Clone container( Ctrl+Enter). После секции, на которой стоит курсор, появится новая секция с пустым заголовком.

Разделить уже набранную секцию можно так: поместив курсор в нужное место выбрать команду Edit\Split container( Shift+Enter). Секция разделится ровненько по позиции курсора. Если при этом выделен кусок текста, то он станет заголовком новой секции.

«Склеить» секции, как, допустим, разделы в редакторе MS Word, привычно поместив курсор в конец первой секции и нажав Del, не получится. Абзацы просто будут перетягиваться из одной секции в другую по одному. Поэтому для этого нужно использовать команду Edit\Merge containers( Alt+Delete). Если присоединяемая секция имела заголовок (title), он превращается в подзаголовок ( subtitle).

Создать вложенную секцию несложно.

Проще всего войти в режим редактирования исходника, найти начало первой секции (тэг

) и добавить перед ним еще один тэг
. Потом находим закрывающий тэг
последней секции и добавляем еще один такой же.

Считается что это единственный способ. Это не так. Cоздать вложенные секции можно и не выходя из режима WYSIWYG.

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

Аккуратно выделяем нужные секции и помещаем их в буфер. Лучше это сделать командой Edit\Cut( Ctrl+X). Не забываем подчистить мусор (после удаленных секций обычно остается одна пустая).


  • :
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15