2018-10-31 10:03:42 -04:00
< ? php
/**
2020-02-09 09:45:36 -05:00
* @ copyright Copyright ( C ) 2020 , Friendica
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
2018-10-31 10:03:42 -04:00
*/
namespace Friendica\Core ;
2018-10-31 10:35:50 -04:00
use Exception ;
2019-12-15 16:34:11 -05:00
use Friendica\DI ;
2020-05-18 01:21:58 -04:00
use Friendica\Network\HTTPException\InternalServerErrorException ;
2020-05-18 01:18:41 -04:00
use Friendica\Render\TemplateEngine ;
2018-10-31 10:03:42 -04:00
/**
2020-01-19 01:05:23 -05:00
* This class handles Renderer related functions .
2018-10-31 10:03:42 -04:00
*/
2019-12-15 17:28:01 -05:00
class Renderer
2018-10-31 10:03:42 -04:00
{
2019-04-14 08:05:48 -04:00
/**
2020-01-19 01:05:23 -05:00
* An array of registered template engines ( 'name' => 'class name' )
2018-10-31 13:25:38 -04:00
*/
2019-04-14 08:05:48 -04:00
public static $template_engines = [];
2018-10-31 13:25:38 -04:00
2019-04-14 08:05:48 -04:00
/**
2020-01-19 01:05:23 -05:00
* An array of instanced template engines ( 'name' => 'instance' )
2018-10-31 13:25:38 -04:00
*/
public static $template_engine_instance = [];
2019-04-14 08:05:48 -04:00
/**
2020-01-19 01:05:23 -05:00
* An array for all theme - controllable parameters
2018-10-31 13:25:38 -04:00
*
* 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' ,
];
2019-04-14 08:05:48 -04:00
private static $ldelim = [
2018-10-31 12:12:15 -04:00
'internal' => '' ,
'smarty3' => '{{'
];
private static $rdelim = [
'internal' => '' ,
'smarty3' => '}}'
2019-04-14 08:05:48 -04:00
];
2018-12-13 22:30:43 -05:00
/**
2020-05-18 01:18:41 -04:00
* Returns the rendered template output from the template string and variables
2018-12-13 22:30:43 -05:00
*
2020-05-18 01:18:41 -04:00
* @ param string $template
* @ param array $vars
* @ return string
2020-05-18 01:21:58 -04:00
* @ throws InternalServerErrorException
2018-12-13 22:30:43 -05:00
*/
2020-05-18 10:01:51 -04:00
public static function replaceMacros ( string $template , array $vars = [])
2019-04-14 08:05:48 -04:00
{
$stamp1 = microtime ( true );
2018-10-31 10:03:42 -04:00
2019-04-27 22:18:30 -04:00
// pass $baseurl to all templates if it isn't set
2020-05-18 01:18:41 -04:00
$vars = array_merge ([ '$baseurl' => DI :: baseUrl () -> get (), '$APP' => DI :: app ()], $vars );
2019-04-27 22:18:30 -04:00
2019-04-14 08:05:48 -04:00
$t = self :: getTemplateEngine ();
2018-10-31 10:03:42 -04:00
2019-04-14 08:05:48 -04:00
try {
2020-05-18 01:18:41 -04:00
$output = $t -> replaceMacros ( $template , $vars );
2019-04-14 08:05:48 -04:00
} catch ( Exception $e ) {
2020-05-18 01:21:58 -04:00
DI :: logger () -> critical ( $e -> getMessage (), [ 'template' => $template , 'vars' => $vars ]);
throw new InternalServerErrorException ( DI :: l10n () -> t ( 'Friendica can\'t display this page at the moment, please contact the administrator or check the Friendica log for errors.' ));
2019-04-14 08:05:48 -04:00
}
2018-10-31 10:03:42 -04:00
2019-12-15 17:50:35 -05:00
DI :: profiler () -> saveTimestamp ( $stamp1 , " rendering " , System :: callstack ());
2018-10-31 10:03:42 -04:00
2019-04-14 08:05:48 -04:00
return $output ;
}
2018-10-31 10:03:42 -04:00
2019-01-06 16:06:53 -05:00
/**
2020-01-19 01:05:23 -05:00
* Load a given template $s
2019-01-06 16:06:53 -05:00
*
2020-05-18 01:18:41 -04:00
* @ param string $file Template to load .
2020-04-26 09:45:25 -04:00
* @ param string $subDir Subdirectory ( Optional )
2019-01-06 16:06:53 -05:00
*
* @ return string template .
2020-05-18 01:21:58 -04:00
* @ throws InternalServerErrorException
2019-01-06 16:06:53 -05:00
*/
2020-05-18 01:18:41 -04:00
public static function getMarkupTemplate ( $file , $subDir = '' )
2019-04-14 08:05:48 -04:00
{
$stamp1 = microtime ( true );
$t = self :: getTemplateEngine ();
try {
2020-05-18 01:18:41 -04:00
$template = $t -> getTemplateFile ( $file , $subDir );
2019-04-14 08:05:48 -04:00
} catch ( Exception $e ) {
2020-05-18 01:21:58 -04:00
DI :: logger () -> critical ( $e -> getMessage (), [ 'file' => $file , 'subDir' => $subDir ]);
throw new InternalServerErrorException ( DI :: l10n () -> t ( 'Friendica can\'t display this page at the moment, please contact the administrator or check the Friendica log for errors.' ));
2019-04-14 08:05:48 -04:00
}
2018-10-31 10:03:42 -04:00
2019-12-15 17:50:35 -05:00
DI :: profiler () -> saveTimestamp ( $stamp1 , " file " , System :: callstack ());
2018-10-31 10:03:42 -04:00
2019-04-14 08:05:48 -04:00
return $template ;
}
2018-10-31 12:12:15 -04:00
2019-04-14 08:05:48 -04:00
/**
2020-01-19 01:05:23 -05:00
* Register template engine class
2018-10-31 13:25:38 -04:00
*
* @ param string $class
2020-05-18 01:21:58 -04:00
* @ throws InternalServerErrorException
2018-10-31 13:25:38 -04:00
*/
public static function registerTemplateEngine ( $class )
{
2019-04-14 08:05:48 -04:00
$v = get_class_vars ( $class );
2020-05-18 01:18:41 -04:00
if ( ! empty ( $v [ 'name' ])) {
2018-10-31 13:25:38 -04:00
$name = $v [ 'name' ];
self :: $template_engines [ $name ] = $class ;
} else {
2020-05-18 01:21:58 -04:00
DI :: logger () -> critical ( DI :: l10n () -> t ( 'template engine cannot be registered without a name.' ), [ 'class' => $class ]);
throw new InternalServerErrorException ( DI :: l10n () -> t ( 'Friendica can\'t display this page at the moment, please contact the administrator or check the Friendica log for errors.' ));
2018-10-31 13:25:38 -04:00
}
}
/**
2020-01-19 01:05:23 -05:00
* Return template engine instance .
2018-10-31 13:25:38 -04:00
*
* If $name is not defined , return engine defined by theme ,
* or default
*
2020-05-18 01:18:41 -04:00
* @ return TemplateEngine Template Engine instance
2020-05-18 01:21:58 -04:00
* @ throws InternalServerErrorException
2018-10-31 13:25:38 -04:00
*/
public static function getTemplateEngine ()
{
2019-10-16 08:35:14 -04:00
$template_engine = ( self :: $theme [ 'template_engine' ] ? ? '' ) ? : 'smarty3' ;
2018-10-31 13:25:38 -04:00
if ( isset ( self :: $template_engines [ $template_engine ])) {
if ( isset ( self :: $template_engine_instance [ $template_engine ])) {
return self :: $template_engine_instance [ $template_engine ];
} else {
2020-05-18 01:18:41 -04:00
$a = DI :: app ();
2018-10-31 13:25:38 -04:00
$class = self :: $template_engines [ $template_engine ];
2020-05-18 01:18:41 -04:00
$obj = new $class ( $a -> getCurrentTheme (), $a -> theme_info );
2018-10-31 13:25:38 -04:00
self :: $template_engine_instance [ $template_engine ] = $obj ;
return $obj ;
}
}
2020-05-18 01:21:58 -04:00
DI :: logger () -> critical ( DI :: l10n () -> t ( 'template engine is not registered!' ), [ 'template_engine' => $template_engine ]);
throw new InternalServerErrorException ( DI :: l10n () -> t ( 'Friendica can\'t display this page at the moment, please contact the administrator or check the Friendica log for errors.' ));
2019-04-14 08:05:48 -04:00
}
/**
2020-01-19 01:05:23 -05:00
* Returns the active template engine .
2018-10-31 13:25:38 -04:00
*
* @ 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 ;
}
2019-04-14 08:05:48 -04:00
/**
2018-10-31 12:12:15 -04:00
* 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 ];
}
2018-10-31 10:03:42 -04:00
}