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 }
このスクリプトを使う前の前提条件としては、
- Safariで書籍をHTMLビューで見る
- 印刷ボタンを押す
- 印刷しないで、HTMLファイル(全体)として保存する。
すると、HTMLファイルとその関連ファイルのディレクトリが作成される - それを全ページでやる
- それらのファイルがあるディレクトリに、globalstyle.cssというサイズ0の空ファイルを作っておく。
スクリプトがやってることをざっくり説明すると、
- globalstyle.cssをHTMLファイルの関連ファイルが入っているディレクトリにコピーする。
- HTMLファイルをマージするが、その際に
- 最初のファイルは、ヘッダー部分はそのまま出力するが、フッター部分は出力しない
- 最後のファイルは、ヘッダー部分は出力しないが、フッター部分はそのまま出力する
- その他のファイルでは、ヘッダーおよびフッターの両方を出力しない
その後、マージされたHTMLファイルをWordで開いて、画像を埋め込むようにしてRTF形式で保存します。RTFをKindleに送って、azwをもらう、という寸法。