Михаил Кондратович - Создание электронных книг в формате FictionBook 2.1: практическое руководство (pre-release)
Более близкое знакомство выявило следующее. Имеется файл 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=/<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>
"+fbtitle[0]+fbtitle[1]+fbtitle[2]+"
</title>n"# начинаем формировать аннотацию
annotation="
Содержание номера:
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>
"+$1+"
</title>n" # открываем секцию разделаannotation=annotation+"
"+$1+":
n" # и дополняем аннотациюflagSect=true # секция осталась открыта...
else # НЕ-ЕТ, ВСЕ-ТАКИ ССЫЛКА...
filtr.match(line)
pathf = $2 # берем путь к первому файлу статьи...
annotation=annotation+"
"+(149).chr+" "+$3+"
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!("
<big><big><big><strong>","<title>
")
outtext.gsub!("</strong></big></big></big>
","</title>")outtext.gsub!("
<big><strong>","<epigraph>
")
outtext.gsub!("</strong></big>
","</epigraph>")outtext.gsub!(" ",(160).chr)
outtext.gsub!(/&(?!lt;|gt;)/,"&")
annotation.gsub!(/&(?!lt;|gt;)/,"&")
outtext.gsub!("<br>","
")
outtext.gsub!("<br>","
")
# чистим мусор
outtext.gsub!(/x01|x12|x18|x1E/, "?") # удаляем непечатные символы
# корректируем неправильное использование "<" и ">"
# заодно прибиваем ненужные тэги
outtext.gsub!(/(
)(.*)(</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/ax9B/) {|line| line="<strong>"+$1+"</strong>"}
# компьютерное тире - в типографское
outtext.gsub!(/s-s/," x97 ")
outtext.gsub!("
-", "
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.
Часть IV
Редактирование книг. FB Editor
Как уже говорилось, файл книги, после конвертации, в обязательном порядке требует окончательной доводки.
Для этого существует программа FB Editor, входящая в пакет FB Tools. Разумеется, это далеко не единственное стредство редактирования FB2-книг.
Данное описание соответствует оригинальной версии FB Editor 1.0 от 23 февраля 2005 года.
Автор FB Editor, Михаил Мацнев, не стал утруждать себя написанием help-а, не без основания считая, что разобраться, как работать с программой, можно и без такового.
Однако, судя по количеству вопросов на форумах fictionbook.org и прочих, описание программы все-таки требуется.
§ 4.1 Установка программы
Для работы FB Tools требуется операционная система семейства Windows NT: лучше всего Windows 2000 или Windows XP.
Также понадобится MSXML 4.0 SP2 и Internet Explorer версии не ниже 5.5 и (внимание!) не выше 6.0 SP1.
Скачать MSXML 4.0 можно с официального сайта Micro$oft. При этом проверка Windows на легальность не производится :).
==ВАЖНО========================
Если у вас установлен Internet Explorer 7.0 и выше, ставить FB Editor, не стоит и пытаться — работать не будет. Вам придется воспользоваться альтернативной разработкой — FB Writer или версией FBE от «ЛитРес».
===============================
Попутно в систему будет установлено пару библиотек, позволяющих видеть свойства книг FB2 в Проводнике и, щелкнув правой клавишей мыши, производить их верификацию прямо из Проводника. Правда, в Windows Vista они работать не будут.
Наконец, все нужные компоненты закачаны, программа установлена. Можно приступать к работе.
§ 4.2 Описание функций и основные приемы работы
Как нетудно догадаться, FB Editor позволяет редактировать файлы в формате FB2. Довольно скромный набор функций частично компенсируется возможностью прямого редактирования XML-файла книги.
Механизм работы редактора не так прост, как может показаться на первый взгляд. Кроме непосредственно exe-файла существуют еще два Java-скрипта, с помощью которых реализована часть функций редактирования. При WYSIWYG-редактировании контент книги преобразуется в динамический HTML, с которым и работают основные и дополнительные Java-скрипты.
После запуска FictionBook Editor появляется рабочее окно.
Вверху находится стандартное меню и панель инструментов. Под ними располагается панель линков, с помощью которой можно присваивать имена (метки) элементам книги, а также делать ссылки и сноски.
Большую часть рабочего окна занимает главное окно редактирования текста. Оно имеет три режима: редактирование описания книги, редактирование текста книги в режиме WYSIWYG, и в режиме «исходника», когда видны все тэги и настоящая структура файла.
Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Михаил Кондратович - Создание электронных книг в формате FictionBook 2.1: практическое руководство (pre-release), относящееся к жанру Прочая околокомпьютерная литература. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.


