Page MenuHomeWickedGov Phorge

MathLaTeXML.php
No OneTemporary

Size
5 KB
Referenced Files
None
Subscribers
None

MathLaTeXML.php

<?php
namespace MediaWiki\Extension\Math;
use MediaWiki\Extension\Math\Hooks\HookRunner;
use MediaWiki\Logger\LoggerFactory;
use MediaWiki\MediaWikiServices;
use StatusValue;
/**
* Contains the driver function for the LaTeXML daemon
*
* @copyright 2012 Moritz Schubotz
* @license GPL-2.0-or-later
*/
class MathLaTeXML extends MathMathML {
/** @var string[] */
protected $defaultAllowedRootElements = [ 'math', 'div', 'table', 'query' ];
/** @var string settings for LaTeXML daemon */
private $LaTeXMLSettings = '';
/** @inheritDoc */
public function __construct( $tex = '', $params = [], $cache = null ) {
global $wgMathLaTeXMLUrl;
parent::__construct( $tex, $params, $cache );
$this->host = $wgMathLaTeXMLUrl;
$this->setMode( MathConfig::MODE_LATEXML );
}
/**
* Converts an array with LaTeXML settings to a URL encoded String.
* If the argument is a string the input will be returned.
* Thus the function has projector properties and can be applied a second time safely.
* @param string|array $array
* @return string
*/
public function serializeSettings( $array ) {
if ( !is_array( $array ) ) {
return $array;
}
// removes the [1] [2]... for the unnamed subarrays since LaTeXML
// assigns multiple values to one key e.g.
// preload=amsmath.sty&preload=amsthm.sty&preload=amstext.sty
$cgi_string = wfArrayToCgi( $array );
$cgi_string = preg_replace( '|\%5B\d+\%5D|', '', $cgi_string );
$cgi_string = preg_replace( '|&\d+=|', '&', $cgi_string );
return $cgi_string;
}
/**
* Gets the settings for the LaTeXML daemon.
* @return string
*/
public function getLaTeXMLSettings() {
global $wgMathDefaultLaTeXMLSetting;
return $this->LaTeXMLSettings ?: $wgMathDefaultLaTeXMLSetting;
}
/**
* Sets the settings for the LaTeXML daemon.
* The settings affect only the current instance of the class.
* For a list of possible settings see:
* http://dlmf.nist.gov/LaTeXML/manual/commands/latexmlpost.xhtml
* An empty value indicates to use the default settings.
* @param string|array $settings
*/
public function setLaTeXMLSettings( $settings ) {
$this->LaTeXMLSettings = $settings;
}
/**
* Calculates the HTTP POST Data for the request. Depends on the settings
* and the input string only.
* @return string HTTP POST data
*/
public function getPostData() {
$tex = $this->getTex();
if ( $this->getMathStyle() == 'inlineDisplaystyle' ) {
// In 'inlineDisplaystyle' the old
// texvc behavior is reproduced:
// The equation is rendered in displaystyle
// (texvc used $$ $tex $$ to render)
// but the equation is not centered.
$tex = '{\displaystyle ' . $tex . '}';
}
$texcmd = rawurlencode( $tex );
$settings = $this->serializeSettings( $this->getLaTeXMLSettings() );
$postData = $settings . '&tex=' . $texcmd;
// There is an API-inconsistency between different versions of the LaTeXML daemon
// some versions require the literal prefix other don't allow it.
if ( !str_contains( $this->host, '/convert' ) ) {
$postData = preg_replace( '/&tex=/', '&tex=literal:', $postData, 1 );
}
LoggerFactory::getInstance( 'Math' )->debug( 'Get post data: ' . $postData );
return $postData;
}
/**
* Does the actual web request to convert TeX to MathML.
* @return StatusValue
*/
protected function doRender(): StatusValue {
if ( trim( $this->getTex() ) === '' ) {
LoggerFactory::getInstance( 'Math' )->warning(
'Rendering was requested, but no TeX string is specified.' );
return StatusValue::newFatal( 'math_empty_tex' );
}
$requestStatus = $this->makeRequest();
if ( $requestStatus->isGood() ) {
$jsonResult = json_decode( $requestStatus->getValue() );
if ( $jsonResult && json_last_error() === JSON_ERROR_NONE ) {
if ( $this->isValidMathML( $jsonResult->result ) ) {
$this->setMathml( $jsonResult->result );
// Avoid PHP 7.1 warning from passing $this by reference
$renderer = $this;
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )
->onMathRenderingResultRetrieved(
$renderer, $jsonResult
); // Enables debugging of server results
return StatusValue::newGood();
}
// Do not print bad mathml. It's probably too verbose and might
// mess up the browser output.
LoggerFactory::getInstance( 'Math' )
->warning( 'LaTeXML invalid MathML', [
'post' => $this->getPostData(),
'host' => $this->host,
'result' => $requestStatus->getValue()
] );
return StatusValue::newFatal( 'math_invalidxml', $this->getModeName(), $this->host );
}
LoggerFactory::getInstance( 'Math' )
->warning( 'LaTeXML invalid JSON', [
'post' => $this->getPostData(),
'host' => $this->host,
'res' => $requestStatus->getValue()
] );
return StatusValue::newFatal( $this->getError( 'math_invalidjson', $this->getModeName(), $this->host ) );
} else {
return $requestStatus;
}
}
public function getHtmlOutput( bool $svg = true ): string {
return parent::getHtmlOutput( false );
}
/**
* @return string
*/
protected function getMathTableName() {
return 'mathlatexml';
}
}
class_alias( MathLaTeXML::class, 'MathLaTeXML' );

File Metadata

Mime Type
text/x-php
Expires
Wed, Aug 19, 14:44 (3 w, 4 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
75/b4/6e96e52896464ff75635b7b4456d
Default Alt Text
MathLaTeXML.php (5 KB)

Event Timeline