mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Math
synced 2024-11-25 07:56:58 +00:00
27ce24e736
The PNG fallback for old IE versions worked only if the PNG image was already stored in the database. This change enables the Specialpage that displays the PNG images to create new PNG images and to show them directly. To test this commit you need an old IE version (IE<9). If you don't have access you can use an online service such as http://netrenderer.com. Change-Id: I74163da94e2d7a2f07d78bfe0f5ce134564ba97f
127 lines
4.1 KiB
PHP
127 lines
4.1 KiB
PHP
<?php
|
|
/**
|
|
* Description of SpecialMathShowSVG
|
|
*
|
|
* @author Moritz Schubotz (Physikerwelt)
|
|
*/
|
|
class SpecialMathShowImage extends SpecialPage {
|
|
private $noRender = false;
|
|
private $renderer = null;
|
|
private $mode = false;
|
|
|
|
function __construct() {
|
|
parent::__construct(
|
|
'MathShowImage',
|
|
'', // Don't restrict
|
|
false // Don't show on Special:SpecialPages - it's not useful interactively
|
|
);
|
|
}
|
|
/**
|
|
* Sets headers - this should be called from the execute() method of all derived classes!
|
|
*/
|
|
function setHeaders( $success = true ) {
|
|
$out = $this->getOutput();
|
|
$request = $this->getRequest();
|
|
$out->setArticleBodyOnly( true );
|
|
$out->setArticleRelated( false );
|
|
$out->setRobotPolicy( "noindex,nofollow" );
|
|
$out->disable();
|
|
if ( $success && $this->mode == MW_MATH_PNG ) {
|
|
$request->response()->header( "Content-type: image/png;" );
|
|
} else {
|
|
$request->response()->header( "Content-type: image/svg+xml; charset=utf-8" );
|
|
}
|
|
if ( $success && !( $this->noRender ) ) {
|
|
$request->response()->header( 'Cache-Control: public max-age=2419200' ); // 4 weeks
|
|
$request->response()->header( 'Vary: User-Agent' );
|
|
}
|
|
}
|
|
|
|
function execute( $par ) {
|
|
$request = $this->getRequest();
|
|
$hash = $request->getText( 'hash', '' );
|
|
$tex = $request->getText( 'tex', '');
|
|
$asciimath = $request->getText( 'asciimath', '');
|
|
$this->mode = $request->getInt( 'mode', MW_MATH_MATHML );
|
|
if ( $hash === '' && $tex === '' && $asciimath === '' ) {
|
|
$this->setHeaders( false );
|
|
echo $this->printSvgError( 'No Inputhash specified' );
|
|
} else {
|
|
if ( $tex === '' && $asciimath === ''){
|
|
switch ( $this->mode ) {
|
|
case MW_MATH_PNG:
|
|
$this->renderer = MathTexvc::newFromMd5( $hash );
|
|
break;
|
|
case MW_MATH_LATEXML:
|
|
$this->renderer = MathLaTeXML::newFromMd5( $hash );
|
|
break;
|
|
default:
|
|
$this->renderer = MathMathML::newFromMd5( $hash );
|
|
}
|
|
$this->noRender = $request->getBool( 'noRender', false );
|
|
$isInDatabase = $this->renderer->readFromDatabase();
|
|
if ( $isInDatabase || $this->noRender ) {
|
|
$success = $isInDatabase;
|
|
} else {
|
|
if ( $this->mode == MW_MATH_PNG ) {
|
|
// get the texvc input from the mathoid database table
|
|
// and render the conventional way
|
|
$mmlRenderer = MathMathML::newFromMd5( $hash );
|
|
$mmlRenderer->readFromDatabase();
|
|
$this->renderer = MathRenderer::getRenderer( $mmlRenderer->getUserInputTex(), array(), MW_MATH_PNG );
|
|
$this->renderer->setMathStyle( $mmlRenderer->getMathStyle() );
|
|
}
|
|
$success = $this->renderer->render();
|
|
}
|
|
} elseif ( $asciimath === '' ) {
|
|
$this->renderer = MathRenderer::getRenderer( $tex , array(), $this->mode );
|
|
$success = $this->renderer->render();
|
|
} else {
|
|
$this->renderer = MathRenderer::getRenderer( $asciimath , array( 'type' => 'ascii' ), $this->mode );
|
|
$success = $this->renderer->render();
|
|
}
|
|
if ( $success ) {
|
|
if ( $this->mode == MW_MATH_PNG ) {
|
|
// Workaround for bugfix for Bug 56769
|
|
if ( !isset( $wgHooks['ParserAfterParse']['FlushMathBackend'] ) ) {
|
|
// saves the PNG-file
|
|
wfRunHooks('ParserAfterParse');
|
|
}
|
|
$output = $this->renderer->getPng();
|
|
} else {
|
|
$output = $this->renderer->getSvg();
|
|
}
|
|
} else {
|
|
// Error message in PNG not supported
|
|
$output = $this->printSvgError( $this->renderer->getLastError() );
|
|
}
|
|
if ( $output == "" ) {
|
|
$output = $this->printSvgError( 'No Output produced' );
|
|
$success = false;
|
|
}
|
|
$this->setHeaders( $success );
|
|
echo $output;
|
|
if ( $success ){
|
|
$this->renderer->writeCache();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints the specified error message as svg.
|
|
* @param string $msg error message
|
|
* @return xml svg image with the error message
|
|
*/
|
|
private function printSvgError( $msg ) {
|
|
global $wgMathDebug;
|
|
$result = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 4"
|
|
preserveAspectRatio="xMidYMid meet" >' .
|
|
'<text text-anchor="start" fill="red" y="2">' . htmlspecialchars( $msg ) . '</text></svg>';
|
|
if ( $wgMathDebug ) {
|
|
$result .= '<!--'. var_export($this->renderer, true) .'-->';
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
}
|