# you will see such files under the some_dir directory.
#
# Author:: Daigo Moriwaki <daigo at debian dot org>
-# Copyright:: Copyright (C) 2006-2008 Daigo Moriwaki <daigo at debian dot org>
+# Copyright:: Copyright (C) 2006-2017 Daigo Moriwaki <daigo at debian dot org>
#
# $Id$
#
require 'time'
require 'pathname'
require 'getoptlong'
+require 'nkf'
class CsaFileReader
WIN_MARK = "win"
DRAW_MARK = "draw"
attr_reader :file_name
+ attr_reader :str
attr_reader :black_name, :white_name
attr_reader :black_id, :white_id
attr_reader :winner, :loser
+ attr_reader :state
attr_reader :start_time, :end_time
+ attr_reader :ply
- def initialize(file_name)
+ def initialize(file_name, encoding="Shift_JIS:EUC-JP")
@file_name = file_name
+ @encoding = encoding
+ @ply = 0
grep
end
def grep
- str = File.open(@file_name).read
+ @str = File.open(@file_name, "r:#{@encoding}").read
- if /^N\+(.*)$/ =~ str then @black_name = $1.strip end
- if /^N\-(.*)$/ =~ str then @white_name = $1.strip end
- if /^'summary:(.*)$/ =~ str
- state, p1, p2 = $1.split(":").map {|a| a.strip}
- return if state == "abnormal"
+
+ if /^N\+(.*)$/ =~ @str then @black_name = $1.strip end
+ if /^N\-(.*)$/ =~ @str then @white_name = $1.strip end
+ if /^'summary:(.*)$/ =~ @str
+ @state, p1, p2 = $1.split(":").map {|a| a.strip}
p1_name, p1_mark = p1.split(" ")
p2_name, p2_mark = p2.split(" ")
if p1_name == @black_name
raise "Never reach!: #{black} #{white} #{p3} #{p2}"
end
end
- if /^\$START_TIME:(.*)$/ =~ str
+ if /^\$START_TIME:(.*)$/ =~ @str
@start_time = Time.parse($1.strip)
end
- if /^'\$END_TIME:(.*)$/ =~ str
+ if /^'\$END_TIME:(.*)$/ =~ @str
@end_time = Time.parse($1.strip)
end
- if /^'rating:(.*)$/ =~ str
- black_id, white_id = $1.split(":").map {|a| a.strip}
+ if /^'summary:.*?:(.*)$/ =~ @str
+ black_id, bresult, white_id, wresult = $1.split(":").map {|a| a.strip.split(" ")}.flatten
@black_id = identify_id(black_id)
@white_id = identify_id(white_id)
- if @black_id && @white_id && (@black_id != @white_id) &&
- @black_mark && @white_mark
+ if @black_id && @white_id
if black_mark == WIN_MARK && white_mark == LOSS_MARK
@winner, @loser = @black_id, @white_id
elsif black_mark == LOSS_MARK && white_mark == WIN_MARK
@winner, @loser = @white_id, @black_id
- elsif black_mark == DRAW_MARK && white_mark == DRAW_MARK
+ else
+ # draw or errors
@winner, @loser = nil, nil
- else
- raise "Never reached!"
end
end
end
+
+ @str.each_line do |line|
+ if /^[\+\-]\d{4}[A-Z]{2}/ =~ line
+ @ply += 1
+ end
+ end
+ end
+
+ def movetimes
+ ret = []
+ @str.gsub(%r!^T(\d+)!) do |match|
+ ret << $1.to_i
+ end
+ return ret
end
def to_s
"BlackName #{@black_name}, WhiteName #{@white_name}\n" +
"BlackId #{@black_id}, WhiteId #{@white_id}\n" +
"Winner #{@winner}, Loser #{@loser}\n" +
- "Start #{@start_time}, End #{@end_time}\n"
+ "Start #{@start_time}, End #{@end_time}\n" +
+ "Ply #{@ply}"
end
def identify_id(id)
puts " --players player_a,player_b select games of the player_a vs the player_b"
puts " --black player select games of which the player is Black"
puts " --white player select games of which the player is White"
+ puts " --winner player select games that the player won"
+ puts " --loser player select games that the player lose"
exit 1
end
parser = GetoptLong.new(
['--black', GetoptLong::REQUIRED_ARGUMENT],
['--white', GetoptLong::REQUIRED_ARGUMENT],
- ['--players', GetoptLong::REQUIRED_ARGUMENT]
+ ['--players', GetoptLong::REQUIRED_ARGUMENT],
+ ['--winner', GetoptLong::REQUIRED_ARGUMENT],
+ ['--loser', GetoptLong::REQUIRED_ARGUMENT]
)
begin
parser.each_option do |name, arg|
if $OPT_WHITE
next unless csa.white_id.downcase.index($OPT_WHITE.downcase) == 0
end
+
+ if $OPT_WINNER
+ next unless csa.winner && csa.winner.downcase.index($OPT_WINNER.downcase) == 0
+ end
+ if $OPT_LOSER
+ next unless csa.loser && csa.loser.downcase.index($OPT_LOSER.downcase) == 0
+ end
+
puts csa.file_name
end
end