2008/01/20
AS3:あなたの設定はどこから? - 私は ini から。
外部テキストで初期設定やデータを用意することって必ずありますが、いつも状況に応じてファイル形式を決めます。
余裕があるときには後で CMS をかませたりして楽しいかもしれない rss、みんなでちゃんとやる時には xml、急いで一人で作る場合は csv か tsv (タブ区切り)。csv ってダブルクォーテーションの処理を考え出すといちいちめんどくさいし、かといって tsv は他の人には渡せないから人柱確定だし。
これを php でやる時ゎ ini 形式※であります。レガシーな形式でありますが、連想配列とか2次配列にすぐ変換できるし、なにより設定ファイルだとみればわかり。php の parse_ini_file は ini2array な、とても便利な関数なのでASにしてみました。file_get_contents もおまけです。
本家 parse_ini_file
本家 file_get_contents
※ ini ファイルって何?って人は、インターネット・ショートカット (.url) をブラウザではなくテキストエディタで開いてみてください。拡張子こそ url ですが、世界で最もシンプルな ini です。あと、「イニ」って呼び名萌えね?w
//サンプル
parse_ini_file(_test,"_nail/003574369220ef60ebc14105c6d2179f.ini")
parse_ini_file(_test,"_nail/003574369220ef60ebc14105c6d2179f.ini",true)
function _test(ini){
trace("test--------")
var j =0
var row = new Array();
for (var k in ini){
if(is_array(ini[k])){
for (var l in ini[k]){
trace('ini["'+k+'"]["'+l+'"] => '+ini[k][l]);
}
}else{
trace('ini["'+k+'"] => '+ini[k]);
row[j++] = ini[k]
}
}
//file_put_contents("test.txt",implode("\n",row))
}
//------------------------------------------------------------------------
function parse_ini_file( on_load:Function, filename, process_sections:Boolean=false ){
file_get_contents(
function(body){
var ini = new Array()
var s = "\n"+body+"\n"
if(process_sections){
var sections = s.split( /[\r\n]+[\t ]*\[([^\r\n\]]+)\][\t ]*[\r\n]+/s )
for(var i = 1; i<sections.length; i+=2 ){
ini[sections[i]] = parse_ini_file__rows(sections[i+1])
}
}else{
s = s.replace( /[\r\n]+[\t ]*\[([^\r\n\]]+)\][\t ]*[\r\n]+/gs, "\n" )
ini = parse_ini_file__rows(s)
}
on_load(ini)
}, filename
);
}
function parse_ini_file__rows(body){
var rows = new Array()
var s = "\n"+body
//var arr = s.split(/[\r\n]+[\t ]*([^=\r\n\t ]+)[\t ]*=[ \t]*/s)
//使用不可文字の考慮
var arr = s.split(/[\r\n]+[\t ]*([^=\r\n\t \{\}\|&~!\[\(\)]+)[\t ]*=[ \t]*/s)
for(var i = 1; i<arr.length; i+=2 ){
var k = arr[i]
var v = arr[i+1]
var reg = v.match(/^"(.*)"\s*$/s)
if( reg == null ){
if(Number(v) == v){
rows[k] = Number(v)
}else{
rows[k] = v
}
}else{
rows[k] = reg[1]
}
}
return(rows)
}
function file_get_contents( on_load:Function, filename ){
var u = new URLLoader();
u.addEventListener( Event.COMPLETE, function(o){on_load(o.target.data)} )
u.load(new URLRequest(filename) );
}
function is_array(v){ return(v is Array) }
function is_string(v){ return(v is String) }
function explode(delimiter,s){ return(s.split(delimiter)) }
function implode(glue,pieces){ return(pieces.join(glue)) }