на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить



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

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

На ресурсе http://www.wisesoft.ru находится множество различных журналов. Форматы в котором они представлены, различаются, Но один из них особо привлекателен для преобразования в FB2. Я говорю о журналах которые представлены в виде пачки html-файлов («Хакер», «Хакер-спец», «Мобильные компьютеры», «Хулиган» и др.).  При всей простоте, конвертированию стандартными средствами этот способ хранения данных поддается с трудом.

Более близкое знакомство выявило следующее. Имеется  файл index.htm с оглавлением. Статьи представляют собой кучки html-файлов, разбитые по папкам. Текст представляет собой обычные абзацы, обрамленные тэгами «

». Оформление 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=/(.+)(#\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 # НЕ-ЕТ, ВСЕ-ТАКИ ССЫЛКА...

    filtr.match(line)

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

    annotation=annotation+"

"+(149).chr+" "+$3+"

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

    puts pathf[0..2] # это чтобы не скучно было ждать...

    outtext=outtext+"

\n" # открыли секцию...

    while File::exists?(pathf) do # обрабатываем статью

      # считали файлик в текстовую строку...

      wfile=File.open(pathf)

      wtext=wfile.readlines.to_s

      wfile.close

      wtext[/.+?<\/p>/m]="" # чик! головка...

      wtext[/

.+<\/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+"

\n" # закрываем секцию

  end # усе. статью оформили...

end # все статьи собрали в одну строку...

# модифицируем выходной текст под FB2

outtext.gsub!("

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

outtext.gsub!("

","

")

outtext.gsub!("

","

")

outtext.gsub!(" ",(160).chr)

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

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

outtext.gsub!("
","

")

outtext.gsub!("
","

")

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

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

# корректируем неправильное использование "<" и ">"

# заодно прибиваем ненужные тэги

outtext.gsub!(/(

)(.*)(<\/p>)/) do |line|

  subl1,subl2,subl3 = $1,$2,$3

  subl2.gsub!("<","\x8b")

  subl2.gsub!(">","\x9b")

  line=subl1+subl2+subl3

end

# а линки выделим жирным

outtext.gsub!(/\x8Ba href.+?\x9B(.*?)\x8B\/a\x9B/) {|line| line=""+$1+"<\/strong>"}

# компьютерное тире - в типографское

outtext.gsub!(/\s-\s/," \x97 ")

outtext.gsub!("

-", "

\x97")

annotation.gsub!(/\s-\s/," \x97 ")

# добавляем заголовок

outtext="

nonfiction

Редакция журнала

"+fbtitle[0]+fbtitle[1]+fbtitle[2]+"

\n"+annotation+"

"+fbtitle[2][-7,4]+"

ru

Yuzich Ruby script (WiseSoft -> FB2)

http://www.wisesoft.ru

\n"+outtext

if flagSect then outtext=outtext+"

" end # если надо, закроем последнюю секцию раздела

outtext=outtext+"\n\n" # добавляем хвост

# в имени выходного файла не должно быть двоеточия

fbtitle[0].gsub!(":","-")

# и типографские кавычки - это не есть хорошо

fbtitle[0].gsub!((171).chr,"`")

fbtitle[0].gsub!((187).chr,"`")

# сохраняем выходной файл

wfile = File.new(fbtitle[0]+fbtitle[1]+".fb2","w")

wfile.puts outtext

wfile.close

Вам останется только загрузить готовый FB2-файл в FB Editor и доделать, то, с чем не справился скрипт: вставить обложку, разметить подзаголовки и цитаты,  подправить эпиграфы. Но это не должно отнять много времени. Основную часть работы проделал скрипт.


Рабочие версии этих скриптов вы можете взять с моего сайта http://yuzzich.narod.ru.


Конвертирование форматированного dos-текста | Создание электронных книг в формате FictionBook 2.1: практическое руководство (beta 4) | Часть IV Редактирование книг. FB Editor