home > 投稿 > AS3:あなたの設定はどこから? - 私は ini から。
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))	}

トラックバックURL

http://faces2.bascule.co.jp/mt/mt-tb.cgi/552

コメントを投稿

(コメントには承認が必要になることがあります。承認されるまではコメントは表示されません。)