Merge "Fix issues with DQ"

This commit is contained in:
jenkins-bot 2023-04-20 16:07:27 +00:00 committed by Gerrit Code Review
commit be27ddb2f1
5 changed files with 88 additions and 36 deletions

View file

@ -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' ],

View file

@ -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;
}

View file

@ -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":

View file

@ -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 ) {

View file

@ -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}}";