PortableInfobox/includes/services/Helpers/PortableInfoboxTemplateEngine.php

112 lines
3.3 KiB
PHP
Raw Normal View History

<?php
namespace PortableInfobox\Helpers;
use MediaWiki\Logger\LoggerFactory;
2021-09-10 02:52:19 +00:00
use MediaWiki\MediaWikiServices;
2018-08-08 09:31:33 +00:00
class PortableInfoboxTemplateEngine {
2021-09-10 02:52:19 +00:00
private const CACHE_TTL = 86400;
private const TYPE_NOT_SUPPORTED_MESSAGE = 'portable-infobox-render-not-supported-type';
private static $cache = [];
2020-09-27 11:51:59 +00:00
private static $compileFlags;
private static $lightncandy;
2018-08-15 14:31:42 +00:00
private static $memcache;
protected static $templates = [
2018-08-08 09:31:33 +00:00
'wrapper' => 'PortableInfoboxWrapper.hbs',
'title' => 'PortableInfoboxItemTitle.hbs',
'header' => 'PortableInfoboxItemHeader.hbs',
2018-08-12 09:45:29 +00:00
'media' => 'PortableInfoboxItemMedia.hbs',
2018-08-08 09:31:33 +00:00
'data' => 'PortableInfoboxItemData.hbs',
'group' => 'PortableInfoboxItemGroup.hbs',
'smart-group' => 'PortableInfoboxItemSmartGroup.hbs',
'horizontal-group-content' => 'PortableInfoboxHorizontalGroupContent.hbs',
'navigation' => 'PortableInfoboxItemNavigation.hbs',
2018-08-12 09:45:29 +00:00
'media-collection' => 'PortableInfoboxItemMediaCollection.hbs',
2019-02-24 22:05:18 +00:00
'panel' => 'PortableInfoboxPanel.hbs',
'xml-parse-error' => 'PortableInfoboxMarkupDebug.hbs'
];
2018-08-13 14:31:50 +00:00
2018-08-15 14:31:42 +00:00
public function __construct() {
2020-09-27 11:51:59 +00:00
if ( !isset( self::$lightncandy ) ) {
2021-09-10 02:52:19 +00:00
self::$lightncandy = \LightnCandy\LightnCandy::class;
2020-09-29 16:56:06 +00:00
self::$compileFlags = self::$lightncandy::FLAG_BESTPERFORMANCE | self::$lightncandy::FLAG_PARENT | self::$lightncandy::FLAG_HANDLEBARS;
2020-09-27 11:51:59 +00:00
}
2018-08-16 09:25:53 +00:00
if ( !isset( self::$memcache ) ) {
self::$memcache = MediaWikiServices::getInstance()->getMainWANObjectCache();
2018-08-15 14:31:42 +00:00
}
}
public static function getTemplatesDir() {
2018-08-16 09:25:53 +00:00
return __DIR__ . '/../../../templates';
}
public static function getTemplates() {
return self::$templates;
}
public function render( $type, array $data ) {
global $wgPortableInfoboxUseHeadings;
$data['useHeadings'] = $wgPortableInfoboxUseHeadings;
$renderer = $this->getRenderer( $type );
return $renderer( $data );
}
/**
* Returns a template renderer
*
2018-08-16 09:25:53 +00:00
* @param string $type Template type
2021-09-10 02:52:19 +00:00
* @return \Closure
*/
public function getRenderer( $type ) {
global $wgPortableInfoboxCacheRenderers;
if ( empty( self::$cache[$type] ) ) {
$path = self::getTemplatesDir() . DIRECTORY_SEPARATOR . static::getTemplates()[$type];
if ( $wgPortableInfoboxCacheRenderers ) {
$cachekey = self::$memcache->makeKey(
__CLASS__, \PortableInfoboxParserTagController::PARSER_TAG_VERSION, $type
);
$template = self::$memcache->getWithSetCallback(
2021-09-10 02:52:19 +00:00
$cachekey, self::CACHE_TTL, static function () use ( $path ) {
// @see https://github.com/wikimedia/mediawiki-vendor/tree/master/zordius/lightncandy
2020-09-27 11:51:59 +00:00
return self::$lightncandy::compile( file_get_contents( $path ), [
'flags' => self::$compileFlags
] );
}
);
} else {
2020-09-27 11:51:59 +00:00
$template = self::$lightncandy::compile( file_get_contents( $path ), [
'flags' => self::$compileFlags
2018-08-15 14:31:42 +00:00
] );
}
2020-09-27 11:51:59 +00:00
self::$cache[$type] = self::$lightncandy::prepare( $template );
}
return self::$cache[$type];
}
/**
* check if item type is supported and logs unsupported types
*
* @param string $type - template type
*
* @return bool
*/
public static function isSupportedType( $type ) {
2018-08-16 09:25:53 +00:00
$result = isset( static::getTemplates()[$type] );
if ( !$result ) {
LoggerFactory::getInstance( 'PortableInfobox' )->info(
self::TYPE_NOT_SUPPORTED_MESSAGE, [ 'type' => $type ]
);
}
return $result;
}
}