mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Math
synced 2024-09-23 10:21:31 +00:00
Merge "Fix issues with DQ"
This commit is contained in:
commit
be27ddb2f1
|
@ -553,7 +553,7 @@ class BaseMappings {
|
|||
"(0, lengths_js_1.em)(MathSpace::thickmathspace)", '.5em', 'D' ],
|
||||
"displaylines" => [ 'matrix', null, null, 'center', null, '.5em', 'D' ],
|
||||
"cr" => 'Cr',
|
||||
'\\' => 'crLaTeX',
|
||||
"\\" => 'crLaTeX',
|
||||
"newline" => [ 'crLaTeX', true ],
|
||||
"hline" => [ 'hline', 'solid' ],
|
||||
"hdashline" => [ 'hline', 'dashed' ],
|
||||
|
|
|
@ -8,6 +8,7 @@ use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmerror;
|
|||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmi;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmo;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmrow;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmspace;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmstyle;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmtext;
|
||||
use MediaWiki\Extension\Math\TexVC\Nodes\TexNode;
|
||||
|
@ -123,8 +124,8 @@ class BaseMethods {
|
|||
$mmlMo = new MMLmo();
|
||||
return $mmlMo->encapsulate( ">" );
|
||||
case "\\":
|
||||
$mmlMtext = new MMLmtext();
|
||||
return $mmlMtext->encapsulate( " " );
|
||||
$mspace = new MMLmspace( "", [ "linebreak" => "newline" ] );
|
||||
return $mspace->getEmpty();
|
||||
}
|
||||
return $input;
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ use MediaWiki\Extension\Math\TexVC\Nodes\Curly;
|
|||
use MediaWiki\Extension\Math\TexVC\Nodes\DQ;
|
||||
use MediaWiki\Extension\Math\TexVC\Nodes\FQ;
|
||||
use MediaWiki\Extension\Math\TexVC\Nodes\Fun1nb;
|
||||
use MediaWiki\Extension\Math\TexVC\Nodes\Fun2;
|
||||
use MediaWiki\Extension\Math\TexVC\Nodes\Fun2sq;
|
||||
use MediaWiki\Extension\Math\TexVC\Nodes\Literal;
|
||||
use MediaWiki\Extension\Math\TexVC\Nodes\TexArray;
|
||||
|
@ -302,11 +303,8 @@ class BaseParsing {
|
|||
$moL = new MMLmo( "", $styleAttr );
|
||||
$output .= $mrowOpen->encapsulateRaw( $moL->encapsulateRaw( $left ) );
|
||||
}
|
||||
// when is mrow encapsulating and when not ?
|
||||
//$output .= $frac->encapsulate(
|
||||
// $mrow->encapsulate($node->getArg1()->renderMML()) .$mrow->encapsulate( $node->getArg2()->renderMML() ));
|
||||
$output .= $frac->encapsulateRaw( $node->getArg1()->renderMML() . $node->getArg2()->renderMML() );
|
||||
|
||||
$output .= $frac->encapsulateRaw( $mrow->encapsulateRaw( $node->getArg1()->renderMML() ) .
|
||||
$mrow->encapsulateRaw( $node->getArg2()->renderMML() ) );
|
||||
if ( $right ) {
|
||||
$mrowClose = new MMLmrow( TexClass::CLOSE );
|
||||
$moR = new MMLmo( "", $styleAttr );
|
||||
|
@ -325,9 +323,19 @@ class BaseParsing {
|
|||
public static function frac( $node, $passedArgs, $operatorContent, $name ) {
|
||||
$mrow = new MMLmrow();
|
||||
$mfrac = new MMLmfrac();
|
||||
// if node is Fun1
|
||||
$inner = $mrow->encapsulateRaw( $node->getArg1()->renderMML() ) .
|
||||
$mrow->encapsulateRaw( $node->getArg2()->renderMML() );
|
||||
if ( $node instanceof Fun2 ) {
|
||||
$inner = $mrow->encapsulateRaw( $node->getArg1()->renderMML() ) .
|
||||
$mrow->encapsulateRaw( $node->getArg2()->renderMML() );
|
||||
} elseif ( $node instanceof DQ ) {
|
||||
$inner = $mrow->encapsulateRaw( $node->getBase()->renderMML() ) .
|
||||
$mrow->encapsulateRaw( $node->getDown()->renderMML() );
|
||||
} else {
|
||||
$inner = "";
|
||||
foreach ( $node->getArgs() as $arg ) {
|
||||
$rendered = is_string( $arg ) ? $arg : $arg->renderMML();
|
||||
$inner .= $mrow->encapsulateRaw( $rendered );
|
||||
}
|
||||
}
|
||||
return $mrow->encapsulateRaw( $mfrac->encapsulateRaw( $inner ) );
|
||||
}
|
||||
|
||||
|
@ -404,10 +412,17 @@ class BaseParsing {
|
|||
$mmlRowInner = new MMLmrow( TexClass::REL );
|
||||
$mover = new MMLmover();
|
||||
$mmlRowArg2 = new MMLmrow( TexClass::OP );
|
||||
$inner = $mover->encapsulateRaw( $mmlRowArg2->encapsulateRaw(
|
||||
$node->getArg2()->renderMML() ) .
|
||||
$mmlRow->encapsulateRaw( $node->getArg1()->renderMML() )
|
||||
);
|
||||
if ( $node instanceof DQ ) {
|
||||
$inner = $mover->encapsulateRaw( $mmlRowArg2->encapsulateRaw(
|
||||
$node->getBase()->renderMML() ) .
|
||||
$mmlRow->encapsulateRaw( $node->getDown()->renderMML() )
|
||||
);
|
||||
} else {
|
||||
$inner = $mover->encapsulateRaw( $mmlRowArg2->encapsulateRaw(
|
||||
$node->getArg2()->renderMML() ) .
|
||||
$mmlRow->encapsulateRaw( $node->getArg1()->renderMML() )
|
||||
);
|
||||
}
|
||||
return $mmlRow->encapsulateRaw( $mmlRowInner->encapsulateRaw( $inner ) );
|
||||
case "bmod":
|
||||
$mo = new MMLmo( "", [ "lspace" => Sizes::THICKMATHSPACE, "rspace" => Sizes::THICKMATHSPACE ] );
|
||||
|
@ -562,12 +577,23 @@ class BaseParsing {
|
|||
$attributes = [ "linethickness" => "0" ];
|
||||
|
||||
}
|
||||
$mfrac = new MMLmfrac( "", $attributes ); // "movesupsub"=>"true" activate this also as attribute ?
|
||||
$mfrac = new MMLmfrac( "", $attributes );
|
||||
|
||||
$mrow = new MMLmrow( "", [] ); // tbd remove mathjax specifics,
|
||||
// tbd added a getArg2 mrow which seems correct, consider removiing in some cases ?
|
||||
return $start . $mfrac->encapsulateRaw( $mrow->encapsulateRaw(
|
||||
$node->getArg1()->renderMML() ) . $mrow->encapsulateRaw( $node->getArg2()->renderMML() ) ) . $tail;
|
||||
$mrow = new MMLmrow( "", [] );
|
||||
if ( $node instanceof Fun2 ) {
|
||||
return $start . $mfrac->encapsulateRaw( $mrow->encapsulateRaw(
|
||||
$node->getArg1()->renderMML() ) . $mrow->encapsulateRaw( $node->getArg2()->renderMML() ) )
|
||||
. $tail;
|
||||
}
|
||||
$inner = "";
|
||||
foreach ( $node->getArgs() as $arg ) {
|
||||
if ( $arg === "\\over" ) {
|
||||
continue;
|
||||
}
|
||||
$rendered = $arg instanceof TexNode ? $arg->renderMML() : $arg;
|
||||
$inner .= $mrow->encapsulateRaw( $rendered );
|
||||
}
|
||||
return $start . $mfrac->encapsulateRaw( $inner ) . $tail;
|
||||
}
|
||||
|
||||
public static function oint( $node, $passedArgs, $operatorContent,
|
||||
|
@ -600,8 +626,14 @@ class BaseParsing {
|
|||
public static function overset( $node, $passedArgs, $operatorContent, $name, $id = null ) {
|
||||
$mrow = new MMLmrow( TexClass::ORD, [] ); // tbd remove mathjax specifics
|
||||
$mrow2 = new MMLmrow( "", [] );
|
||||
$inrow = $mrow2->encapsulateRaw( $node->getArg2()->renderMML() );
|
||||
$mover = new MMLmover();
|
||||
|
||||
if ( $node instanceof DQ ) {
|
||||
return $mrow->encapsulateRaw( $mover->encapsulateRaw( $mrow2->encapsulateRaw(
|
||||
$node->getDown()->renderMML() . $node->getDown()->renderMML() ) ) );
|
||||
} else {
|
||||
$inrow = $mrow2->encapsulateRaw( $node->getArg2()->renderMML() );
|
||||
}
|
||||
return $mrow->encapsulateRaw( $mover->encapsulateRaw( $inrow . $node->getArg1()->renderMML() ) );
|
||||
}
|
||||
|
||||
|
@ -871,12 +903,13 @@ class BaseParsing {
|
|||
$mmlMrow = new MMLmrow();
|
||||
$mstyle = new MMLmstyle( "", [ "displaystyle" => "false", "scriptlevel" => "0" ] );
|
||||
$mtext = new MMLmtext();
|
||||
return $mmlMrow->encapsulateRaw( $mstyle->encapsulateRaw(
|
||||
$mtext->encapsulateRaw( $node->getArg() ) ) ); // renderMML for arg ?
|
||||
$inner = $node->getArg() instanceof TexNode ? $node->getArg()->renderMML() : $node->getArg();
|
||||
return $mmlMrow->encapsulateRaw( $mstyle->encapsulateRaw( $mtext->encapsulateRaw( $inner ) ) );
|
||||
case "text":
|
||||
$mmlMrow = new MMLmrow();
|
||||
$mtext = new MMLmtext();
|
||||
return $mmlMrow->encapsulateRaw( $mtext->encapsulateRaw( $node->getArg() ) ); // renderMML for arg ?
|
||||
$inner = $node->getArg() instanceof TexNode ? $node->getArg()->renderMML() : $node->getArg();
|
||||
return $mmlMrow->encapsulateRaw( $mtext->encapsulateRaw( $inner ) );
|
||||
case "textbf":
|
||||
// no break
|
||||
case "textit":
|
||||
|
|
|
@ -4,7 +4,6 @@ declare( strict_types = 1 );
|
|||
|
||||
namespace MediaWiki\Extension\Math\TexVC\Nodes;
|
||||
|
||||
use MediaWiki\Extension\Math\TexVC\MMLmappings\BaseMethods;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLmappings\BaseParsing;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmrow;
|
||||
use MediaWiki\Extension\Math\TexVC\MMLnodes\MMLmsub;
|
||||
|
@ -45,18 +44,14 @@ class DQ extends TexNode {
|
|||
return BaseParsing::limits( $this, $arguments, $state, "" );
|
||||
}
|
||||
|
||||
$res = BaseMethods::checkAndParse( $this->base->getArgs()[0], $arguments, null, $this );
|
||||
if ( $res ) {
|
||||
return $res;
|
||||
} else {
|
||||
|
||||
$emptyMrow = "";
|
||||
// In cases with empty curly preceding like: "{}_pF_q"
|
||||
if ( $this->getBase() instanceof Curly && $this->getBase()->isEmpty() ) {
|
||||
$mrow = new MMLmrow();
|
||||
$emptyMrow = $mrow->getEmpty();
|
||||
}
|
||||
$emptyMrow = "";
|
||||
// In cases with empty curly preceding like: "{}_pF_q"
|
||||
if ( $this->getBase() instanceof Curly && $this->getBase()->isEmpty() ) {
|
||||
$mrow = new MMLmrow();
|
||||
$emptyMrow = $mrow->getEmpty();
|
||||
}
|
||||
|
||||
if ( !$this->isEmpty() ) {
|
||||
// Otherwise use default fallback
|
||||
$mmlMrow = new MMLmrow();
|
||||
$msub = new MMLmsub();
|
||||
|
@ -65,6 +60,8 @@ class DQ extends TexNode {
|
|||
$this->base->renderMML( [], $state ) .
|
||||
$mmlMrow->encapsulateRaw( $this->down->renderMML( [], $state ) ) );
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
public function extractIdentifiers( $args = null ) {
|
||||
|
|
|
@ -186,6 +186,27 @@ class MMLRenderTest extends MediaWikiUnitTestCase {
|
|||
$this->assertStringContainsString( "<mspace linebreak=\"newline\"/>", $mathMLtexVC );
|
||||
}
|
||||
|
||||
public function testGenfracDQ() {
|
||||
$input = "\\binom{m}{k - j}_{\!\!q}";
|
||||
$mathMLtexVC = $this->generateMML( $input );
|
||||
$this->assertStringContainsString( "<mi>q</mi>", $mathMLtexVC );
|
||||
$this->assertStringContainsString( "msub", $mathMLtexVC );
|
||||
}
|
||||
|
||||
public function testDQZeroArgs() {
|
||||
$input = "nF^{_{}}/RT";
|
||||
$mathMLtexVC = $this->generateMML( $input );
|
||||
$this->assertStringContainsString( "msup", $mathMLtexVC );
|
||||
}
|
||||
|
||||
public function testMatrixDQ() {
|
||||
$input = "\\begin{pmatrix} S \\\\Se\\\\Te\\end{pmatrix}_2";
|
||||
$mathMLtexVC = $this->generateMML( $input );
|
||||
$this->assertStringContainsString( "mtable", $mathMLtexVC );
|
||||
$this->assertStringContainsString( "msub", $mathMLtexVC );
|
||||
$this->assertStringContainsString( "<mn>2</mn>", $mathMLtexVC );
|
||||
}
|
||||
|
||||
public function testAttributeDuplicate() {
|
||||
// This checks that there is some non-erronous output caused by double class attributes
|
||||
$input = "\\mu_{\\operatorname{\\inf}}";
|
||||
|
|
Loading…
Reference in a new issue