SafariからダウンロードしたHTMLファイルをマージするRubyスクリプト

オライリーSafariというサイトは、オンラインで書籍を読める。ファイルをページごとにHTML形式でローカルにダウンロードして、それをマージするというスクリプトRubyで描いてみた。

require "fileutils"

mergedFile = "hogehoge1.html"
File.delete(mergedFile)

# header = true : Keep header / false : delete header
# footer = true : Keep footer / false : delete footer
def mergeInto(src, dst, header = false, footer = false)
  lineno = 0
  File.open(src){|f|
    while line = f.gets
      lineno = f.lineno if f.eof?
    end
  }
  printf "%5d(lines) : %s\n", lineno, src
  en_header = 57
  st_footer = lineno - 5

  open(dst, "a"){|f|
    open(src) {|io|
      while line = io.gets
        if (footer == false && io.lineno > st_footer) then
          # nothing to do
        elsif (header == false && io.lineno < en_header) then
          # nothing to do
        elsif (header == false && io.lineno == en_header) then
          l2 = "<div>" + line.split(/<\/div><div>/)[1]
          f.write(l2)
        else
          f.write(line)
        end
      end
    }
  }
end

# copy globalstyle.css to all directories

Dir.glob("*").each{ |o|
  next unless FileTest.directory?(o)
  #FileUtils.cp("globalstyle.css", o + "/globalstyle.css")
}

# merge *.htm to mergedFile

l = Dir.glob("*.htm")
lst = l.length
cnt = 1
l.each{ |o|
  next if FileTest.directory?(o)
  if (cnt == 1) then
    # keep header but delete last part
    mergeInto(o, mergedFile, true, false)
  elsif (cnt == lst) then
    # delete header but keep last part
    mergeInto(o, mergedFile, false, true)
  else
    # delete both header and last
    mergeInto(o, mergedFile)
  end
  cnt += 1
}

このスクリプトを使う前の前提条件としては、

  1. Safariで書籍をHTMLビューで見る
  2. 印刷ボタンを押す
  3. 印刷しないで、HTMLファイル(全体)として保存する。
    すると、HTMLファイルとその関連ファイルのディレクトリが作成される
  4. それを全ページでやる
  5. それらのファイルがあるディレクトリに、globalstyle.cssというサイズ0の空ファイルを作っておく。

スクリプトがやってることをざっくり説明すると、

  1. globalstyle.cssをHTMLファイルの関連ファイルが入っているディレクトリにコピーする。
  2. HTMLファイルをマージするが、その際に
    1. 最初のファイルは、ヘッダー部分はそのまま出力するが、フッター部分は出力しない
    2. 最後のファイルは、ヘッダー部分は出力しないが、フッター部分はそのまま出力する
    3. その他のファイルでは、ヘッダーおよびフッターの両方を出力しない

その後、マージされたHTMLファイルをWordで開いて、画像を埋め込むようにしてRTF形式で保存します。RTFをKindleに送って、azwをもらう、という寸法。