Создание электронных книг в формате FictionBook 2.1: практическое руководство (pre-release)

ОглавлениеДобавить в закладки К обложке

# теоретически должен обрабатывать журналы сделанные по июль 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>\n"

# начинаем формировать аннотацию

annotation="<p>Содержание номера:</p>\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><p>"+$1+"</p></title>\n" # открываем секцию раздела

    annotation=annotation+"<p>"+$1+":</p>\n" # и дополняем аннотацию

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

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

    filtr.match(line)

    pathf = $2 # берем путь к первому файлу статьи...

    annotation=annotation+"<p>"+(149).chr+" "+$3+"</p>\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!("<p><big><big><big><strong>","<title><p>")

outtext.gsub!("</strong></big></big></big></p>","</p></title>")

outtext.gsub!("<p><big><strong>","<epigraph><p>")

outtext.gsub!("</strong></big></p>","</p></epigraph>")

outtext.gsub!("&nbsp;",(160).chr)

outtext.gsub!(/&(?!lt;|gt;)/,"&amp;")

annotation.gsub!(/&(?!lt;|gt;)/,"&amp;")

outtext.gsub!("<br>","</p><p>")

outtext.gsub!("<br>","</p><p>")

# чистим мусор

outtext.gsub!(/\x01|\x12|\x18|\x1E/, "?")  # удаляем непечатные символы


Логин
Пароль
Запомнить меня