Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 24 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 1 |
| DedupeStyles | |
0.00% |
0 / 24 |
|
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 1 |
| dedupe | |
0.00% |
0 / 24 |
|
0.00% |
0 / 1 |
20 | |||
| 1 | <?php |
| 2 | declare( strict_types = 1 ); |
| 3 | |
| 4 | namespace Wikimedia\Parsoid\Wt2Html\DOM\Handlers; |
| 5 | |
| 6 | use Wikimedia\Assert\Assert; |
| 7 | use Wikimedia\Parsoid\DOM\Element; |
| 8 | use Wikimedia\Parsoid\Utils\DOMCompat; |
| 9 | use Wikimedia\Parsoid\Utils\DOMDataUtils; |
| 10 | use Wikimedia\Parsoid\Utils\DOMUtils; |
| 11 | use Wikimedia\Parsoid\Utils\DTState; |
| 12 | |
| 13 | class DedupeStyles { |
| 14 | |
| 15 | /** |
| 16 | * @param Element $node |
| 17 | * @param DTState $state |
| 18 | * @return bool|Element |
| 19 | */ |
| 20 | public static function dedupe( Element $node, DTState $state ) { |
| 21 | // Don't run on embedded docs for now since we don't want the |
| 22 | // canonical styles to be introduced in embedded HTML which means |
| 23 | // they will get lost wrt the top level document. |
| 24 | Assert::invariant( $state->atTopLevel, 'This pass should only be run on the top-level' ); |
| 25 | |
| 26 | $key = DOMCompat::getAttribute( $node, 'data-mw-deduplicate' ); |
| 27 | if ( $key === null ) { |
| 28 | // Not a templatestyles <style> tag |
| 29 | return true; |
| 30 | } |
| 31 | |
| 32 | $env = $state->env; |
| 33 | if ( !isset( $env->styleTagKeys[$key] ) ) { |
| 34 | // Not a dupe |
| 35 | $env->styleTagKeys[$key] = true; |
| 36 | return true; |
| 37 | } |
| 38 | |
| 39 | if ( !DOMUtils::isFosterablePosition( $node ) ) { |
| 40 | // Dupe - replace with a placeholder <link> reference |
| 41 | $link = $node->ownerDocument->createElement( 'link' ); |
| 42 | DOMUtils::addRel( $link, 'mw-deduplicated-inline-style' ); |
| 43 | $link->setAttribute( 'href', 'mw-data:' . $key ); |
| 44 | $link->setAttribute( 'about', DOMCompat::getAttribute( $node, 'about' ) ?? '' ); |
| 45 | $link->setAttribute( 'typeof', DOMCompat::getAttribute( $node, 'typeof' ) ?? '' ); |
| 46 | DOMDataUtils::setDataParsoid( $link, DOMDataUtils::getDataParsoid( $node ) ); |
| 47 | DOMDataUtils::setDataMw( $link, DOMDataUtils::getDataMw( $node ) ); |
| 48 | $node->parentNode->replaceChild( $link, $node ); |
| 49 | return $link; |
| 50 | } else { |
| 51 | $env->log( 'info/wt2html/templatestyle', |
| 52 | 'Duplicate style tag found in fosterable position. ' . |
| 53 | 'Not deduping it, but emptying out the style tag for performance reasons.' |
| 54 | ); |
| 55 | DOMCompat::replaceChildren( $node ); |
| 56 | return true; |
| 57 | } |
| 58 | } |
| 59 | } |