#!/usr/bin/env ruby require 'time' # --- 全体設定 # Timeの文字列表記に影響 ENV['TZ'] = 'JST-9' # 自作クラスの読み込み require 'html_builder' # このアプリケーション全体をあらわすクラス class TatutyuLister class << self def jihun t case t when Time t.strftime('%Y年%m月%d日%H時%M分') else t.to_s end end end def initialize argv @curtime = Time.parse(argv.first) # TOFIX 変更できるようにしたほうがよいか(ARGVならばuntaintが必要) @infnam = 'tatutyu.ltsv' @outfnam = 'out.html' @db = [] @html = HTMLBuilder.new(' 竜巻注意情報 発表状況一覧') end def yomikomi File.open(@infnam, 'r') { |infile| infile.each_line {|line| row = {} line.chomp.split(/\t/).each {|cell| key, val = cell.split(/:/, 2) val = Time.parse(val) if /time$/ =~ key row[key] = val } # 試験電文を排除 if row['st'] != '通常' $stderr.puts "reject #{row['rtime']} st=#{row['st']}" if $VERBOSE next end # 未来の電文を排除 if row['rtime'] > @curtime $stderr.puts "reject future #{row['rtime']}" if $VERBOSE next end # store message @db.push row } } @db.sort_by! {|row| row['rtime'] } @db.reverse! $stderr.puts "#{@db.size} lines loaded" if $VERBOSE end def buildpage @html.header('link', 'rel'=>'stylesheet', 'type'=>'text/css', 'href'=>'t.css') @html.tag('h1') { @html.puts("竜巻注意情報 発表状況") } cols = ['発表日時', '解除日時', '対象地域', '件名', '補足'] opts = { :caption => ["竜巻注意情報 発表状況(", TatutyuLister.jihun(@curtime), '更新)'].join } @html.table(cols, opts) { @db.each {|row| @html.tag('tr') { rtime = TatutyuLister.jihun(row['rtime']) @html.tag('td') { @html.puts(rtime) } if row['vtime'] >= @curtime then vtime = TatutyuLister.jihun(row['vtime']) else vtime = '(解除済み)' end @html.tag('td') { @html.puts(vtime) } @html.tag('td', 'data-areacode'=>row['ac']) { @html.puts(row['an']) } mokugeki = !(row['mok'].to_i.zero?) opts = {} opts['class'] = 'level5' if mokugeki title = [row['tl'], '第', row['ser'], '号'].join @html.tag('td', opts) { @html.tag('a', 'href'=>row['src'], 'title'=>row['txt']) { @html.puts(title) } } mok = (mokugeki ? '【目撃情報あり】' : '') @html.tag('td', opts) { @html.puts(mok) } } } } end def run yomikomi buildpage File.open(@outfnam, 'w') {|outfile| @html.write(outfile) } end end TatutyuLister.new(ARGV).run if $0 == __FILE__