q2ch - 過去ログのDAT化
昨夜のq2chのアップデートでスレ検索ができるようになりましたねー、すごく便利です。
さてさて、お気に入りのスレッドなどはhtml化された過去ログを取得して読んでいたりするのですが、w3mでhtmlを直接読むよりは専用ソフトで読んだ方がやはり便利です。q2chのデータフォーマットは以前の日記で調べてあるので、過去ログのhtmlを変換するRubyスクリプトを書いてみました。
2000年〜2003年頃の過去ログを幾つか試してみましたが上手くいっているようです。
以下のスクリプトをSJISで保存。同じ場所に過去ログのhtmlを置いてスクリプトを実行するとfoo.htmlからfoo.datを作成する。このDATファイルをq2chの自作ログフォルダに置けばq2chの板一覧のその他から閲覧可能になる。
#!/usr/bin/env ruby # # 以下のフォーマットのhtmlをq2chのdat形式に変換 # #<dl> #<font size=+1 color=red>スレッドタイトル</font></b> #<dt>1 名前:<font color="#008800"><b> HN </b></font> 日時<dd>本文 #<dt>18 名前:<a href="mailto:sage"><b> HN </B></a> 日時<br><dd>本文 #</dl> # # $KCODE = "s" #require "kconv" #FILE_HTML = "test.html" #FILE_DAT = "test.dat" class HTML2DAT def initialize Dir.foreach(".") do |file| next unless /\.html$/ =~ file p file name, ext = file.split(".") datfile = name + ".dat" convert_html(file, datfile) # convert_html(FILE_HTML, FILE_DAT) end end def convert_html(file_in, file_out) File.open(file_out, "w") do |fout| status = 0 title = "no title" File.foreach(file_in) do |line| line.chomp! case status when 0 # <dl> までスキップ status = 1 if line =~ /^<dl>$/i when 1 # スレッドタイトル取得 /<font .*?>(.*)<\/font/i =~ line title = $1 status = 2 when 2 # 各レス変換 break if line =~ /^<\/dl>/i str = convert_line(line, title) # puts str.toeuc if str fout.puts str if str end end end end def convert_line(str, title) head, body = str.split(/<dd>/i) body.gsub!(/(<br>|\s)*$/i, "") # 本文 mail = "" /mailto:(.*)"/ =~ head # mail欄取得 mail = $1 head.gsub!(/\/font/, "/a") name, second = head.split(/<\/a>/i) name.gsub!(/<.*?>/, "") # No + 名前欄 second.gsub!(/<.*?>/, "") /^(\d+) 名前:(.*)/ =~ name no = $1 # レスNo first = $2 # 名前 #p no ret = "#{first}<>#{mail}<>#{second}<> #{body}" ret += "<>#{title}" if no == "1" return ret end end HTML2DAT.new