*/ private array $engines; /** * @var array */ private array $renderers; /** * @var array */ private array $token_factories; /** * @var array */ private array $integrations; private Template_Engine $fallback_engine; private string $render_folder; /** * @param Template_Engine[] $engines */ public function __construct( array $engines, Template_Engine $fallback_engine, string $render_folder ) { $this->engines = array(); $this->renderers = array(); $this->token_factories = array(); $this->integrations = array(); $this->fallback_engine = $fallback_engine; $this->render_folder = $render_folder; foreach ( $engines as $engine ) { $this->engines[ $engine->get_name() ] = $engine; } } public function resolve_renderer( string $name ): ?Template_Renderer { if ( ! key_exists( $name, $this->renderers ) ) { $this->renderers[ $name ] = $this->make_renderer( $name ); } return $this->renderers[ $name ]; } public function resolve_token_factory( string $template_engine ): Token_Factory { if ( key_exists( $template_engine, $this->engines ) ) { if ( ! key_exists( $template_engine, $this->token_factories ) ) { $this->token_factories[ $template_engine ] = $this->engines[ $template_engine ]->create_token_factory(); } return $this->token_factories[ $template_engine ]; } $fallback_engine = $this->fallback_engine->get_name(); if ( key_exists( $fallback_engine, $this->engines ) ) { return $this->resolve_token_factory( $fallback_engine ); } return $this->fallback_engine->create_token_factory(); } public function resolve_integration( string $template_engine ): ?Template_Integration { if ( ! key_exists( $template_engine, $this->engines ) ) { return null; } if ( ! key_exists( $template_engine, $this->integrations ) ) { $this->integrations[ $template_engine ] = $this->engines[ $template_engine ]->create_integration(); } return $this->integrations[ $template_engine ]; } /** * @return array */ public function get_integrations(): array { foreach ( array_keys( $this->engines ) as $name ) { $this->resolve_integration( $name ); } return $this->integrations; } /** * @return array */ public function get_choices(): array { $choices = array(); foreach ( $this->engines as $engine ) { $choices[ $engine->get_name() ] = $engine->get_label(); } return $choices; } protected function make_renderer( string $name ): ?Template_Renderer { if ( key_exists( $name, $this->engines ) ) { $renderer = $this->engines[ $name ]->create_renderer( $this->render_folder ); // not every file renderer is guaranteed to be available (e.g. Blade requires PHP >= 8.2.0). $is_available = ! ( $renderer instanceof File_Template_Renderer_Base ) || $renderer->is_available(); if ( $is_available ) { return $renderer; } } return null; } }