Информационный портал
pocket versionPOCKET  wikiWIKI  FAQFAQ  ПоискПоиск  ПользователиПользователи  ГруппыГруппы  РегистрацияРегистрация  ПрофильПрофиль  Войти и проверить личные сообщенияВойти и проверить личные сообщения  ВходВход

Скрипт для конвертации журналов с WiseSoft.ru

 
Найти сообщения без ответов
Начать новую тему   Ответить на тему    Список форумов www.fictionbook.org -> Сделано для FB
Предыдущая тема :: Следующая тема  
Автор Сообщение


Юзич
Зрелый участник форума

Зрелый участник форума

Зарегистрирован: 07.02.2006
Сообщения: 120
Откуда: Республика Беларусь

СообщениеДобавлено: Пт Май 16, 2008 17:04    Заголовок сообщения: Скрипт для конвертации журналов с WiseSoft.ru Ответить с цитатой

Баловство, конечно, но, может, кому пригодится.
На WiseSoft.ru есть куча журналов, которые так и просятся в FB2.
Данный скрипт на языке Ruby, позволяет качественно cконвертировать большинство из них.


Код:
# Скрипт для конвертации журналов с 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>\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/, "?")  # удаляем непечатные символы
# корректируем неправильное использование "<" и ">"
# заодно прибиваем ненужные тэги
outtext.gsub!(/(<p>)(.*)(<\/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="<strong>"+$1+"<\/strong>"}
# компьютерное тире - в типографское
outtext.gsub!(/\s-\s/," \x97 ")
outtext.gsub!("<p>-", "<p>\x97")
annotation.gsub!(/\s-\s/," \x97 ")
# добавляем заголовок
outtext="<?xml version=\"1.0\" encoding=\"windows-1251\"?>
<FictionBook xmlns=\"http://www.gribuser.ru/xml/fictionbook/2.0\" xmlns:l=\"http://www.w3.org/1999/xlink\">
<description>
<title-info>
<genre>nonfiction</genre>
<author>
<nickname>Редакция журнала</nickname>
</author>
<book-title>"+fbtitle[0]+fbtitle[1]+fbtitle[2]+"</book-title>
<annotation>\n"+annotation+"</annotation>
<date>"+fbtitle[2][-7,4]+"</date>
<lang>ru</lang>
<sequence name=\""+fbtitle[0]+"\" number=\""+fbtitle[1][1,2]+"\"/>
</title-info>
<document-info>
<program-used>Yuzich Ruby script (WiseSoft -> FB2)</program-used>
<src-url>http://www.wisesoft.ru</src-url>
</document-info>
</description>
<body>\n"+outtext
if flagSect then outtext=outtext+"</section>" end # если надо, закроем последнюю секцию раздела
outtext=outtext+"</body>\n</FictionBook>\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.
Только надо в FBE прицепить обложку и расставить эпиграфы-цитаты.

Последнюю версию скрипта можно скачать с моей странички.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.fictionbook.org -> Сделано для FB Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group