К сожалению, такая лафа наблюдается не везде. С декабря 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>|(.+)<\/a>/
lmas = ltext.grep(filtr)
# начинаем формировать выходной текст
outtext="
"+fbtitle[0]+fbtitle[1]+fbtitle[2]+"
\n"
# начинаем формировать аннотацию
annotation="
Содержание номера:
\n"
# флажок открытой секции раздела
flagSect=false
# прокручиваем список ссылок
lmas.each do |line|
if line.include? "SPAN" then # ССЫЛКА ИЛИ РАЗДЕЛИТЕЛЬ?
if flagSect then outtext=outtext+"\n" end # РАЗДЕЛИТЕЛЬ. Секцию закрывать надо?
/(.+)<\/SPAN>/.match(line) # выгрызаем разделитель...
outtext=outtext+"\n"+$1+"
\n" # открываем секцию раздела
annotation=annotation+"
"+$1+":
\n" # и дополняем аннотацию
flagSect=true # секция осталась открыта...
else # НЕ-ЕТ, ВСЕ-ТАКИ ССЫЛКА...