<?php
/**人
* アノテーションに関するユーティリティ
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class charcoal_AnnotationUtil
{
	/*
	 *	アノテーションをパース
	 */
	public static function parse( $field, $annotations )
	{
		$phrase_list = explode( ' ', $annotations );

		$annotation_list = array();

		foreach( $phrase_list as $phrase ){
			if ( strpos($phrase,'@') === 0 ){
				// :までがアノテーション名
				$phrase = substr($phrase,1);
				$pos = strpos($phrase,':');
				if ( $pos === false ){
					// 値とパラメータはなし
					$name = $phrase;
					$value = NULL;
					$param = NULL;
				}
				else{
					// 値とパラメータを分ける
					$name = substr($phrase,0,$pos);
					$value_and_params = substr($phrase,$pos+1);
					$open = strpos($value_and_params,'(');
					$close = strpos($value_and_params,')');
					// パラメータがあるか
					if ( $open === false && $close === false ){
						// パラメータなし
						$value = $value_and_params;
						$param = NULL;
					}
					else if ( $open > 0 && $close > 0 ){
						// パラメータあり
						$value = substr($value_and_params,0,$open);
						$param = substr($value_and_params,$open+1,$close-$open-1);
					}
					else{
						// アノテーションフォーマット例外
						throw new charcoal_AnnotaionException( $field, $name, 'illegal format' );
					}
				}
				// アノテーション追加
				$annotation_list[$name] = new charcoal_Annotation( $name, $value, $param );
			}
		}

		return $annotation_list;
	}

}
