2009年 05月18日(Mon) [長年日記]
_ [TCG][Chaos][プログラム][ruby]ChaosTCGのエクセル版カードリストを作ろう(その4)
ローソン限定のカレンダーとか昔だったら即飛びついていたんですが、この不況の影響で未だ迷っています(謎)
と、エントリと関係無い話題はおいといて。
前回「少しへんな所が残ってる」と書いたのは、効果テキストにタグが残ったままになっているケースがあったためです。
Chaosの効果テキストには赤字や青字で書かれている部分があって、公式のカードリストではその部分がFontタグで囲まれていたわけです。
しかもChaosにおいてテキストの色はルール上非常に重要だったりしますので、色情報を省略するわけにもいきません。ところで2色しか使えない媒体でカードテキスト表現しようと思ったらどうするんだろう? あと関連する話として、TCGって色覚異常者に対する配慮に欠けてる作品が多いよね? 色でしか判断できない情報は基本NGだってデザイナーは学ぶべきだと思うんだ。ま、そんな事言っても私にも詳しいことは分からないんですが(^^;
あれ? 話がずれた。というわけで、効果テキストのタグの部分をどうするかって話。幸いにもエクセルはフォントカラーを弄れるので、赤字や青字をそのまま反映すれば良いでしょう。エクセルのデータを元に他のことをしようとすると面倒そうですが。
- get_chaos_cardlist_2.rb
require 'rubygems'
require 'mechanize'
agent = WWW::Mechanize.new
os, no = /(\w+-)(\d+)/.match(ARGV[0]).to_a.values_at(1,2)
list = []
until agent.get("http://chaos-tcg.com/jsp/cardlist?cardno
=#{os}#{no}").search('table.status').empty?
agent.page.links_with(:href=>/cardno/).map{|link|
sleep 0.1
card_page = link.click
sleep 0.1
no = /cardno=\w+-(\d+)/.match(card_page.uri.to_s).to_
a[1]
array = []
card = {}
(card_page/'table.status td').map{|e| array << e.inne
r_html}
name, kana = /(.+)<br><span class=\"kana\">(.+)<\/span
>/.match(array[1]).to_a.values_at(1,2)
card[:name] = name
card[:kana] = kana
card[:num] = array[2]
card[:sex] = array[3]
card[:rarity] = array[4]
card[:type] = array[5]
card[:attribute] = array[6]
card[:attack] = array[7]
card[:defense] = array[8]
card[:attack_diff] = array[9]
card[:defense_diff] = array[10]
card[:text] = array[11]
card[:flavor] = array[12]
card[:expansion] = array[13]
card[:entry] = array[14]
puts card[:num]
list << card
}
no = sprintf('%03d', no.to_i + 1)
end
require 'win32ole'
require 'jcode'
require 'kconv'
def getAbsolutePath filename
fso = WIN32OLE.new('Scripting.FileSystemObject')
return fso.GetAbsolutePathName(filename)
end
module WorkSheet
def [] y,x
cell = self.Cells.Item(y,x)
v = cell.Value
def v.cell= cell
@cell = cell
end
v.cell = cell
def v.method_missing(name,*args)
@cell.__send__(name,*args)
end
return v
end
def []=(y, x, value)
cell = self.Cells.Item y,x
if cell.MergeCells
cell.MergeArea.Item(1,1).Value = value
else
cell.Value = value
end
end
end
head = [
"カードNo.",
"カード名",
"カナ",
"種類",
"性別",
"属性",
"レアリティ",
"攻撃力",
"攻撃力(補正)",
"耐久力",
"耐久力(補正)",
"効果テキスト",
"フレーバー",
"エキスパンション",
"参加作品"
]
$KCODE = 's'
xl = WIN32OLE.new('Excel.Application')
begin
book = xl.Workbooks.Add
sheet = book.Worksheets.Item 1
sheet.extend WorkSheet
head.each_index{|i|
sheet[2, i + 2] = head[i].kconv(Kconv::SJIS, Kconv::UT
F8)
}
y = 4
list.each{|card|
sheet[y, 2] = card[:num]
sheet[y, 3] = card[:name].kconv(Kconv::SJIS, Kconv::UT
F8)
sheet[y, 4] = card[:kana].kconv(Kconv::SJIS, Kconv::UT
F8)
sheet[y, 5] = card[:type]
sheet[y, 6] = card[:sex].kconv(Kconv::SJIS, Kconv::UTF
8)
sheet[y, 7] = card[:attribute].kconv(Kconv::SJIS, Kcon
v::UTF8)
sheet[y, 8] = card[:rarity]
sheet[y, 9] = card[:attack]
sheet[y, 10] = "'#{card[:attack_diff]}"
sheet[y, 11] = card[:defense]
sheet[y, 12] = "'#{card[:defense_diff]}"
card[:text] = card[:text].kconv(Kconv::SJIS, Kconv::UT
F8).gsub(/<br>/, "\n")
blue = /<font color="blue">([^>]*)<\/font>/.match(card
[:text]).to_a[1]
red = /<font color="red">([^>]*)<\/font> /.match(card[
:text]).to_a[1]
card[:text] = card[:text].gsub(/<font color="(red|blue
)">/, "").gsub(/<\/font>/, "")
sheet[y, 13] = card[:text]
if blue
pos = Regexp.new("(.*)#{blue}", Regexp::MULTILINE).
match(card[:text]).to_a[1].jlength
len = blue.jlength
sheet[y, 13].Characters(pos + 1, len).Font.ColorInde
x = 5
end
if red
pos = Regexp.new("(.*)#{red}", Regexp::MULTILINE).m
atch(card[:text]).to_a[1].jlength
len = red.jlength
sheet[y, 13].Characters(pos + 1, len).Font.ColorInde
x = 3
end
sheet[y, 14] = card[:flavor].kconv(Kconv::SJIS, Kconv
::UTF8).gsub(/<br>/, "\n")
sheet[y, 15] = card[:expansion].kconv(Kconv::SJIS, Kc
onv::UTF8)
sheet[y, 16] = card[:entry].kconv(Kconv::SJIS, Kconv:
:UTF8).gsub(/<br>/, "\n")
y += 1
}
filename = getAbsolutePath("#{list[0][:expansion].kconv(
Kconv::SJIS, Kconv::UTF8).gsub(/[:\.]/, '_')}.xls")
book.SaveAs(filename)
ensure
book.Close
xl.Quit
end
横幅が収まらないので適当に改行しています。
生成したエクセルファイルのサンプルは以下。前回のサンプルは今回のものと置き換えています。
なお、AP-051(SR) 3つの願い「るーこ・きれいなそら」とAP-080 純真無垢「ユズハ」の効果テキストが足りない&ゴミが残ってるのは仕様です。公式のカードリストそのものが間違っているので。誰かブシロードに修正依頼でも投げてあげてください。
まぁしゃーないね^^;<br>延期って事なので、当面は場所と日程アナウンスに注意って感じかな。<br>招待状を持ってる人には個別で連絡が行くそうなので、早めに情報が来たら教えてくださいな。