Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |

2007-02-19(Mon)

q2ch - 過去ログのDAT化

昨夜のq2chのアップデートスレ検索ができるようになりましたねー、すごく便利です。


さてさて、お気に入りのスレッドなどはhtml化された過去ログを取得して読んでいたりするのですが、w3mhtmlを直接読むよりは専用ソフトで読んだ方がやはり便利です。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