setMwGlobals( 'wgTidyInternal', $tidySupport->isInternal() );
}
/**
* @dataProvider getHtmlData
*
* @param string $input
* @param string $expectedText
* @param array $expectedRemoved
* @param callable|bool $callback
*/
public function testTransform( $input, $expectedText,
$expectedRemoved = array(), $callback = false
) {
$input = self::normalize( $input );
$formatter = new HtmlFormatter( HtmlFormatter::wrapHTML( $input ) );
if ( $callback ) {
$callback( $formatter );
}
$removedElements = $formatter->filterContent();
$html = $formatter->getText();
$removed = array();
foreach ( $removedElements as $removedElement ) {
$removed[] = self::normalize( $formatter->getText( $removedElement ) );
}
$expectedRemoved = array_map( 'self::normalize', $expectedRemoved );
$this->assertValidHtmlSnippet( $html );
$this->assertEquals( self::normalize( $expectedText ), self::normalize( $html ) );
$this->assertEquals( asort( $expectedRemoved ), asort( $removed ) );
}
private static function normalize( $s ) {
return str_replace( "\n", '',
str_replace( "\r", '', $s ) // "yay" to Windows!
);
}
public function getHtmlData() {
$removeImages = function ( HtmlFormatter $f ) {
$f->setRemoveMedia();
};
$removeTags = function ( HtmlFormatter $f ) {
$f->remove( array( 'table', '.foo', '#bar', 'div.baz' ) );
};
$flattenSomeStuff = function ( HtmlFormatter $f ) {
$f->flatten( array( 's', 'div' ) );
};
$flattenEverything = function ( HtmlFormatter $f ) {
$f->flattenAllTags();
};
return array(
// remove images if asked
array(
'',
'',
array( '' ),
$removeImages,
),
// basic tag removal
array(
// @codingStandardsIgnoreStart Ignore long line warnings.
'
foo
foo
bar
foobartest
baz',
// @codingStandardsIgnoreEnd
'test
baz',
array(
'',
'foo
',
'foo
',
'bar',
'foobar',
'',
),
$removeTags,
),
// don't flatten tags that start like chosen ones
array(
'foo bar
',
'foo bar',
array(),
$flattenSomeStuff,
),
// total flattening
array(
'bar2
',
'bar2',
array(),
$flattenEverything,
),
// UTF-8 preservation and security
array(
'<Тест!> &<&&&&',
'<Тест!> &<&&&&',
array(),
$removeTags, // Have some rules to trigger a DOM parse
),
// https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
array(
'Foo[1]'
. ' Bar',
'Foo[1]'
. ' Bar',
),
);
}
public function testQuickProcessing() {
$f = new MockHtmlFormatter( 'foo' );
$f->filterContent();
$this->assertFalse( $f->hasDoc, 'HtmlFormatter should not needlessly parse HTML' );
}
}
class MockHtmlFormatter extends HtmlFormatter {
public $hasDoc = false;
public function getDoc() {
$this->hasDoc = true;
return parent::getDoc();
}
}