mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Math
synced 2024-12-22 12:22:39 +00:00
cc0a214f56
Chrome and similar browsers do not support the menclose tag. This change introduces a css polyfill suggested in https://github.com/w3c/mathml-core/issues/245#issuecomment-2410676518 but keeps the mencose rendering since FF does not support the polyfill https://bugzilla.mozilla.org/show_bug.cgi?id=1929800 Bug: T376829 Change-Id: I860e2f2f9bf9eef8eeba35b0999ec50175fdfc4b
203 lines
6.4 KiB
PHP
203 lines
6.4 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Extension\Math\Tests\WikiTexVC\MMLmappings;
|
|
|
|
use MediaWiki\Extension\Math\WikiTexVC\MMLmappings\BaseParsing;
|
|
use MediaWiki\Extension\Math\WikiTexVC\Nodes\DQ;
|
|
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Fun1;
|
|
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Literal;
|
|
use MediaWiki\Extension\Math\WikiTexVC\Nodes\Matrix;
|
|
use MediaWiki\Extension\Math\WikiTexVC\Nodes\TexArray;
|
|
use MediaWiki\Extension\Math\WikiTexVC\TexVC;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* @covers \MediaWiki\Extension\Math\WikiTexVC\MMLmappings\BaseParsing
|
|
*/
|
|
class BaseParsingTest extends TestCase {
|
|
|
|
public function testAccent() {
|
|
$node = new Fun1(
|
|
'\\widetilde',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::accent( $node, [], null, 'widetilde', '007E' );
|
|
$this->assertStringContainsString( '~', $result );
|
|
$this->assertStringContainsString( 'mover', $result );
|
|
}
|
|
|
|
public function testAccentArgPassing() {
|
|
$node = new Fun1(
|
|
'\\widetilde',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::accent( $node, [ 'k' => 'v' ], null, 'widetilde', '007E' );
|
|
$this->assertStringContainsString( '<mi k="v"', $result );
|
|
}
|
|
|
|
public function testArray() {
|
|
$node = new Matrix( 'matrix',
|
|
new TexArray( new TexArray( new Literal( 'a' ) ) ) );
|
|
|
|
$result = BaseParsing::array( $node, [], null, 'array', '007E' );
|
|
$this->assertStringContainsString( '<mi>a</mi>', $result );
|
|
}
|
|
|
|
public function testBoldGreek() {
|
|
$node = new Fun1(
|
|
'\\boldsymbol',
|
|
( new Literal( '\\alpha' ) )
|
|
);
|
|
$result = BaseParsing::boldsymbol( $node, [], null, 'boldsymbol' );
|
|
$this->assertStringContainsString( 'mathvariant="bold-italic"', $result );
|
|
}
|
|
|
|
public function testBoldSymbol() {
|
|
$node = new Fun1(
|
|
'\\boldsymbol',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::boldsymbol( $node, [], null, 'boldsymbol' );
|
|
$this->assertStringContainsString( 'mathvariant="bold-italic"', $result );
|
|
}
|
|
|
|
public function testCancel() {
|
|
$node = new Fun1(
|
|
'\\cancel',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::cancel( $node, [], null, 'cancel', 'something' );
|
|
$this->assertStringContainsString( '<mi>a</mi><mrow class="menclose-something"/>',
|
|
$result );
|
|
$this->assertStringContainsString( '<menclose notation="something" class="menclose">',
|
|
$result );
|
|
}
|
|
|
|
public function testUnderOver() {
|
|
$node = new Fun1(
|
|
'\\overline',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::underover( $node, [], null, 'oXXX', '00AF' );
|
|
$this->assertStringStartsWith( '<mrow', $result );
|
|
$this->assertStringContainsString( 'mover', $result );
|
|
}
|
|
|
|
public function testUnderOverUnder() {
|
|
$node = new Fun1(
|
|
'\\overline',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::underover( $node, [], null, 'uXXX', '00AF' );
|
|
$this->assertStringContainsString( 'munder', $result );
|
|
}
|
|
|
|
public function testUnderOverDqUnder() {
|
|
$node = new DQ(
|
|
( new Literal( 'a' ) ),
|
|
( new Literal( 'b' ) )
|
|
);
|
|
$result = BaseParsing::underover( $node, [], null, 'uXXX', '00AF' );
|
|
$this->assertStringContainsString( 'munder', $result );
|
|
$this->assertStringContainsString( 'mrow', $result );
|
|
}
|
|
|
|
public function testUnderArgPassing() {
|
|
$node = new Fun1(
|
|
'\\overline',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::underover( $node, [ 'k' => 'v' ], null, 'oXXX', '00AF' );
|
|
$this->assertStringContainsString( '<mi k="v"', $result );
|
|
}
|
|
|
|
public function testUnderBadArgPassing() {
|
|
$node = new Fun1(
|
|
'\\overline',
|
|
( new Literal( 'a' ) )
|
|
);
|
|
$result = BaseParsing::underover( $node,
|
|
[ 'k' => '"<script>alert("problem")</script>"' ], null, 'oXXX', '00AF' );
|
|
$this->assertStringContainsString( 'k=""<script>alert("problem")', $result );
|
|
}
|
|
|
|
public function testAlignAt() {
|
|
$matrix = new Matrix( 'alignat',
|
|
new TexArray( new TexArray( new Literal( '\\sin' ) ) ) );
|
|
$result = BaseParsing::alignAt( $matrix, [], null, 'alignat', '002A' );
|
|
$this->assertStringContainsString( 'mtable', $result );
|
|
}
|
|
|
|
public function testHLineTop() {
|
|
$matrix = new Matrix( 'matrix',
|
|
new TexArray( new TexArray( new TexArray( new Literal( '\\hline ' ), new Literal( 'a'
|
|
) ) ) ) );
|
|
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
|
|
$this->assertStringContainsString( 'top', $result );
|
|
}
|
|
|
|
public function testHLineBottom() {
|
|
$matrix = new Matrix( 'matrix',
|
|
new TexArray( new TexArray( new Literal( 'a' ) ),
|
|
new TexArray( new TexArray( new Literal( '\\hline ' ) ) ) ) );
|
|
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
|
|
$this->assertStringContainsString( 'bottom', $result );
|
|
$this->assertStringContainsString( '<mi>a</mi>', $result );
|
|
}
|
|
|
|
public function testHLineLastLine() {
|
|
$matrix = new Matrix( 'matrix',
|
|
new TexArray( new TexArray( new Literal( 'a' ) ),
|
|
new TexArray( new TexArray( new Literal( '\\hline ' ), new Literal( 'a'
|
|
) ) ) ) );
|
|
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
|
|
$this->assertStringContainsString( 'class="mwe-math-matrix-top"', $result );
|
|
$this->assertStringContainsString( '<mi>a</mi>', $result );
|
|
}
|
|
|
|
public function testComplicatedHline() {
|
|
$matrix = ( new TexVC() )->parse( '\\begin{array}{c}
|
|
\\hline a\\\\
|
|
\\hline 1\\\\
|
|
2\\\\
|
|
\\hline
|
|
\\end{array}' )[0];
|
|
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
|
|
$this->assertStringContainsString( 'class="mwe-math-matrix-top"', $result );
|
|
$this->assertStringContainsString( 'class="mwe-math-matrix-top mwe-math-matrix-bottom"', $result );
|
|
}
|
|
|
|
public function testHandleOperatorName() {
|
|
$node = new Fun1(
|
|
'\\operatorname',
|
|
( new Literal( 'sn' ) )
|
|
);
|
|
$result = BaseParsing::handleOperatorName( $node, [], [
|
|
"foundNamedFct" => [ true, true ]
|
|
], 'operatorname' );
|
|
$this->assertStringContainsString( 'sn</mi>', $result );
|
|
$this->assertStringContainsString( '<mo>⁡</mo>', $result );
|
|
}
|
|
|
|
public function testHandleOperatorLast() {
|
|
$node = new Fun1(
|
|
'\\operatorname',
|
|
( new Literal( 'sn' ) )
|
|
);
|
|
$result = BaseParsing::handleOperatorName( $node, [], [
|
|
"foundNamedFct" => [ true, false ]
|
|
], 'operatorname' );
|
|
$this->assertStringContainsString( 'sn</mi>', $result );
|
|
$this->assertStringNotContainsString( '<mo>⁡</mo>', $result );
|
|
}
|
|
|
|
public function testColumnSpecs() {
|
|
$matrix = ( new TexVC() )->parse( '\\begin{array}{lcr}
|
|
z & = & a \\\\
|
|
f(x,y,z) & = & x + y + z
|
|
\\end{array}' )[0];
|
|
$result = BaseParsing::matrix( $matrix, [], null, 'matrix', '002A' );
|
|
$this->assertStringContainsString( 'left center right ', $result );
|
|
}
|
|
}
|