mediawiki-extensions-Math/src/Render/RendererFactory.php
Moritz Schubotz (physikerwelt) 9236575a1a Remove explicit DB access
* Uses BagOfStuff caching instead of custom-made DB cache
* By configuring the BagOfStuff cache in a way that
  it writes to the database no performance implications are expected
* For WMF-use this should have no effect since restbase
  is used to cache stuff
* Replaces Ib2c216f54e6817ee2c3be0355ba72bd4769ba6ea

Bug: T349442
Change-Id: I1ce8ad9cf4c1a9ae71f447e4e067b39ee2601640
2024-01-11 15:57:02 +00:00

135 lines
3.7 KiB
PHP

<?php
namespace MediaWiki\Extension\Math\Render;
use InvalidArgumentException;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\Extension\Math\MathConfig;
use MediaWiki\Extension\Math\MathLaTeXML;
use MediaWiki\Extension\Math\MathMathML;
use MediaWiki\Extension\Math\MathMathMLCli;
use MediaWiki\Extension\Math\MathNativeMML;
use MediaWiki\Extension\Math\MathRenderer;
use MediaWiki\Extension\Math\MathSource;
use MediaWiki\User\Options\UserOptionsLookup;
use Psr\Log\LoggerInterface;
use WANObjectCache;
class RendererFactory {
/** @var string[] */
public const CONSTRUCTOR_OPTIONS = [
'MathoidCli',
'MathEnableExperimentalInputFormats',
'MathValidModes',
];
/** @var ServiceOptions */
private $options;
/** @var UserOptionsLookup */
private $userOptionsLookup;
/** @var MathConfig */
private $mathConfig;
/** @var LoggerInterface */
private $logger;
private WANObjectCache $cache;
/**
* @param ServiceOptions $serviceOptions
* @param MathConfig $mathConfig
* @param UserOptionsLookup $userOptionsLookup
* @param LoggerInterface $logger
* @param WANObjectCache $cache
*/
public function __construct(
ServiceOptions $serviceOptions,
MathConfig $mathConfig,
UserOptionsLookup $userOptionsLookup,
LoggerInterface $logger,
WANObjectCache $cache
) {
$serviceOptions->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS );
$this->options = $serviceOptions;
$this->mathConfig = $mathConfig;
$this->userOptionsLookup = $userOptionsLookup;
$this->logger = $logger;
$this->cache = $cache;
}
/**
* Factory method for getting a renderer based on mode
*
* @param string $tex LaTeX markup
* @param array $params HTML attributes
* @param string $mode indicating rendering mode, one of MathConfig::MODE_*
* @return MathRenderer appropriate renderer for mode
*/
public function getRenderer(
string $tex,
array $params = [],
string $mode = MathConfig::MODE_MATHML
): MathRenderer {
if ( isset( $params['forcemathmode'] ) ) {
$mode = $params['forcemathmode'];
}
if ( !in_array( $mode, $this->mathConfig->getValidRenderingModes(), true ) ) {
$mode = $this->userOptionsLookup->getDefaultOption( 'math' );
}
if ( $this->options->get( 'MathEnableExperimentalInputFormats' ) === true &&
$mode == MathConfig::MODE_MATHML &&
isset( $params['type'] )
) {
// Support of MathML input (experimental)
// Currently support for mode 'mathml' only
if ( !in_array( $params['type'], [ 'pmml', 'ascii' ], true ) ) {
unset( $params['type'] );
}
}
if ( isset( $params['chem'] ) ) {
$mode = ( $mode == MathConfig::MODE_NATIVE_MML ) ? MathConfig::MODE_NATIVE_MML : MathConfig::MODE_MATHML;
$params['type'] = 'chem';
}
switch ( $mode ) {
case MathConfig::MODE_SOURCE:
$renderer = new MathSource( $tex, $params );
break;
case MathConfig::MODE_NATIVE_MML:
$renderer = new MathNativeMML( $tex, $params, $this->cache );
break;
case MathConfig::MODE_LATEXML:
$renderer = new MathLaTeXML( $tex, $params, $this->cache );
break;
case MathConfig::MODE_MATHML:
default:
if ( $this->options->get( 'MathoidCli' ) ) {
$renderer = new MathMathMLCli( $tex, $params, $this->cache );
} else {
$renderer = new MathMathML( $tex, $params, $this->cache );
}
}
$this->logger->debug(
'Start rendering "{tex}" in mode {mode}',
[
'tex' => $tex,
'mode' => $mode
]
);
return $renderer;
}
public function getFromHash( $hash ) {
$rpage = $this->cache->get( $hash );
if ( $rpage === false ) {
throw new InvalidArgumentException( 'Cache key is invalid' );
}
$mode = $rpage['math_mode'];
$renderer = $this->getRenderer( '', [], $mode );
$renderer->initializeFromCache( $rpage );
return $renderer;
}
}