Создание электронных книг в формате FictionBook 2.1: практическое руководство. Версия 1.0 Release Candidat 2 от 21.08.2008 г. (Кондратович) - страница 41

К сожалению, такая лафа наблюдается не везде. С декабря 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="<p>"+fbtitle[0]+fbtitle[1]+fbtitle[2]+"</p>\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<p>"+$1+"</p>\n" # открываем секцию раздела

    annotation=annotation+"

"+$1+":

\n" # и дополняем аннотацию

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

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