После того, как скрипт отработает, в директории появится файл <имя_исходного_файла>.fb2. Небольшая правка в FB Editor и он будет полностью готов к распространению.
Эта задачка гораздо интереснее первой. Как раз тот случай, когда написание специализированного конвертора полностью оправдано.
На ресурсе 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> '
# начинаем формировать аннотацию
annotation='<p>Содержание номера:</p> '
# флажок открытой секции раздела
flagSect=false
# прокручиваем список ссылок
lmas.each do |line|
if line.include? 'SPAN' then # ССЫЛКА ИЛИ РАЗДЕЛИТЕЛЬ?
if flagSect then outtext=outtext+'</section> ' end # РАЗДЕЛИТЕЛЬ. Секцию закрывать надо?
/<SPAN CLASS='minSet'>(.+)</SPAN>/.match(line) # выгрызаем разделитель...
outtext=outtext+'<section> <title><p>'+$1+'</p></title> ' # открываем секцию раздела
annotation=annotation+'<p>'+$1+':</p> ' # и дополняем аннотацию
flagSect=true # секция осталась открыта...
else # НЕ-ЕТ, ВСЕ-ТАКИ ССЫЛКА...
filtr.match(line)
pathf = $2 # берем путь к первому файлу статьи...
annotation=annotation+'<p>'+(149).chr+' '+$3+'</p> ' # дополняем аннотацию...
puts pathf[0..2] # это чтобы не скучно было ждать...
outtext=outtext+'<section> ' # открыли секцию...
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(/.* (.* .* ).* .* /,' 1') : wtext.sub(/.* .* .* .* .* /,' 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> ' # закрываем секцию
end # усе. статью оформили...
end # все статьи собрали в одну строку...
# модифицируем выходной текст под FB2
outtext.gsub!('<p><big><big><big><strong>','<title><p>')
outtext.gsub!('</strong></big></big></big></p>','</p></title>')