SafariからダウンロードしたHTMLファイルをマージするRubyスクリプト、その3。Safari以外も対応するように

Safariだけでなく、いろんなサイトにも対応するようにした。
全体のスクリプトはこっち--> http://gist.github.com/600823

1. HtmlMergerというクラスを作った。

class HtmlMerger
  def initialize(header_height = 0, footer_height = 0)
    @en_header = header_height
    @h_footer = footer_height
  end

  def countLine
    return nil unless FileTest.file?(@src) 

    File.open(@src){|f|
      while line = f.gets
        return f.lineno if f.eof
      end
    }
  end
  
  def merge(src, dst, header = false, footer = false)
    @src = src
    @dst = dst
    @header = header
    @footer = footer

    @lineno = countLine
    printf "%5d(lines) : %s\n", @lineno, @src
    mergeMain if @lineno
  end

private 
  def mergeMain
    @st_footer = @lineno - @h_footer
    open(@dst, "a"){|@f|
      open(@src){|@io|
        @inPre = false
        while @line = @io.gets
          writeLine
        end
        @line = nil
        @inPre = nil
        @st_footer = nil
        @lineno = nil
      }
    }
  end

  def writeLine
    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
      if @line.index("if(self.E)self.E") then
        l2 = "<div>" + @line.split(/<\/div><div>/)[1]
        @f.write(l2)
      else
        @f.write(@line)
      end
    else
      if @inPre == false && @line.index("<pre>") then
        @inPre = true
      end
      if @inPre == true && @line.index("</pre>") then
        @inPre = false
      end
      if @inPre == true then
        @line = formatCode(@line)
      end
      
      @f.write(@line)
    end
  end

  def formatCode(line)
    line2 = line + "<br/>"
    len = line2.length
    line3 = ""
    len.times{|i|
      c = line2[i].chr
      if c == " " then
        line3 = line3 + "&emsp;"
      else
        line3 = line3 + line2[i,len]
        break
      end
    }
    return line3
  end

end

なにをやってるかというと、各ページに共通なheaderとfooterを取り除いてその後、preタグ内部はしかるべく空白と改行タグを入れてる、だけです。

2.コマンドライン引数に以下を指定できる

-o= アウトプットディレクトリ。マージされた最終結果のHTMLファイルも同じ名前になります
-h= ヘッダの行数。Safariでは57行。”http://mitpress.mit.edu/sicp/full-text/book/book.html:TITLE=SICP”だと17行。(デフォルトは57行)
-f= フッタの行数。Safariでは5行。SICPも5行。(デフォルトは5行)

ARGV.length.times{|i|
  v = ARGV[i]
  if v.index("-o=") then
    dst = "Compiled/" + v[3,v.length]
    moveFiles(dst, css)
    Dir.chdir(dst)
  end
  if v.index("-h=") then
    header_height = v[3,v.length].to_i
  end
  if v.index("-f=") then
    footer_height = v[3,v.length].to_i
  end
}

なんか冗長なソースなんでなんとかしてください、自分。