mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Math
synced 2024-12-19 02:50:44 +00:00
f534146597
In MathML outer table boarders are represented with the notation attribute of an menclose element. The inner boarders are represented by the rowlines attribute of the mtable element. The rowline element accepts a space seperated list of row boarders. In LaTeX the bottom line is represented by a new matrix row that only contains \hline. This change discover \hline elements in matrix cells and then determines if it is in the first or last line. When it is in the last line, the line is removed to avoid an empty <mtr /> in the output. Bug: T366417 Change-Id: I196e0d14a183a63696363f9e3006cf65571dc56c
160 lines
5 KiB
PHP
160 lines
5 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 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( '<menclose notation="something"><mi>a</mi></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( 'solid', $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( 'solid none', $result );
|
|
$this->assertStringContainsString( 'top bottom', $result );
|
|
}
|
|
|
|
}
|