lib/jkf/converter/csa.rb in jkf-0.4.0 vs lib/jkf/converter/csa.rb in jkf-0.4.1
- old
+ new
@@ -1,160 +1,165 @@
module Jkf::Converter
- class Csa
- VERSION = '2.2'
+ class Csa < Base
+ VERSION = "2.2".freeze
- def convert(jkf)
- hash = if jkf.is_a?(Hash)
- jkf
- else
- JSON.parse(jkf)
- end
-
+ def convert_root(jkf)
result = version
- result += convert_information(hash['header']) if hash['header']
- result += convert_initial(hash['initial']) if hash['initial']
- result += convert_moves(hash['moves']) if hash['moves']
+ result += convert_information(jkf["header"]) if jkf["header"]
+ result += convert_initial(jkf["initial"]) if jkf["initial"]
+ result += convert_moves(jkf["moves"]) if jkf["moves"]
result
end
+ protected
+
def convert_information(header)
- result = ''
- result += 'N+' + (header.delete('先手') || header.delete('下手') || '') + "\n" if header['先手'] || header['下手']
- result += 'N-' + (header.delete('後手') || header.delete('上手') || '') + "\n" if header['後手'] || header['上手']
- header.each { |(k,v)| result += "$#{csa_header_key(k)}:#{v}\n" }
+ result = ""
+ if header["先手"] || header["下手"]
+ result += "N+" + (header.delete("先手") || header.delete("下手") || "") + "\n"
+ end
+ if header["後手"] || header["上手"]
+ result += "N-" + (header.delete("後手") || header.delete("上手") || "") + "\n"
+ end
+ header.each { |(k, v)| result += "$#{csa_header_key(k)}:#{v}\n" }
result
end
def convert_initial(initial)
- result = ''
- data = initial['data']
- if initial['preset'] == 'OTHER'
- 9.times { |y|
- line = "P#{y+1}"
- 9.times { |x|
- piece = data['board'][8-x][y]
- line += if piece == {}
- " * "
- else
- csa_color(piece['color']) + piece['kind']
- end
- }
- result += line + "\n"
- }
- else
- result += 'PI'
- case initial['preset']
- when 'HIRATE'
- when 'KY' # 香落ち
- result += '11KY'
- when 'KY_R' # 右香落ち
- result += '91KY'
- when 'KA' # 角落ち
- result += '22KA'
- when 'HI' # 飛車落ち
- result += '82HI'
- when 'HIKY' # 飛香落ち
- result += '22HI11KY91KY'
- when '2' # 二枚落ち
- result += '82HI22KA'
- when '3' # 三枚落ち
- result += '82HI22KA91KY'
- when '4' # 四枚落ち
- result += '82HI22KA11KY91KY'
- when '5' # 五枚落ち
- result += '82HI22KA81KE11KY91KY'
- when '5_L' # 左五枚落ち
- result += '82HI22KA21KE11KY91KY'
- when '6' # 六枚落ち
- result += '82HI22KA21KE81KE11KY91KY'
- when '8' # 八枚落ち
- result += '82HI22KA31GI71GI21KE81KE11KY91KY'
- when '10' # 十枚落ち
- result += '82HI22KA41KI61KI31GI71GI21KE81KE11KY91KY'
- end
- end
+ result = ""
+ data = initial["data"]
+ result += if initial["preset"] == "OTHER"
+ convert_board(data["board"])
+ else
+ convert_preset(initial["preset"])
+ end
# 持駒
- if data['hands']
- sum = 0
- data['hands'][0].each_value { |n| sum += n }
- if sum > 0
- result += 'P+'
- data['hands'][0].to_a.reverse.each { |(k, v)| v.times { result += "00#{k}" } }
- result += "\n"
- end
- sum = 0
- data['hands'][1].each_value { |n| sum += n }
- if sum > 0
- result += 'P-'
- data['hands'][1].to_a.reverse.each { |(k, v)| v.times { result += "00#{k}" } }
- result += "\n"
- end
+ if data["hands"]
+ result += convert_hands(data["hands"], 0)
+ result += convert_hands(data["hands"], 1)
end
- result += csa_color(data['color']) + "\n" if data['color']
+ result += csa_color(data["color"]) + "\n" if data["color"]
result
end
+ def convert_hands(hands, color)
+ result = ""
+ sum = 0
+ hands[color].each_value { |n| sum += n }
+ if sum > 0
+ result += "P#{csa_color(color)}"
+ hands[color].to_a.reverse_each { |(k, v)| v.times { result += "00#{k}" } }
+ result += "\n"
+ end
+ result
+ end
+
def convert_moves(moves)
- result = ''
+ result = ""
moves.each do |move|
next if move == {}
- result += convert_move(move['move']) if move['move']
- result += convert_special(move['special'], move['color']) if move['special']
- if move['time']
- result += "," + convert_time(move['time'])
- elsif move['move'] || move['special']
+ result += convert_move(move["move"]) if move["move"]
+ result += convert_special(move["special"], move["color"]) if move["special"]
+ if move["time"]
+ result += "," + convert_time(move["time"])
+ elsif move["move"] || move["special"]
result += "\n"
end
- result += convert_comments(move['comments']) if move['comments']
+ result += convert_comments(move["comments"]) if move["comments"]
end
result
end
def convert_move(move)
- result = csa_color(move['color'])
- result += if move['from']
- "#{move['from']['x']}#{move['from']['y']}"
- else
- "00"
- end
- result += "#{move['to']['x']}#{move['to']['y']}"
- result += move['piece']
- result
+ result = csa_color(move["color"])
+ result += move["from"] ? pos2str(move["from"]) : "00"
+ result + pos2str(move["to"]) + move["piece"]
end
- def convert_special(special, color=nil)
+ def convert_special(special, color = nil)
result = "%"
result += csa_color(color) if color
- result += special
- result
+ result + special
end
def convert_time(time)
- sec = time['now']['m'] * 60 + time['now']['s']
+ sec = time["now"]["m"] * 60 + time["now"]["s"]
"T#{sec}\n"
end
def convert_comments(comments)
comments.map { |comment| "'#{comment}" }.join("\n") + "\n"
end
- protected
+ def convert_board(board)
+ result = ""
+ 9.times do |y|
+ result += "P#{y + 1}"
+ 9.times do |x|
+ piece = board[8 - x][y]
+ result += if piece == {}
+ " * "
+ else
+ csa_color(piece["color"]) + piece["kind"]
+ end
+ end
+ result += "\n"
+ end
+ result
+ end
+ def convert_preset(preset)
+ "PI" +
+ case preset
+ when "HIRATE"
+ when "KY" # 香落ち
+ "11KY"
+ when "KY_R" # 右香落ち
+ "91KY"
+ when "KA" # 角落ち
+ "22KA"
+ when "HI" # 飛車落ち
+ "82HI"
+ when "HIKY" # 飛香落ち
+ "22HI11KY91KY"
+ when "2" # 二枚落ち
+ "82HI22KA"
+ when "3" # 三枚落ち
+ "82HI22KA91KY"
+ when "4" # 四枚落ち
+ "82HI22KA11KY91KY"
+ when "5" # 五枚落ち
+ "82HI22KA81KE11KY91KY"
+ when "5_L" # 左五枚落ち
+ "82HI22KA21KE11KY91KY"
+ when "6" # 六枚落ち
+ "82HI22KA21KE81KE11KY91KY"
+ when "8" # 八枚落ち
+ "82HI22KA31GI71GI21KE81KE11KY91KY"
+ when "10" # 十枚落ち
+ "82HI22KA41KI61KI31GI71GI21KE81KE11KY91KY"
+ end
+ end
+
def csa_color(color)
- color == 0 ? '+' : '-'
+ color == 0 ? "+" : "-"
end
+ def pos2str(pos)
+ "%d%d" % [pos["x"], pos["y"]]
+ end
+
def version
"V#{VERSION}\n"
end
def csa_header_key(key)
{
- "棋戦" => "EVENT",
- "場所" => "SITE",
+ "棋戦" => "EVENT",
+ "場所" => "SITE",
"開始日時" => "START_TIME",
"終了日時" => "END_TIME",
- "持ち時間" => "TIME_LIMIT",
+ "持ち時間" => "TIME_LIMIT"
}[key] || key
end
end
end