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 + " " 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 }
なんか冗長なソースなんでなんとかしてください、自分。