После того, как скрипт отработает, в директории появится файл <имя_исходного_файла>.fb2. Небольшая правка в FB Editor и он будет полностью готов к распространению.

Пример второй. Конвертирование журналов c WiseSoft.ru

Эта задачка гораздо интереснее первой. Как раз тот случай, когда написание специализированного конвертора полностью оправдано.

На ресурсе 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>')

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату