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( 'Blah', '', array( 'Blah' ), $removeImages, ), // basic tag removal array( // @codingStandardsIgnoreStart Ignore long line warnings. '
foo
foo
foo
bar foobar
test
baz', // @codingStandardsIgnoreEnd '
test
baz', array( '
foo
', '
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(); } }