<?php
/**
* Curvyレンダラ
*
* PHP version 5
*
* @package    renderers
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
require_once( 'Curvy/Curvy.class.php' );

class CurvyRenderer extends CharcoalComponent implements IRenderer
{
	var $_template_files;
	var $_curvy;

	/*
	 *	コンストラクタ
	 */
	public function __construct()
	{
		parent::__construct();

		$this->_template_files = array();
		$this->_curvy = new Curvy();
	}

	/*
	 * レンダラー名を取得
	 */
	public function getRendererName()
	{
		return "Curvy Renderer";
	}

	/*
	 * レンダラーを初期化する
	 */
	public function init( Config $config )
	{
		$this->_Curvy->caching 			= $config->getBoolean( 'caching' );
		$this->_Curvy->compile_check 	= $config->getBoolean( 'compile_check' );
		$this->_Curvy->template_dir 	= $config->getString( 'template_dir' );
		$this->_Curvy->compile_dir 		= $config->getString( 'compile_dir' );
		$this->_Curvy->config_dir 		= $config->getString( 'config_dir' );
		$this->_Curvy->cache_dir 		= $config->getString( 'cache_dir' );

		// テンプレートファイルマッピング
		$this->_template_files	= $config->getAssoc( 'template_files' );
	}

	/*
	 * テンプレートファイル名を取得
	 */
	private function getTemplateFile( $template_name )
	{
		$template_file = $this->_template_files[ $template_name ];
		if ( !$template_file ){
//$this->_config->dump();
			_throw( new TemplateFileNotFoundException( $template_name ) );
		}
		return $template_file;
	}

	/*
	 * レンダリングを行う
	 */
	public function render( String $page, Response $response )
	{
		log_info( "system",  "CurvyRendererによるレンダリングを行います。", __FILE__, __LINE__ );

		try{

			// Curvyオブジェクトを取得
			$curvy = $this->_curvy;

			// レスポンスデータをすべてCurvyにassignする
			$keys = $response->getKeys();
			foreach( $keys as $key ){
				$value = $response->get( $key );
				$curvy->assign( $key, $value );
			}

			// 論理テンプレート名
			$template_name = $context->get( 'curvy_template' );

			// テンプレートファイル名に変換
			$template_file = $this->getTemplateFile( $template_name );

			// テンプレートを展開、表示
			$Curvy->display( $template_file );
		}
		catch ( Exception $e )
		{
			_throw( new RendererException( "rendering failed" ) );
		}

		log_info( "system",  "CurvyRendererによるレンダリングを行いました。", __FILE__, __LINE__ );
	}
}

return __FILE__;