<?php
/**
 * Smarty Internal Plugin Filter Handler
 * Smarty filter handler class
 *
 * @package    Smarty
 * @subpackage PluginsInternal
 * @author     Uwe Tews
 */

/**
 * Class for filter processing
 *
 * @package    Smarty
 * @subpackage PluginsInternal
 */
class Smarty_Internal_Filter_Handler {
	/**
	 * Run filters over content
	 * The filters will be lazy loaded if required
	 * class name format: Smarty_FilterType_FilterName
	 * plugin filename format: filtertype.filtername.php
	 * Smarty2 filter plugins could be used
	 *
	 * @param  string $type the type of filter ('pre','post','output') which shall run
	 * @param  string $content the content which shall be processed by the filters
	 * @param  Smarty_Internal_Template $template template object
	 *
	 * @throws SmartyException
	 * @return string                   the filtered content
	 */
	public static function runFilter( $type, $content, Smarty_Internal_Template $template ) {
		$output = $content;
		// loop over autoload filters of specified type
		if ( ! empty( $template->smarty->autoload_filters[ $type ] ) ) {
			foreach ( (array) $template->smarty->autoload_filters[ $type ] as $name ) {
				$plugin_name = "Smarty_{$type}filter_{$name}";
				if ( $template->smarty->loadPlugin( $plugin_name ) ) {
					if ( function_exists( $plugin_name ) ) {
						// use loaded Smarty2 style plugin
						$output = $plugin_name( $output, $template );
					} elseif ( class_exists( $plugin_name, false ) ) {
						// loaded class of filter plugin
						$output = call_user_func( [ $plugin_name, 'execute' ], $output, $template );
					}
				} else {
					// nothing found, throw exception
					throw new SmartyException( "Unable to load filter {$plugin_name}" );
				}
			}
		}
		// loop over registerd filters of specified type
		if ( ! empty( $template->smarty->registered_filters[ $type ] ) ) {
			foreach ( $template->smarty->registered_filters[ $type ] as $key => $name ) {
				if ( is_array( $template->smarty->registered_filters[ $type ][ $key ] ) ) {
					$output = call_user_func( $template->smarty->registered_filters[ $type ][ $key ], $output, $template );
				} else {
					$output = $template->smarty->registered_filters[ $type ][$key]( $output, $template );
				}
			}
		}
		
		// return filtered output
		return $output;
	}
}
