diff --git a/HISTORY b/HISTORY index 7b064ce..4cabf7f 100644 --- a/HISTORY +++ b/HISTORY @@ -7,5 +7,5 @@ Change notes from older releases. For current info see RELEASE-NOTES-3.0.0. * $wgLaTeXMLTimeout was renamed to $wgMathLaTeXMLTimeout * $wgMathValidModes is introduced: It determines the selectable math rendering modes MW_MATH_(PNG|MATHML|...) in user preferences. -* $wgUseLaTeXML becomes unnecessary use $wgMathValidModes[] = MW_MATH_LATEXML; +* $wgUseLaTeXML becomes unnecessary use $wgMathValidModes[] = 'latexml'; to enable the LaTeXML rendering mode. diff --git a/Math.hooks.php b/Math.hooks.php index 16a14b3..f21030c 100644 --- a/Math.hooks.php +++ b/Math.hooks.php @@ -11,6 +11,88 @@ use MediaWiki\Logger\LoggerFactory; class MathHooks { const mathCacheKey = 'math='; + public static function mathConstantToString( $value, array $defs, $prefix, $default ){ + foreach ( $defs as $defKey => $defValue ) { + if( !defined( $defKey ) ) { + define( $defKey, $defValue ); + } elseif ( $defValue !== constant( $defKey ) ) { + throw new Exception( 'Math constant "'. $defKey . '" has unexpected value "' . + constant( $defKey ) . '" instead of "' . $defValue ); + } + } + $invDefs = array_flip( $defs ); + if ( is_int( $value ) ){ + if ( array_key_exists( $value , $invDefs ) ) { + $value = $invDefs[$value]; + } else { + return $default; + } + } + if ( is_string( $value ) ){ + $newValues = array(); + foreach ( $defs as $k => $v ) { + $newValues[$k] = preg_replace_callback( '/_(.)/', function ( $matches ) { + return strtoupper( $matches[1] ); + }, strtolower( substr( $k, strlen( $prefix ) ) ) ); + } + if ( array_key_exists( $value, $defs ) ) { + return $newValues[$value]; + } elseif (in_array( $value, $newValues) ){ + return $value; + } + } + return $default; + } + + public static function mathStyleToString( $style, $default = 'inlineDisplaystyle' ) { + $defs = array ( + 'MW_MATHSTYLE_INLINE_DISPLAYSTYLE' => 0, // default large operator inline + 'MW_MATHSTYLE_DISPLAY' => 1, // large operators centered in a new line + 'MW_MATHSTYLE_INLINE' => 2, // small operators inline + ); + return self::mathConstantToString( $style, $defs, $prefix = 'MW_MATHSTYLE_', $default ); + } + + public static function mathCheckToString( $style, $default = 'always' ) { + $defs = array ( + 'MW_MATH_CHECK_ALWAYS' => 0, + 'MW_MATH_CHECK_NEVER' => 1, + 'MW_MATH_CHECK_NEW' => 2, + ); + return self::mathConstantToString( $style, $defs, $prefix = 'MW_MATH_CHECK_', $default ); + } + + public static function mathModeToString( $mode, $default = 'png' ) { +// The following deprecated modes have been removed: +// 'MW_MATH_SIMPLE' => 1 +// 'MW_MATH_HTML' => 2 +// 'MW_MATH_MODERN' => 4 +// 'MW_MATH_MATHJAX' => 6 +// 'MW_MATH_LATEXML_JAX' => 8 + + $defs = array ( + 'MW_MATH_PNG' => 0, + 'MW_MATH_SOURCE' => 3, + 'MW_MATH_MATHML' => 5, + 'MW_MATH_LATEXML'=> 7 ); + + return self::mathConstantToString( $mode, $defs, $prefix = 'MW_MATH_', $default ); + } + + public static function mathModeToHashKey( $mode, $default = 0 ) { + $defs = array ( + 'png' => 0, + 'source' => 3, + 'mathml' => 5, + 'latexml'=> 7 ); + + if ( array_key_exists( $mode, $defs ) ){ + return $defs[$mode]; + } else { + return $default; + } + } + /* * Generate a user dependent hash cache key. * The hash key depends on the rendering mode. @@ -28,7 +110,8 @@ class MathHooks { $user = $wgUser; } - $mathOption = $user->getOption( 'math' ); + $mathString = self::mathModeToString( $user->getOption( 'math' ) ); + $mathOption = self::mathModeToHashKey( $mathString, 0 ); // Check if the key already contains the math option part if ( !preg_match( @@ -98,8 +181,7 @@ class MathHooks { return ''; } - $mode = (int)$parser->getUser()->getOption( 'math' ); - + $mode = self::mathModeToString( $parser->getUser()->getOption( 'math' ) ); // Indicate that this page uses math. // This affects the page caching behavior. if ( is_callable( 'ParserOptions::getMath' ) ) { @@ -128,7 +210,7 @@ class MathHooks { Hooks::run( 'MathFormulaPostRender', array( $parser, &$renderer, &$renderedMath ) );// Enables indexing of math formula $parser->getOutput()->addModuleStyles( array( 'ext.math.styles' ) ); - if ( $mode == MW_MATH_MATHML ) { + if ( $mode == 'mathml' ) { $parser->getOutput()->addModuleStyles( array( 'ext.math.desktop.styles' ) ); $parser->getOutput()->addModules( array( 'ext.math.scripts' ) ); } @@ -146,7 +228,7 @@ class MathHooks { * @return Boolean: true */ static function onGetPreferences( $user, &$defaultPreferences ) { - global $wgMathValidModes, $wgDefaultUserOptions; + global $wgDefaultUserOptions; $defaultPreferences['math'] = array( 'type' => 'radio', 'options' => array_flip( self::getMathNames() ), @@ -155,12 +237,14 @@ class MathHooks { ); // If the default option is not in the valid options the // user interface throws an exception (BUG 64844) - if ( ! in_array( $wgDefaultUserOptions['math'] , $wgMathValidModes ) ) { + $mode = MathHooks::mathModeToString( $wgDefaultUserOptions['math'] ); + if ( ! in_array( $mode , MathRenderer::getValidModes() ) ) { LoggerFactory::getInstance( 'Math' )->error( 'Misconfiguration: '. - "\$wgDefaultUserOptions['math'] is not in \$wgMathValidModes.\n". + "\$wgDefaultUserOptions['math'] is not in " . MathRenderer::getValidModes() . ".\n". "Please check your LocalSetting.php file." ); // Display the checkbox in the first option. - $wgDefaultUserOptions['math'] = $wgMathValidModes[0]; + $validModes = MathRenderer::getValidModes(); + $wgDefaultUserOptions['math'] = $validModes[0]; } return true; } @@ -171,18 +255,9 @@ class MathHooks { * @return array of strings */ public static function getMathNames() { - global $wgMathValidModes; - $MathConstantNames = array( - MW_MATH_SOURCE => 'mw_math_source', - MW_MATH_PNG => 'mw_math_png', - MW_MATH_MATHML => 'mw_math_mathml', - MW_MATH_LATEXML => 'mw_math_latexml', - MW_MATH_LATEXML_JAX => 'mw_math_latexml_jax', - MW_MATH_MATHJAX => 'mw_math_mathjax' - ); $names = array(); - foreach ( $wgMathValidModes as $mode ) { - $names[$mode] = wfMessage( $MathConstantNames[$mode] )->escaped(); + foreach ( MathRenderer::getValidModes() as $mode ) { + $names[ $mode ] = wfMessage( 'mw_math_' . $mode )->escaped(); } return $names; @@ -198,7 +273,7 @@ class MathHooks { global $wgUser; # Don't generate TeX PNGs (the lack of a sensible current directory causes errors anyway) - $wgUser->setOption( 'math', MW_MATH_SOURCE ); + $wgUser->setOption( 'math', 'source' ); return true; } @@ -211,7 +286,7 @@ class MathHooks { * @return bool */ static function onLoadExtensionSchemaUpdates( $updater = null ) { - global $wgMathValidModes; + if ( is_null( $updater ) ) { throw new Exception( 'Math extension is only necessary in 1.18 or above' ); } @@ -225,7 +300,7 @@ class MathHooks { } $sql = __DIR__ . '/db/math.' . $type . '.sql'; $updater->addExtensionTable( 'math', $sql ); - if ( in_array( MW_MATH_LATEXML, $wgMathValidModes ) ) { + if ( in_array( 'latexml', MathRenderer::getValidModes() ) ) { if ( in_array( $type, array( 'mysql', 'sqlite', 'postgres' ) ) ) { $sql = __DIR__ . '/db/mathlatexml.' . $type . '.sql'; $updater->addExtensionTable( 'mathlatexml', $sql ); @@ -237,7 +312,7 @@ class MathHooks { throw new Exception( "Math extension does not currently support $type database for LaTeXML." ); } } - if ( in_array( MW_MATH_MATHML, $wgMathValidModes ) ) { + if ( in_array( 'mathml', MathRenderer::getValidModes() ) ) { if ( in_array( $type, array( 'mysql', 'sqlite', 'postgres' ) ) ) { $sql = __DIR__ . '/db/mathoid.' . $type . '.sql'; $updater->addExtensionTable( 'mathoid', $sql ); @@ -284,4 +359,14 @@ class MathHooks { global $wgOut; $wgOut->addModules( array( 'ext.math.editbutton.enabler' ) ); } + + public static function registerExtension() { + global $wgDefaultUserOptions, $wgMathValidModes, $wgMathDisableTexFilter; + $wgMathValidModes = MathRenderer::getValidModes(); + if ( $wgMathDisableTexFilter == true ){ //ensure backwards compatibility + $wgMathDisableTexFilter = 1; + } + $wgMathDisableTexFilter = MathRenderer::getDisableTexFilter(); + $wgDefaultUserOptions['math'] = self::mathModeToString( $wgDefaultUserOptions['math'] ); + } } diff --git a/Math.php b/Math.php index 2b467e5..0b82fdd 100644 --- a/Math.php +++ b/Math.php @@ -1,300 +1,15 @@ __FILE__, - 'name' => 'Math', - 'version' => '2.0.0', - 'author' => array( - 'Tomasz Wegrzanowski', - 'Brion Vibber', - 'Moritz Schubotz', - 'Derk-Jan Hartman', - ), - 'descriptionmsg' => 'math-desc', - 'url' => 'https://www.mediawiki.org/wiki/Extension:Math', -); - -/**@{ - * Maths constants - */ -define( 'MW_MATH_PNG', 0 ); -define( 'MW_MATH_SIMPLE', 1 ); /// @deprecated -define( 'MW_MATH_HTML', 2 ); /// @deprecated -define( 'MW_MATH_SOURCE', 3 ); -define( 'MW_MATH_MODERN', 4 ); /// @deprecated -define( 'MW_MATH_MATHML', 5 ); -define( 'MW_MATH_MATHJAX', 6 ); /// @deprecated -define( 'MW_MATH_LATEXML', 7 ); /// new in 1.22 -define( 'MW_MATH_LATEXML_JAX', 8 ); /// new in 1.22 -/**@}*/ - -/**@{ - * Mathstyle constants - */ -define( 'MW_MATHSTYLE_INLINE_DISPLAYSTYLE', 0 ); //default large operator inline -define( 'MW_MATHSTYLE_DISPLAY', 1 ); // large operators centered in a new line -define( 'MW_MATHSTYLE_INLINE', 2 ); // small operators inline -// There is no style which renders small operators -// but display the equation centered in a new line. -/**@}*/ - -/**@var array defines the mode allowed on the server */ -$wgMathValidModes = array( MW_MATH_PNG, MW_MATH_SOURCE, MW_MATH_MATHML ); - -/* - * The default rendering mode for anonymous users. - * Valid options are defined in $wgMathValidModes. - */ -$wgDefaultUserOptions['math'] = MW_MATH_PNG; - -/** Location of the texvc binary */ -$wgTexvc = __DIR__ . '/math/texvc'; -/** - * Texvc background color - * use LaTeX color format as used in \special function - * for transparent background use value 'Transparent' for alpha transparency or - * 'transparent' for binary transparency. - */ -$wgTexvcBackgroundColor = 'transparent'; - -/** - * Normally when generating math images, we double-check that the - * directories we want to write to exist, and that files that have - * been generated still exist when we need to bring them up again. - * - * This lets us give useful error messages in case of permission - * problems, and automatically rebuild images that have been lost. - * - * On a big site with heavy NFS traffic this can be slow and flaky, - * so sometimes we want to short-circuit it by setting this to false. - */ -$wgMathCheckFiles = true; - -/** - * The URL path of the math directory. Defaults to "{$wgUploadPath}/math". - * - * See http://www.mediawiki.org/wiki/Manual:Enable_TeX for details about how to - * set up mathematical formula display. - */ -$wgMathPath = false; - -/** - * The name of a file backend ($wgFileBackends) to use for storing math renderings. - * Defaults to FSFileBackend using $wgMathDirectory as a base path. - * - * See http://www.mediawiki.org/wiki/Manual:Enable_TeX for details about how to - * set up mathematical formula display. - */ -$wgMathFileBackend = false; - -/** - * The filesystem path of the math directory. - * Defaults to "{$wgUploadDirectory}/math". - * - * See http://www.mediawiki.org/wiki/Manual:Enable_TeX for details about how to - * set up mathematical formula display. - */ -$wgMathDirectory = false; - -/** - * The url of the mathoid server. - * - * Documentation: http://www.formulasearchengine.com/mathoid - * Example value: http://mathoid.example.org:10042 - * - * @todo Move documentation to mediawiki.org - */ -$wgMathMathMLUrl = 'http://mathoid.testme.wmflabs.org'; - -/** - * The timeout for the HTTP-Request sent to the MathML to render an equation, - * in seconds. - */ -$wgMathMathMLTimeout = 20; - -/** - * Use of LaTeXML for details see - * - * - * If you want or need to run your own server, follow these installation - * instructions and override $wgMathLaTeXMLUrl: - * - * - * If you expect heavy load you can specify multiple servers. In that case one - * server is randomly chosen for each rendering process. Specify the list of - * servers in an array e.g $wgMathLaTeXMLUrl = array ( 'http://latexml.example.com/convert', - * 'http://latexml2.example.com/convert'); - */ -$wgMathLaTeXMLUrl = 'http://gw125.iu.xsede.org:8888'; // Sponsored by https://www.xsede.org/ - -/** - * The timeout for the HTTP-Request sent to the LaTeXML to render an equation, - * in seconds. - */ -$wgMathLaTeXMLTimeout = 240; -/** - * Setting for the LaTeXML renderer. - * See http://dlmf.nist.gov/LaTeXML/manual/commands/latexmlpost.xhtml for details. - */ -$wgMathDefaultLaTeXMLSetting = array( - 'format' => 'xhtml', - 'whatsin' => 'math', - 'whatsout' => 'math', - 'pmml', - 'cmml', - 'mathtex', - 'nodefaultresources', - 'preload' => array( 'LaTeX.pool', - 'article.cls', - 'amsmath.sty', - 'amsthm.sty', - 'amstext.sty', - 'amssymb.sty', - 'eucal.sty', - '[dvipsnames]xcolor.sty', - 'url.sty', - 'hyperref.sty', - '[ids]latexml.sty', - 'texvc' ), -); -/** - * The link to the texvccheck executable - */ -$wgMathTexvcCheckExecutable = __DIR__ . '/texvccheck/texvccheck'; - -/**@{ - * Math check constants - */ -define( 'MW_MATH_CHECK_ALWAYS', 0 ); /// backwards compatible to false -define( 'MW_MATH_CHECK_NEVER' , 1 ); /// backwards compatible to true -define( 'MW_MATH_CHECK_NEW' , 2 ); -/**@}*/ -/** - * Option to disable the TeX security filter: - * In general every math object, which is rendered by the math extension has its rendering cached in - * a database. - * MW_MATH_CHECK_ALWAYS: If set to MW_MATH_CHECK_ALWAYS only a subset of the TeX commands is allowed. - * See the Wikipedia page Help:Math for details about the allowed commands. - * MW_MATH_CHECK_NONE: If set to MW_MATH_CHECK_NONE any TeX expression is parsed. - * This can be a potential security risk. - * MW_MATH_CHECK_NEW checks only new equations. If the database does not yet contain the given math object, - * then it is passed through texvccheck. - * Please make sure to truncate the database tables (math, mathoid, mathlatexml) when switching from - * MW_MATH_CHECK_NONE to MW_MATH_CHECK_NEW. Otherwise, unchecked content contained in the database - * will be displayed. - */ -$wgMathDisableTexFilter = MW_MATH_CHECK_NEW; - -/** @var boolean $wgMathEnableExperimentalInputFormats enables experimental MathML and AsciiMath input format support */ -$wgMathEnableExperimentalInputFormats = false; -////////// end of config settings. - -$wgExtensionFunctions[] = 'MathHooks::setup'; -$wgHooks['ParserFirstCallInit'][] = 'MathHooks::onParserFirstCallInit'; -$wgHooks['GetPreferences'][] = 'MathHooks::onGetPreferences'; -$wgHooks['LoadExtensionSchemaUpdates'][] = 'MathHooks::onLoadExtensionSchemaUpdates'; -$wgHooks['ParserTestTables'][] = 'MathHooks::onParserTestTables'; -$wgHooks['UnitTestsList'][] = 'MathHooks::onRegisterUnitTests'; -$wgHooks['PageRenderingHash'][] = 'MathHooks::onPageRenderingHash'; -$wgHooks['EditPageBeforeEditToolbar'][] = 'MathHooks::onEditPageBeforeEditToolbar'; - -$dir = __DIR__ . '/'; -$wgAutoloadClasses['MathHooks'] = $dir . 'Math.hooks.php'; -$wgAutoloadClasses['MathRenderer'] = $dir . 'MathRenderer.php'; -$wgAutoloadClasses['MathTexvc'] = $dir . 'MathTexvc.php'; -$wgAutoloadClasses['MathSource'] = $dir . 'MathSource.php'; -$wgAutoloadClasses['MathMathML'] = $dir . 'MathMathML.php'; -$wgAutoloadClasses['MathLaTeXML'] = $dir . 'MathLaTeXML.php'; -$wgAutoloadClasses['MathInputCheck'] = $dir . 'MathInputCheck.php'; -$wgAutoloadClasses['MathInputCheckTexvc'] = $dir . 'MathInputCheckTexvc.php'; -$wgAutoloadClasses['SpecialMathShowImage'] = $dir . 'SpecialMathShowImage.php'; -$wgAutoloadClasses['SpecialMathStatus'] = $dir . 'SpecialMathStatus.php'; -$wgMessagesDirs['Math'] = __DIR__ . '/i18n'; -$wgExtensionMessagesFiles['MathAlias'] = $dir . 'Math.alias.php'; -$wgExtensionMessagesFiles['MathAliasNoTranslate'] = $dir . 'Math.alias.noTranslate.php'; - -$wgParserTestFiles[] = $dir . 'mathParserTests.txt'; - -$wgSpecialPages['MathShowImage'] = 'SpecialMathShowImage'; -$wgSpecialPages['MathStatus'] = 'SpecialMathStatus'; - -$wgResourceModules['ext.math.styles'] = array( - 'position' => 'top', - 'localBasePath' => __DIR__ . '/modules', - 'remoteExtPath' => 'Math/modules', - 'styles' => 'ext.math.css', - 'targets' => array( 'desktop', 'mobile' ), -); -$wgResourceModules['ext.math.desktop.styles'] = array( - 'position' => 'top', - 'localBasePath' => __DIR__ . '/modules', - 'remoteExtPath' => 'Math/modules', - 'styles' => 'ext.math.desktop.css', -); -$wgResourceModules['ext.math.scripts'] = array( - 'localBasePath' => __DIR__ . '/modules', - 'remoteExtPath' => 'Math/modules', - 'scripts' => 'ext.math.js', -); - - -$moduleTemplate = array( - 'localBasePath' => __DIR__ . '/modules', - 'remoteExtPath' => 'Math/modules', -); - -$wgResourceModules['ext.math.editbutton.enabler'] = array( - 'scripts' => 'ext.math.editbutton.js', - 'messages' => array( - 'math_tip', - 'math_sample', - ), -) + $moduleTemplate; - -$wgResourceModules['ext.math.visualEditor'] = array( - 'scripts' => array( - 'VisualEditor/ve.dm.MWMathNode.js', - 'VisualEditor/ve.ce.MWMathNode.js', - 'VisualEditor/ve.ui.MWMathInspector.js', - 'VisualEditor/ve.ui.MWMathInspectorTool.js', - ), - 'styles' => array( - 'VisualEditor/ve.ce.MWMathNode.css', - 'VisualEditor/ve.ui.MWMathIcons.css', - 'VisualEditor/ve.ui.MWMathInspector.css', - ), - 'dependencies' => array( - 'ext.visualEditor.mwcore', - ), - 'messages' => array( - 'math-visualeditor-mwmathinspector-display', - 'math-visualeditor-mwmathinspector-display-block', - 'math-visualeditor-mwmathinspector-display-default', - 'math-visualeditor-mwmathinspector-display-inline', - 'math-visualeditor-mwmathinspector-id', - 'math-visualeditor-mwmathinspector-title', - ), - 'targets' => array( 'desktop', 'mobile' ), -) + $moduleTemplate; - -$wgVisualEditorPluginModules[] = 'ext.math.visualEditor'; +if ( function_exists( 'wfLoadExtension' ) ) { + wfLoadExtension( 'Math' ); + // Keep i18n globals so mergeMessageFileList.php doesn't break + $wgMessagesDirs['Math'] = __DIR__ . '/i18n'; + $wgExtensionMessagesFiles['Math'] = __DIR__ . '/Math.alias.php'; + $wgExtensionMessagesFiles['MathAliasNoTranslate'] = __DIR__ . '/Math.alias.noTranslate.php'; + /* wfWarn( + 'Deprecated PHP entry point used for Math extension. Please use wfLoadExtension instead, ' . + 'see https://www.mediawiki.org/wiki/Extension_registration for more details.' + );*/ + return; +} else { + die( 'This version of the Math extension requires MediaWiki 1.25+' ); +} \ No newline at end of file diff --git a/MathInputCheckTexvc.php b/MathInputCheckTexvc.php index 5845a7d..6d5ad66 100644 --- a/MathInputCheckTexvc.php +++ b/MathInputCheckTexvc.php @@ -62,14 +62,19 @@ class MathInputCheckTexvc extends MathInputCheck { */ public function doValidCheck() { global $wgMathTexvcCheckExecutable; - if ( !is_executable( $wgMathTexvcCheckExecutable ) ) { + if ( $wgMathTexvcCheckExecutable === false ){ + $texvcCheckExecutable = __DIR__ . '/texvccheck/texvccheck'; + } else { + $texvcCheckExecutable = $wgMathTexvcCheckExecutable; + } + if ( !is_executable( $texvcCheckExecutable ) ) { $msg = 'Missing "texvccheck" executable. Please see math/README to configure.'; trigger_error( $msg, E_USER_NOTICE ); LoggerFactory::getInstance( 'Math' )->error( $msg ); return true; } - $cmd = $wgMathTexvcCheckExecutable . ' ' . wfEscapeShellArg( $this->inputTeX ); + $cmd = $texvcCheckExecutable . ' ' . wfEscapeShellArg( $this->inputTeX ); if ( wfIsWindows() ) { # Invoke it within cygwin sh, because texvc expects sh features in its default shell diff --git a/MathLaTeXML.php b/MathLaTeXML.php index 18cb595..5e07dfd 100644 --- a/MathLaTeXML.php +++ b/MathLaTeXML.php @@ -20,7 +20,7 @@ class MathLaTeXML extends MathMathML { global $wgMathLaTeXMLUrl; parent::__construct( $tex, $params ); $this->hosts = $wgMathLaTeXMLUrl; - $this->setMode( MW_MATH_LATEXML ); + $this->setMode( 'latexml' ); } /** * Converts an array with LaTeXML settings to a URL encoded String. @@ -75,8 +75,8 @@ class MathLaTeXML extends MathMathML { */ public function getLaTeXMLPostData() { $tex = $this->getTex(); - if ( $this->getMathStyle() == MW_MATHSTYLE_INLINE_DISPLAYSTYLE ) { - // In MW_MATHSTYLE_INLINE_DISPLAYSTYLE the old + if ( $this->getMathStyle() == 'inlineDisplaystyle' ) { + // In 'inlineDisplaystyle' the old // texvc behavior is reproduced: // The equation is rendered in displaystyle // (texvc used $$ $tex $$ to render) @@ -117,7 +117,7 @@ class MathLaTeXML extends MathMathML { if ( $this->isValidMathML( $jsonResult->result ) ) { $this->setMathml( $jsonResult->result ); Hooks::run( 'MathRenderingResultRetrieved', - array( &$renderer, + array( &$this, &$jsonResult ) );// Enables debugging of server results return true; } else { @@ -184,7 +184,7 @@ class MathLaTeXML extends MathMathML { public function calculateSvg() { $renderer = new MathMathML( $this->getTex() ); $renderer->setMathml( $this->getMathml() ); - $renderer->setMode( MW_MATH_LATEXML ); + $renderer->setMode( 'latexml' ); $res = $renderer->render( true ); if ( $res == true ) { $this->setSvg( $renderer->getSvg() ); diff --git a/MathMathML.php b/MathMathML.php index 432fa52..ffb6a16 100644 --- a/MathMathML.php +++ b/MathMathML.php @@ -38,7 +38,7 @@ class MathMathML extends MathRenderer { public function __construct( $tex = '', $params = array() ) { global $wgMathMathMLUrl; parent::__construct( $tex, $params ); - $this->setMode( MW_MATH_MATHML ); + $this->setMode( 'mathml' ); $this->hosts = $wgMathMathMLUrl; if ( isset( $params['type'] ) ) { if ( $params['type'] == 'pmml' ) { @@ -174,7 +174,7 @@ class MathMathML extends MathRenderer { $errormsg = $status->getHtml(); $error = $this->getError( 'math_invalidresponse', $this->getModeStr(), $host, $errormsg, - $this->getModeStr( MW_MATH_MATHML ) ); + $this->getModeStr( 'mathml' ) ); LoggerFactory::getInstance( 'Math' )->warning( 'NoResponse:' . var_export( array( 'post' => $post, 'host' => $host, @@ -211,12 +211,12 @@ class MathMathML extends MathRenderer { public function getPostData() { $input = $this->getTex(); if ( $this->inputType == 'pmml' || - $this->getMode() == MW_MATH_LATEXML && $this->getMathml() ) { + $this->getMode() == 'latexml' && $this->getMathml() ) { $out = 'type=mml&q=' . rawurlencode( $this->getMathml() ); } elseif ( $this->inputType == 'ascii' ) { $out = 'type=asciimath&q=' . rawurlencode( $input ); } else { - if ( $this->getMathStyle() == MW_MATHSTYLE_INLINE_DISPLAYSTYLE ) { + if ( $this->getMathStyle() == 'inlineDisplaystyle' ) { // default preserve the (broken) layout as it was $out = 'type=inline-TeX&q=' . rawurlencode( '{\\displaystyle ' . $input . '}' ); } else { @@ -332,7 +332,7 @@ class MathMathML extends MathRenderer { public function correctSvgStyle( $svg, &$style ) { if ( preg_match( '/style="([^"]*)"/', $svg, $styles ) ) { $style .= ' ' . $styles[1]; // merge styles - if ( $this->getMathStyle() === MW_MATHSTYLE_DISPLAY ) { + if ( $this->getMathStyle() === 'display' ) { // TODO: Improve style cleaning $style = preg_replace( '/margin\-(left|right)\:\s*\d+(\%|in|cm|mm|em|ex|pt|pc|px)\;/', '', $style ); } @@ -392,7 +392,7 @@ class MathMathML extends MathRenderer { } else { $class .= 'mathml-'; } - if ( $this->getMathStyle() == MW_MATHSTYLE_DISPLAY ) { + if ( $this->getMathStyle() == 'display' ) { $class .= 'display'; } else { $class .= 'inline'; @@ -406,7 +406,7 @@ class MathMathML extends MathRenderer { * @return string Html output that is embedded in the page */ public function getHtmlOutput() { - if ( $this->getMathStyle() == MW_MATHSTYLE_DISPLAY ) { + if ( $this->getMathStyle() == 'display' ) { $element = 'div'; } else { $element = 'span'; @@ -420,7 +420,7 @@ class MathMathML extends MathRenderer { // Remove displayStyle attributes set by the MathML converter // (Beginning from Mathoid 0.2.5 block is the default layout.) $mml = preg_replace( '/(]*)(display|mode)=["\'](inline|block)["\']/', '$1', $this->getMathml() ); - if ( $this->getMathStyle() == MW_MATHSTYLE_DISPLAY ) { + if ( $this->getMathStyle() == 'display' ) { $mml = preg_replace( '/ $this->getClassName(), 'style' => 'display: none;' ), $mml ); @@ -464,7 +464,7 @@ class MathMathML extends MathRenderer { * @return bool */ private function processJsonResult( $jsonResult, $host ) { - if ( $this->getMode() == MW_MATH_LATEXML || $this->inputType == 'pmml' || + if ( $this->getMode() == 'latexml' || $this->inputType == 'pmml' || $this->isValidMathML( $jsonResult->mml ) ) { if ( isset( $jsonResult->svg ) ) { @@ -479,7 +479,7 @@ class MathMathML extends MathRenderer { LoggerFactory::getInstance( 'Math' )->error( 'Missing SVG property in JSON result.' ); } - if ( $this->getMode() != MW_MATH_LATEXML && $this->inputType != 'pmml' ) { + if ( $this->getMode() != 'latexml' && $this->inputType != 'pmml' ) { $this->setMathml( $jsonResult->mml ); } Hooks::run( 'MathRenderingResultRetrieved', diff --git a/MathRenderer.php b/MathRenderer.php index 396b9c7..2e000bf 100644 --- a/MathRenderer.php +++ b/MathRenderer.php @@ -31,8 +31,8 @@ abstract class MathRenderer { /** @var string the original user input string (which was used to calculate the inputhash) */ protected $userInputTex = ''; // FURTHER PROPERTIES OF THE MATHEMATICAL CONTENT - /** @var (MW_MATHSTYLE_INLINE_DISPLAYSTYLE|MW_MATHSTYLE_DISPLAY|MW_MATHSTYLE_INLINE) the rendering style */ - protected $mathStyle = MW_MATHSTYLE_INLINE_DISPLAYSTYLE; + /** @var ('inlineDisplaystyle'|'display'|'inline') the rendering style */ + protected $mathStyle = 'inlineDisplaystyle'; /** @var array with userdefined parameters passed to the extension (not used) */ protected $params = array(); /** @var string a userdefined identifier to link to the equation. */ @@ -53,8 +53,8 @@ abstract class MathRenderer { protected $md5 = ''; /** @var binary packed inputhash */ protected $inputHash = ''; - /** @var int rendering mode MW_MATH_(PNG|MATHML|SOURCE...) */ - protected $mode = MW_MATH_PNG; + /** @var string rendering mode */ + protected $mode = 'png'; /** * Constructs a base MathRenderer @@ -76,10 +76,10 @@ abstract class MathRenderer { * * @param string $tex LaTeX markup * @param array $params HTML attributes - * @param int $mode constant indicating rendering mode + * @param string $mode constant indicating rendering mode * @return string HTML for math tag */ - public static function renderMath( $tex, $params = array(), $mode = MW_MATH_PNG ) { + public static function renderMath( $tex, $params = array(), $mode = 'png' ) { $renderer = self::getRenderer( $tex, $params, $mode ); if ( $renderer->render() ) { return $renderer->getHtmlOutput(); @@ -107,16 +107,16 @@ abstract class MathRenderer { * * @param string $tex LaTeX markup * @param array $params HTML attributes - * @param int $mode constant indicating rendering mode + * @param string $mode indicating rendering mode * @return MathRenderer appropriate renderer for mode */ - public static function getRenderer( $tex, $params = array(), $mode = MW_MATH_PNG ) { - global $wgDefaultUserOptions, $wgMathValidModes, $wgMathEnableExperimentalInputFormats; + public static function getRenderer( $tex, $params = array(), $mode = 'png' ) { + global $wgDefaultUserOptions, $wgMathEnableExperimentalInputFormats; $mathStyle = null; if ( isset( $params['display'] ) ) { $layoutMode = $params['display']; if ( $layoutMode == 'block' ) { - $mathStyle = MW_MATHSTYLE_DISPLAY; + $mathStyle = 'display'; // TODO: Implement caching for attributes of the math tag // Currently the key for the database entry relating to an equation // is md5($tex) the new option to determine if the tex input @@ -129,7 +129,7 @@ abstract class MathRenderer { // be centered in a new line, or just in be displayed in the current line. $tex = '{\displaystyle ' . $tex . '}'; } elseif ( $layoutMode == 'inline' ) { - $mathStyle = MW_MATHSTYLE_INLINE; + $mathStyle = 'inline'; $tex = '{\textstyle ' . $tex . '}'; } } @@ -137,29 +137,28 @@ abstract class MathRenderer { if ( isset( $params['forcemathmode'] ) ) { $mode = $params['forcemathmode']; } - if ( !in_array( $mode, $wgMathValidModes ) ) { + if ( !in_array( $mode, self::getValidModes() ) ) { $mode = $wgDefaultUserOptions['math']; } - if ( $wgMathEnableExperimentalInputFormats === true && $mode == MW_MATH_MATHML && + if ( $wgMathEnableExperimentalInputFormats === true && $mode == 'mathml' && isset( $params['type'] ) ) { // Support of MathML input (experimental) - // Currently support for mode MW_MATH_MATHML only + // Currently support for mode 'mathml' only if ( !in_array( $params['type'], array( 'pmml', 'ascii' ) ) ) { unset( $params['type'] ); } } switch ( $mode ) { - case MW_MATH_MATHJAX: - case MW_MATH_SOURCE: + case 'source': $renderer = new MathSource( $tex, $params ); break; - case MW_MATH_PNG: + case 'png': $renderer = new MathTexvc( $tex, $params ); break; - case MW_MATH_LATEXML: + case 'latexml': $renderer = new MathLaTeXML( $tex, $params ); break; - case MW_MATH_MATHML: + case 'mathml': default: $renderer = new MathMathML( $tex, $params ); } @@ -408,9 +407,9 @@ abstract class MathRenderer { } /** - * gets the rendering mode MW_MATH_* + * Gets the rendering mode * - * @return int + * @return string */ public function getMode() { return $this->mode; @@ -418,12 +417,11 @@ abstract class MathRenderer { /** * Sets the rendering mode - * @param int $newMode element of the array $wgMathValidModes + * @param string $newMode element of the array $wgMathValidModes * @return bool */ public function setMode( $newMode ) { - global $wgMathValidModes; - if ( in_array( $newMode, $wgMathValidModes ) ) { + if ( in_array( $newMode, self::getValidModes() ) ) { $this->mode = $newMode; return true; } else { @@ -530,9 +528,9 @@ abstract class MathRenderer { /** * - * @param (MW_MATHSTYLE_INLINE_DISPLAYSTYLE|MW_MATHSTYLE_DISPLAY|MW_MATHSTYLE_INLINE) $mathStyle + * @param ('inlineDisplaystyle'|'display'|'inline') $mathStyle */ - public function setMathStyle( $displayStyle = MW_MATHSTYLE_DISPLAY ) { + public function setMathStyle( $displayStyle = 'display' ) { if ( $this->mathStyle !== $displayStyle ){ $this->changed = true; } @@ -541,7 +539,7 @@ abstract class MathRenderer { /** * Returns the value of the DisplayStyle attribute - * @return (MW_MATHSTYLE_INLINE_DISPLAYSTYLE|MW_MATHSTYLE_DISPLAY|MW_MATHSTYLE_INLINE) the DisplayStyle + * @return ('inlineDisplaystyle'|'display'|'inline') the DisplayStyle */ public function getMathStyle() { return $this->mathStyle; @@ -560,12 +558,11 @@ abstract class MathRenderer { * @return bool */ public function checkTex() { - global $wgMathDisableTexFilter; - if ( $this->texSecure || (int) $wgMathDisableTexFilter == MW_MATH_CHECK_NEVER ) { + if ( $this->texSecure || self::getDisableTexFilter() == 'never' ) { // equation was already checked or checking is disabled return true; } else { - if( (int) $wgMathDisableTexFilter == MW_MATH_CHECK_NEW && $this->mode != MW_MATH_SOURCE ){ + if( self::getDisableTexFilter() == 'new' && $this->mode != 'source' ){ if( $this->readFromDatabase() ){ return true; } @@ -647,4 +644,14 @@ abstract class MathRenderer { return $names[ $this->getMode() ]; } + public static function getValidModes(){ + global $wgMathValidModes; + return array_map( "MathHooks::mathModeToString", $wgMathValidModes ); + } + + + public static function getDisableTexFilter(){ + global $wgMathDisableTexFilter; + return MathHooks::mathCheckToString( $wgMathDisableTexFilter ); + } } diff --git a/MathSource.php b/MathSource.php index 77c84cc..47f77e6 100644 --- a/MathSource.php +++ b/MathSource.php @@ -25,7 +25,7 @@ class MathSource extends MathRenderer { */ function __construct( $tex = '', $params = array() ) { parent::__construct( $tex, $params ); - $this->setMode( MW_MATH_SOURCE ); + $this->setMode( 'source' ); } /** @@ -36,7 +36,7 @@ class MathSource extends MathRenderer { function getHtmlOutput() { # No need to render or parse anything more! # New lines are replaced with spaces, which avoids confusing our parser (bugs 23190, 22818) - if ( $this->getMathStyle() == MW_MATHSTYLE_DISPLAY ) { + if ( $this->getMathStyle() == 'display' ) { $class = 'mwe-math-fallback-source-display'; } else { $class = 'mwe-math-fallback-source-inline'; diff --git a/MathTexvc.php b/MathTexvc.php index d18702c..2f77c9b 100644 --- a/MathTexvc.php +++ b/MathTexvc.php @@ -143,7 +143,7 @@ class MathTexvc extends MathRenderer { 'class' => 'mwe-math-fallback-image-inline tex', 'alt' => $this->getTex() ); - if ( $this->getMathStyle() === MW_MATHSTYLE_DISPLAY ){ + if ( $this->getMathStyle() === 'display' ){ // if DisplayStyle is true, the equation will be centered in a new line $attributes[ 'class' ] = 'mwe-math-fallback-image-display tex'; } @@ -177,17 +177,21 @@ class MathTexvc extends MathRenderer { */ public function callTexvc() { global $wgTexvc, $wgTexvcBackgroundColor, $wgHooks; - + if ( $wgTexvc === false ){ + $texvc = __DIR__ . '/math/texvc'; + } else { + $texvc = $wgTexvc; + } $tmpDir = wfTempDir(); - if ( !is_executable( $wgTexvc ) ) { + if ( !is_executable( $texvc ) ) { LoggerFactory::getInstance( 'Math' )->error( - "$wgTexvc does not exist or is not executable." ); + "$texvc does not exist or is not executable." ); return $this->getError( 'math_notexvc' ); } $escapedTmpDir = wfEscapeShellArg( $tmpDir ); - $cmd = $wgTexvc . ' ' . + $cmd = $texvc . ' ' . $escapedTmpDir . ' ' . $escapedTmpDir . ' ' . wfEscapeShellArg( $this->getUserInputTex() ) . ' ' . @@ -335,27 +339,7 @@ class MathTexvc extends MathRenderer { * @return string HTML string */ public function getHtmlOutput() { - if ( $this->getMode() == MW_MATH_MATHML && $this->getMathml() != '' ) { - return Xml::tags( 'math', - $this->getAttributes( 'math', - array( 'xmlns' => 'http://www.w3.org/1998/Math/MathML' ) ), - $this->mathml ); - } - if ( ( $this->getMode() == MW_MATH_PNG ) || ( $this->getHtml() == '' ) || - ( ( $this->getMode() == MW_MATH_SIMPLE ) && ( $this->getConservativeness() != self::CONSERVATIVE ) ) || - ( ( $this->getMode() == MW_MATH_MODERN || $this->getMode() == MW_MATH_MATHML ) && ( $this->getConservativeness() == self::LIBERAL ) ) - ) - { - return $this->getMathImageHTML(); - } else { - return Xml::tags( 'span', - $this->getAttributes( 'span', - array( 'class' => 'texhtml', - 'dir' => 'ltr' - ) ), - $this->getHtml() - ); - } + return $this->getMathImageHTML(); } /** diff --git a/README b/README index 6fdf82e..6e48646 100644 --- a/README +++ b/README @@ -14,7 +14,7 @@ If you prefer MathML rather than images you can use LaTeXML to convert the math tags to MathML. To use that feature you have to enable LaTeXML by setting $wgMathUseLaTeXML = true; It is possible to choose LaTeXML as default option (for anonymous user) by setting -$wgDefaultUserOptions['math'] = MW_MATH_LATEXML; +$wgDefaultUserOptions['math'] = 'latexml'; in the LocalSettings.php file. The LaTeXML option requires php5-curl to be installed. Without php5-curl no proper error handling can be guaranteed. diff --git a/SpecialMathShowImage.php b/SpecialMathShowImage.php index bffd4d2..6b6c956 100644 --- a/SpecialMathShowImage.php +++ b/SpecialMathShowImage.php @@ -7,7 +7,7 @@ class SpecialMathShowImage extends SpecialPage { private $noRender = false; private $renderer = null; - private $mode = MW_MATH_MATHML; + private $mode = 'mathml'; function __construct() { parent::__construct( @@ -28,7 +28,7 @@ class SpecialMathShowImage extends SpecialPage { $out->setArticleRelated( false ); $out->setRobotPolicy( "noindex,nofollow" ); $out->disable(); - if ( $success && $this->mode == MW_MATH_PNG ) { + if ( $success && $this->mode == 'png' ) { $request->response()->header( "Content-type: image/png;" ); } else { $request->response()->header( "Content-type: image/svg+xml; charset=utf-8" ); @@ -40,7 +40,7 @@ class SpecialMathShowImage extends SpecialPage { } function execute( $par ) { - global $wgMathValidModes, $wgMathEnableExperimentalInputFormats; + global $wgMathEnableExperimentalInputFormats; $request = $this->getRequest(); $hash = $request->getText( 'hash', '' ); $tex = $request->getText( 'tex', '' ); @@ -49,10 +49,10 @@ class SpecialMathShowImage extends SpecialPage { } else { $asciimath = ''; } - $this->mode = $request->getInt( 'mode', MW_MATH_MATHML ); - if ( !in_array( $this->mode, $wgMathValidModes ) ) { + $this->mode = $request->getInt( 'mode', 'mathml' ); + if ( !in_array( $this->mode, MathRenderer::getValidModes() ) ) { // Fallback to the default if an invalid mode was specified - $this->mode = MW_MATH_MATHML; + $this->mode = 'mathml'; } if ( $hash === '' && $tex === '' && $asciimath === '' ) { $this->setHeaders( false ); @@ -60,10 +60,10 @@ class SpecialMathShowImage extends SpecialPage { } else { if ( $tex === '' && $asciimath === ''){ switch ( $this->mode ) { - case MW_MATH_PNG: + case 'png': $this->renderer = MathTexvc::newFromMd5( $hash ); break; - case MW_MATH_LATEXML: + case 'latexml': $this->renderer = MathLaTeXML::newFromMd5( $hash ); break; default: @@ -74,12 +74,12 @@ class SpecialMathShowImage extends SpecialPage { if ( $isInDatabase || $this->noRender ) { $success = $isInDatabase; } else { - if ( $this->mode == MW_MATH_PNG ) { + if ( $this->mode == '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 = MathRenderer::getRenderer( $mmlRenderer->getUserInputTex(), array(), 'png' ); $this->renderer->setMathStyle( $mmlRenderer->getMathStyle() ); } $success = $this->renderer->render(); @@ -92,7 +92,7 @@ class SpecialMathShowImage extends SpecialPage { $success = $this->renderer->render(); } if ( $success ) { - if ( $this->mode == MW_MATH_PNG ) { + if ( $this->mode == 'png' ) { $output = $this->renderer->getPng(); } else { $output = $this->renderer->getSvg(); diff --git a/SpecialMathStatus.php b/SpecialMathStatus.php index 74bc8da..03119a1 100644 --- a/SpecialMathStatus.php +++ b/SpecialMathStatus.php @@ -34,10 +34,10 @@ class SpecialMathStatus extends SpecialPage { foreach ( $enabledMathModes as $modeNr => $modeName ){ $out->addWikiText( "=== $modeName ===" ); switch( $modeNr ){ - case MW_MATH_MATHML: + case 'mathml': $this->runMathMLTest( $modeName ); break; - case MW_MATH_LATEXML: + case 'latexml': $this->runMathLaTeXMLTest( $modeName ); } } @@ -58,7 +58,7 @@ class SpecialMathStatus extends SpecialPage { } public function testSpecialCaseText() { - $renderer = MathRenderer::getRenderer( 'x^2+\text{a sample Text}', array(), MW_MATH_MATHML ); + $renderer = MathRenderer::getRenderer( 'x^2+\text{a sample Text}', array(), 'mathml' ); $expected = 'a sample Text'; $this->assertTrue( $renderer->render(), 'Rendering the input "x^2+\text{a sample Text}"' ); $this->assertContains( $expected, $renderer->getHtmlOutput(), 'Comparing to the reference rendering' ); @@ -85,7 +85,7 @@ class SpecialMathStatus extends SpecialPage { '; - $renderer = MathRenderer::getRenderer( "a+b", array(), MW_MATH_MATHML ); + $renderer = MathRenderer::getRenderer( "a+b", array(), 'mathml' ); $this->assertTrue( $renderer->render( true ), "Rendering of a+b in plain MathML mode" ); $real = str_replace( "\n", '', $renderer->getHtmlOutput() ); $expected = '+'; @@ -104,7 +104,7 @@ class SpecialMathStatus extends SpecialPage { $renderer = new MathMathML( $inputSample, $attribs ); $this->assertEquals( 'pmml', $renderer->getInputType(), 'Checking if MathML input is supported' ); $this->assertTrue( $renderer->render(), 'Rendering Presentation MathML sample' ); - $real = MathRenderer::renderMath( $inputSample, $attribs, MW_MATH_MATHML ); + $real = MathRenderer::renderMath( $inputSample, $attribs, 'mathml' ); $expected = 'hash=5628b8248b79267ecac656102334d5e3&mode=5'; $this->assertContains( $expected, $real, 'Checking if the link to SVG image is correct' ); } @@ -114,7 +114,7 @@ class SpecialMathStatus extends SpecialPage { * i.e. if the span element is generated right. */ public function testLaTeXMLIntegration() { - $renderer = MathRenderer::getRenderer( "a+b", array(), MW_MATH_LATEXML ); + $renderer = MathRenderer::getRenderer( "a+b", array(), 'latexml' ); $this->assertTrue( $renderer->render( true ), "Rendering of a+b in LaTeXML mode" ); $expected = 'a+bab{\displaystyle a+b}'; $real = preg_replace( "/\n\s*/", '', $renderer->getHtmlOutput() ); diff --git a/extension.json b/extension.json new file mode 100644 index 0000000..6db5e6b --- /dev/null +++ b/extension.json @@ -0,0 +1,174 @@ +{ + "name": "Math", + "version": "2.0.0", + "author": [ + "Tomasz Wegrzanowski", + "Brion Vibber", + "Moritz Schubotz", + "Derk-Jan Hartman" + ], + "url": "https://www.mediawiki.org/wiki/Extension:Math", + "descriptionmsg": "math-desc", + "callback": "MathHooks::registerExtension", + "type": "parserhook", + "AutoloadClasses": { + "MathHooks": "Math.hooks.php", + "MathRenderer": "MathRenderer.php", + "MathTexvc": "MathTexvc.php", + "MathSource": "MathSource.php", + "MathMathML": "MathMathML.php", + "MathLaTeXML": "MathLaTeXML.php", + "MathInputCheck": "MathInputCheck.php", + "MathInputCheckTexvc": "MathInputCheckTexvc.php", + "SpecialMathShowImage": "SpecialMathShowImage.php", + "SpecialMathStatus": "SpecialMathStatus.php" + }, + "DefaultUserOptions": { + "math": "png" + }, + "ExtensionFunctions": [ + "MathHooks::setup" + ], + "ExtensionMessagesFiles": { + "MathAlias": "Math.alias.php", + "MathAliasNoTranslate": "Math.alias.noTranslate.php" + }, + "Hooks": { + "ParserFirstCallInit": [ + "MathHooks::onParserFirstCallInit" + ], + "GetPreferences": [ + "MathHooks::onGetPreferences" + ], + "LoadExtensionSchemaUpdates": [ + "MathHooks::onLoadExtensionSchemaUpdates" + ], + "ParserTestTables": [ + "MathHooks::onParserTestTables" + ], + "UnitTestsList": [ + "MathHooks::onRegisterUnitTests" + ], + "PageRenderingHash": [ + "MathHooks::onPageRenderingHash" + ], + "EditPageBeforeEditToolbar": [ + "MathHooks::onEditPageBeforeEditToolbar" + ] + }, + "config": { + "MathCheckFiles": true, + "MathDefaultLaTeXMLSetting": { + "format": "xhtml", + "whatsin": "math", + "whatsout": "math", + "0": "pmml", + "1": "cmml", + "2": "mathtex", + "3": "nodefaultresources", + "preload": [ + "LaTeX.pool", + "article.cls", + "amsmath.sty", + "amsthm.sty", + "amstext.sty", + "amssymb.sty", + "eucal.sty", + "[dvipsnames]xcolor.sty", + "url.sty", + "hyperref.sty", + "[ids]latexml.sty", + "texvc" + ] + }, + "MathDirectory": false, + "MathDisableTexFilter": "new", + "MathEnableExperimentalInputFormats": false, + "MathFileBackend": false, + "MathLaTeXMLTimeout": 240, + "MathLaTeXMLUrl": "http://gw125.iu.xsede.org:8888", + "MathMathMLTimeout": 20, + "MathMathMLUrl": "http://mathoid.testme.wmflabs.org", + "MathPath": false, + "MathTexvcCheckExecutable": false, + "MathValidModes": [ + "png", + "source", + "mathml" + ], + "Texvc": false, + "TexvcBackgroundColor": "transparent" + }, + "VisualEditorPluginModules": [ + "ext.math.visualEditor" + ], + "MessagesDirs": { + "Math": [ + "i18n" + ] + }, + "ParserTestFiles": [ + "mathParserTests.txt" + ], + "ResourceModules": { + "ext.math.styles": { + "position": "top", + "styles": "ext.math.css", + "targets": [ + "desktop", + "mobile" + ] + }, + "ext.math.desktop.styles": { + "position": "top", + "styles": "ext.math.desktop.css" + }, + "ext.math.scripts": { + "scripts": "ext.math.js" + }, + "ext.math.editbutton.enabler": { + "scripts": "ext.math.editbutton.js", + "messages": [ + "math_tip", + "math_sample" + ] + }, + "ext.math.visualEditor": { + "scripts": [ + "VisualEditor/ve.dm.MWMathNode.js", + "VisualEditor/ve.ce.MWMathNode.js", + "VisualEditor/ve.ui.MWMathInspector.js", + "VisualEditor/ve.ui.MWMathInspectorTool.js" + ], + "styles": [ + "VisualEditor/ve.ce.MWMathNode.css", + "VisualEditor/ve.ui.MWMathIcons.css", + "VisualEditor/ve.ui.MWMathInspector.css" + ], + "dependencies": [ + "ext.visualEditor.mwcore" + ], + "messages": [ + "math-visualeditor-mwmathinspector-display", + "math-visualeditor-mwmathinspector-display-block", + "math-visualeditor-mwmathinspector-display-default", + "math-visualeditor-mwmathinspector-display-inline", + "math-visualeditor-mwmathinspector-id", + "math-visualeditor-mwmathinspector-title" + ], + "targets": [ + "desktop", + "mobile" + ] + } + }, + "ResourceFileModulePaths": { + "localBasePath": "modules", + "remoteExtPath": "Math/modules" + }, + "SpecialPages": { + "MathShowImage": "SpecialMathShowImage", + "MathStatus": "SpecialMathStatus" + }, + "manifest_version": 1 +} diff --git a/maintenance/MathGenerateTests.php b/maintenance/MathGenerateTests.php index a8f984c..a575753 100644 --- a/maintenance/MathGenerateTests.php +++ b/maintenance/MathGenerateTests.php @@ -78,7 +78,7 @@ class MathGenerateTests extends Maintenance } $i = 0; foreach ( array_slice( $allEquations, $offset, $length, true ) as $input ) { - $output = MathRenderer::renderMath( $input[1], $input[2], MW_MATH_PNG ); + $output = MathRenderer::renderMath( $input[1], $input[2], 'png' ); $output = preg_replace( '#src="(.*?)/(([a-f]|\d)*).png"#', 'src="\2.png"', $output ); $parserTests[] = array( (string)$input[1], $output ); $i++; diff --git a/modules/ext.math.js b/modules/ext.math.js index 815a8f1..bf4b326 100644 --- a/modules/ext.math.js +++ b/modules/ext.math.js @@ -1,7 +1,6 @@ ( function ( $ ) { 'use strict'; - // The MW_MATH_PNG and MW_MATH_MATHML constants are taken from Math.php - var MW_MATH_PNG = 0, MW_MATH_MATHML = 5, img, url; + var img, url; // If MathPlayer is installed we show the MathML rendering. if (navigator.userAgent.indexOf('MathPlayer') > -1) { @@ -17,7 +16,7 @@ // Create a new PNG image to use as the fallback. img = document.createElement('img'); url = this.style.backgroundImage.match(/url\('?([^']*)'?\)/)[1]; - img.setAttribute( 'src', url.replace('mode=' + MW_MATH_MATHML, 'mode=' + MW_MATH_PNG) ); + img.setAttribute( 'src', url.replace('mode=' + 'mathml', 'mode=' + 'png') ); img.setAttribute( 'class', 'tex mwe-math-fallback-image-' + ($( this ).hasClass('mwe-math-fallback-image-inline') ? 'inline' : 'display') ); img.setAttribute( 'aria-hidden', 'true' ); this.parentNode.insertBefore( img, this ); diff --git a/tests/MathCoverageTest.php b/tests/MathCoverageTest.php index f02c52e..7782e20 100644 --- a/tests/MathCoverageTest.php +++ b/tests/MathCoverageTest.php @@ -70,7 +70,7 @@ class MathCoverageTest extends MediaWikiTestCase { // TODO: Link to the wikipage that contains the reference rendering $this->assertEquals( $this->normalize( $output ), - $this->normalize( MathRenderer::renderMath( $input, array(), MW_MATH_PNG ) ), + $this->normalize( MathRenderer::renderMath( $input, array(), 'png' ) ), "Failed to render $input" ); } diff --git a/tests/MathDatabaseTest.php b/tests/MathDatabaseTest.php index b4e4685..2e7b9e6 100644 --- a/tests/MathDatabaseTest.php +++ b/tests/MathDatabaseTest.php @@ -78,7 +78,7 @@ class MathDatabaseTest extends MediaWikiTestCase { * @covers MathHooks::onLoadExtensionSchemaUpdates */ public function testCreateTable() { - $this->setMwGlobals( 'wgMathValidModes', array( MW_MATH_PNG ) ); + $this->setMwGlobals( 'wgMathValidModes', array( 'png' ) ); $this->db->dropTable( "math", __METHOD__ ); $dbu = DatabaseUpdater::newForDB( $this->db ); $dbu->doUpdates( array( "extensions" ) ); diff --git a/tests/MathLaTeXMLDatabaseTest.php b/tests/MathLaTeXMLDatabaseTest.php index fc7d2e0..79efaad 100644 --- a/tests/MathLaTeXMLDatabaseTest.php +++ b/tests/MathLaTeXMLDatabaseTest.php @@ -77,7 +77,7 @@ class MathLaTeXMLDatabaseTest extends MediaWikiTestCase { * @covers MathHooks::onLoadExtensionSchemaUpdates */ public function testCreateTable() { - $this->setMwGlobals( 'wgMathValidModes', array( MW_MATH_LATEXML ) ); + $this->setMwGlobals( 'wgMathValidModes', array( 'latexml' ) ); $this->db->dropTable( "mathlatexml", __METHOD__ ); $dbu = DatabaseUpdater::newForDB( $this->db ); $dbu->doUpdates( array( "extensions" ) ); diff --git a/tests/MathRendererTest.php b/tests/MathRendererTest.php index 74ea51a..9a293d6 100644 --- a/tests/MathRendererTest.php +++ b/tests/MathRendererTest.php @@ -65,7 +65,7 @@ class MathRendererTest extends MediaWikiTestCase { } public function testCheckingAlways() { - $this->setMwGlobals( "wgMathDisableTexFilter", MW_MATH_CHECK_ALWAYS ); + $this->setMwGlobals( "wgMathDisableTexFilter", 'always' ); $renderer = $this->getMockBuilder( 'MathRenderer' )->setMethods( array( 'render', @@ -84,7 +84,7 @@ class MathRendererTest extends MediaWikiTestCase { } public function testCheckingNever() { - $this->setMwGlobals( "wgMathDisableTexFilter", MW_MATH_CHECK_NEVER ); + $this->setMwGlobals( "wgMathDisableTexFilter", 'never' ); $renderer = $this->getMockBuilder( 'MathRenderer' )->setMethods( array( 'render', @@ -100,7 +100,7 @@ class MathRendererTest extends MediaWikiTestCase { } public function testCheckingNewUnknown() { - $this->setMwGlobals( "wgMathDisableTexFilter", MW_MATH_CHECK_NEW ); + $this->setMwGlobals( "wgMathDisableTexFilter", 'new' ); $renderer = $this->getMockBuilder( 'MathRenderer' )->setMethods( array( 'render', @@ -119,7 +119,7 @@ class MathRendererTest extends MediaWikiTestCase { } public function testCheckingNewKnown() { - $this->setMwGlobals( "wgMathDisableTexFilter", MW_MATH_CHECK_NEW ); + $this->setMwGlobals( "wgMathDisableTexFilter", 'new' ); $renderer = $this->getMockBuilder( 'MathRenderer' )->setMethods( array( 'render', diff --git a/tests/MathSourceTest.php b/tests/MathSourceTest.php index 8bfe92a..7656330 100644 --- a/tests/MathSourceTest.php +++ b/tests/MathSourceTest.php @@ -10,7 +10,7 @@ class MathSourceTest extends MediaWikiTestCase { * i.e. if the span element is generated right. */ public function testBasics() { - $real = MathRenderer::renderMath( "a+b", array(), MW_MATH_SOURCE ); + $real = MathRenderer::renderMath( "a+b", array(), 'source' ); $this->assertEquals( '$ a+b $', $real, @@ -22,7 +22,7 @@ class MathSourceTest extends MediaWikiTestCase { * Checks if newlines are converted to spaces correctly. */ public function testNewLines() { - $real = MathRenderer::renderMath( "a\n b", array(), MW_MATH_SOURCE ); + $real = MathRenderer::renderMath( "a\n b", array(), 'source' ); $this->assertSame( '$ a b $', $real, diff --git a/tests/MathUtilsTest.php b/tests/MathUtilsTest.php new file mode 100644 index 0000000..6dd5eb0 --- /dev/null +++ b/tests/MathUtilsTest.php @@ -0,0 +1,102 @@ + $default, + 'MW_MATH_HTML' => $default, + 'MW_MATH_MODERN' => $default, + 'MW_MATH_MATHJAX' => $default, + 'MW_MATH_LATEXML_JAX' => $default, + 'MW_MATH_PNG' => 'png', + 'MW_MATH_SOURCE' => 'source', + 'MW_MATH_MATHML' => 'mathml', + 'MW_MATH_LATEXML' => 'latexml', + 1 => $default, + 2 => $default, + 4 => $default, + 6 => $default, + 8 => $default, + 0 => 'png', + 3 => 'source', + 5 => 'mathml', + 7 => 'latexml', + 'png' => 'png', + 'source' => 'source', + 'mathml' => 'mathml', + 'latexml' => 'latexml', + ); + foreach ( $testCases as $input => $expected ){ + $real = MathHooks::mathModeToString( $input, $default ); + $this->assertEquals( $expected, $real, "Conversion math mode $input -> $expected" ); + } + } + + public function testMathStyleToString() { + $default = 'inlineDisplaystyle-test'; + $testCases = array( + 'MW_MATHSTYLE_INLINE_DISPLAYSTYLE' => 'inlineDisplaystyle', + 'MW_MATHSTYLE_DISPLAY' => 'display', + 'MW_MATHSTYLE_INLINE' => 'inline', + 0 => 'inlineDisplaystyle', + 1 => 'display', + 2 => 'inline', + 'inlineDisplaystyle' => 'inlineDisplaystyle', + 'display' => 'display', + 'inline' => 'inline', + ); + foreach ( $testCases as $input => $expected ){ + $real = MathHooks::mathStyleToString( $input, $default ); + $this->assertEquals( $expected, $real, "Conversion in math style" ); + } + } + + public function testMathCheckToString() { + $default = 'always-default'; + $testCases = array( + 'MW_MATH_CHECK_ALWAYS' => 'always', + 'MW_MATH_CHECK_NEVER' => 'never', + 'MW_MATH_CHECK_NEW' => 'new', + 0 => 'always', + 1 => 'never', + 2 => 'new', + 'always' => 'always', + 'never' => 'never', + 'new' => 'new', + true => 'never', + false => 'always' + ); + + foreach ( $testCases as $input => $expected ){ + $real = MathHooks::mathCheckToString( $input, $default ); + $this->assertEquals( $expected, $real, "Conversion in math check method" ); + } + } + + public function testMathModeToHash() { + $default = 0; + $testCases = array ( + 'png' => 0, + 'source' => 3, + 'mathml' => 5, + 'latexml'=> 7, + 'invalid'=> $default); + + foreach ( $testCases as $input => $expected ){ + $real = MathHooks::mathModeToHashKey( $input, $default ); + $this->assertEquals( $expected, $real, "Conversion to hash key" ); + } + } + + public function testGetMathNames() { + $real = MathHooks::getMathNames(); + $this->assertEquals( 'PNG images', $real['png'] ); + } + +} \ No newline at end of file