Ethnaのアクションフォームを抜き出してみた

<?php
function searchActionFormData( $file ){
	$data = cut_comments( file_get_contents($file) );
	$action = array();

	// 親クラス
	preg_match('/_Form_(.*?) extends (.*?){/s', $data, $match);
	$action['extends'] = trim( $match[2] );

	// 設定取得
	preg_match('/\$form(.*?)\);/s', $data, $match);
	eval( $match[0] );
	$action['form'] = $form;

	// リターン先
	preg_match('/_ActionClass(.*)}/s', $data, $match);
	preg_match_all('/return (.*?);/', $match[1], $match);
	$list = array();
	foreach( $match[1] as $item ){
		// 入らないものを削除
		$item = str_replace( "'", '', $item );
		$item = str_replace( '"', '', $item );

		// null以外は追加
		if( strtolower( $item ) != 'null' ){
			$list[] = $item;
		}
	}

	// 重複を取り除いてソートしてリターン先を代入
	$list = array_unique( $list );
	sort( $list );
	$action['return'] = $list;

	return $action;
}

アクションの一覧を取り出したときに正規表現で解析しています。__ethna_info__を見るとちゃんと解析しているのですがある程度さっくりと。。。

アクションフォームは $form を取り出してきて、禁断の eval 関数を利用しています。リターン先は適当な解析なので prepare と perform を分離していません。本当は phpdoc の解析も一緒にやる方がいいですね。。。

この解析結果はとりあえず YAML に変換して一番下に表示しています。

土日はほとんど作業してないからあまり進んでいないや。。。本当はエクセルとかhtmlに出力するところまでやりたかったんですけれどね。