X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FRenderer.php;h=24f00341733530a24d097a1a1bf01f00049bda94;hb=0d1fa70e2ecb372d158871285e0cda5f6d77194a;hp=2c0cb55173e690a53532311d7d15abeb24693974;hpb=f6c86649c2f35ed41e374281756596d95bc384eb;p=friendica.git diff --git a/src/Core/Renderer.php b/src/Core/Renderer.php index 2c0cb55173..24f0034173 100644 --- a/src/Core/Renderer.php +++ b/src/Core/Renderer.php @@ -1,71 +1,236 @@ . + * */ namespace Friendica\Core; -use Friendica\BaseObject; -use Friendica\Core\System; -use Friendica\Render\FriendicaSmarty; +use Exception; +use Friendica\DI; +use Friendica\Network\HTTPException\InternalServerErrorException; +use Friendica\Render\TemplateEngine; /** - * @brief This class handles Renderer related functions. + * This class handles Renderer related functions. */ -class Renderer extends BaseObject +class Renderer { - /** - * @brief This is our template processor - * - * @param string|FriendicaSmarty $s The string requiring macro substitution or an instance of FriendicaSmarty - * @param array $r key value pairs (search => replace) - * - * @return string substituted string - */ - public static function replaceMacros($s, $r) - { - $stamp1 = microtime(true); - $a = self::getApp(); - - // pass $baseurl to all templates - $r['$baseurl'] = System::baseUrl(); - $t = $a->getTemplateEngine(); - - try { - $output = $t->replaceMacros($s, $r); - } catch (Exception $e) { - echo "
" . __FUNCTION__ . ": " . $e->getMessage() . ""; - killme(); - } - - $a->saveTimestamp($stamp1, "rendering"); - - return $output; - } - - /** - * @brief Load a given template $s - * - * @param string $s Template to load. - * @param string $root Optional. - * - * @return string template. - */ - public static function getMarkupTemplate($s, $root = '') - { - $stamp1 = microtime(true); - $a = self::getApp(); - $t = $a->getTemplateEngine(); - - try { - $template = $t->getTemplateFile($s, $root); - } catch (Exception $e) { - echo "
" . __FUNCTION__ . ": " . $e->getMessage() . ""; - killme(); - } - - $a->saveTimestamp($stamp1, "file"); - - return $template; - } + /** + * An array of registered template engines ('name'=>'class name') + */ + public static $template_engines = []; + + /** + * An array of instanced template engines ('name'=>'instance') + */ + public static $template_engine_instance = []; + + /** + * An array for all theme-controllable parameters + * + * Mostly unimplemented yet. Only options 'template_engine' and + * beyond are used. + */ + public static $theme = [ + 'sourcename' => '', + 'videowidth' => 425, + 'videoheight' => 350, + 'force_max_items' => 0, + 'stylesheet' => '', + 'template_engine' => 'smarty3', + ]; + + private static $ldelim = [ + 'internal' => '', + 'smarty3' => '{{' + ]; + private static $rdelim = [ + 'internal' => '', + 'smarty3' => '}}' + ]; + + /** + * Returns the rendered template output from the template string and variables + * + * @param string $template + * @param array $vars + * @return string + * @throws InternalServerErrorException + */ + public static function replaceMacros(string $template, array $vars = []) + { + $stamp1 = microtime(true); + + // pass $baseurl to all templates if it isn't set + $vars = array_merge(['$baseurl' => DI::baseUrl()->get(), '$APP' => DI::app()], $vars); + + $t = self::getTemplateEngine(); + + try { + $output = $t->replaceMacros($template, $vars); + } catch (Exception $e) { + DI::logger()->critical($e->getMessage(), ['template' => $template, 'vars' => $vars]); + $message = is_site_admin() ? + $e->getMessage() : + DI::l10n()->t('Friendica can\'t display this page at the moment, please contact the administrator.'); + throw new InternalServerErrorException($message); + } + + DI::profiler()->saveTimestamp($stamp1, "rendering"); + + return $output; + } + + /** + * Load a given template $s + * + * @param string $file Template to load. + * @param string $subDir Subdirectory (Optional) + * + * @return string template. + * @throws InternalServerErrorException + */ + public static function getMarkupTemplate($file, $subDir = '') + { + $stamp1 = microtime(true); + $t = self::getTemplateEngine(); + + try { + $template = $t->getTemplateFile($file, $subDir); + } catch (Exception $e) { + DI::logger()->critical($e->getMessage(), ['file' => $file, 'subDir' => $subDir]); + $message = is_site_admin() ? + $e->getMessage() : + DI::l10n()->t('Friendica can\'t display this page at the moment, please contact the administrator.'); + throw new InternalServerErrorException($message); + } + + DI::profiler()->saveTimestamp($stamp1, "file"); + + return $template; + } + + /** + * Register template engine class + * + * @param string $class + * @throws InternalServerErrorException + */ + public static function registerTemplateEngine($class) + { + $v = get_class_vars($class); + + if (!empty($v['name'])) { + $name = $v['name']; + self::$template_engines[$name] = $class; + } else { + $admin_message = DI::l10n()->t('template engine cannot be registered without a name.'); + DI::logger()->critical($admin_message, ['class' => $class]); + $message = is_site_admin() ? + $admin_message : + DI::l10n()->t('Friendica can\'t display this page at the moment, please contact the administrator.'); + throw new InternalServerErrorException($message); + } + } + + /** + * Return template engine instance. + * + * If $name is not defined, return engine defined by theme, + * or default + * + * @return TemplateEngine Template Engine instance + * @throws InternalServerErrorException + */ + public static function getTemplateEngine() + { + $template_engine = (self::$theme['template_engine'] ?? '') ?: 'smarty3'; + + if (isset(self::$template_engines[$template_engine])) { + if (isset(self::$template_engine_instance[$template_engine])) { + return self::$template_engine_instance[$template_engine]; + } else { + $a = DI::app(); + $class = self::$template_engines[$template_engine]; + $obj = new $class($a->getCurrentTheme(), $a->theme_info); + self::$template_engine_instance[$template_engine] = $obj; + return $obj; + } + } + + $admin_message = DI::l10n()->t('template engine is not registered!'); + DI::logger()->critical($admin_message, ['template_engine' => $template_engine]); + $message = is_site_admin() ? + $admin_message : + DI::l10n()->t('Friendica can\'t display this page at the moment, please contact the administrator.'); + throw new InternalServerErrorException($message); + } + + /** + * Returns the active template engine. + * + * @return string the active template engine + */ + public static function getActiveTemplateEngine() + { + return self::$theme['template_engine']; + } + + /** + * sets the active template engine + * + * @param string $engine the template engine (default is Smarty3) + */ + public static function setActiveTemplateEngine($engine = 'smarty3') + { + self::$theme['template_engine'] = $engine; + } + + /** + * Gets the right delimiter for a template engine + * + * Currently: + * Internal = '' + * Smarty3 = '{{' + * + * @param string $engine The template engine (default is Smarty3) + * + * @return string the right delimiter + */ + public static function getTemplateLeftDelimiter($engine = 'smarty3') + { + return self::$ldelim[$engine]; + } + + /** + * Gets the left delimiter for a template engine + * + * Currently: + * Internal = '' + * Smarty3 = '}}' + * + * @param string $engine The template engine (default is Smarty3) + * + * @return string the left delimiter + */ + public static function getTemplateRightDelimiter($engine = 'smarty3') + { + return self::$rdelim[$engine]; + } }