Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 20 |
DedupeStyles | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 20 |
dedupe | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 20 |
<?php | |
declare( strict_types = 1 ); | |
namespace Wikimedia\Parsoid\Wt2Html\PP\Handlers; | |
use Wikimedia\Parsoid\Config\Env; | |
use Wikimedia\Parsoid\DOM\Element; | |
use Wikimedia\Parsoid\Utils\DOMCompat; | |
use Wikimedia\Parsoid\Utils\DOMDataUtils; | |
use Wikimedia\Parsoid\Utils\DOMUtils; | |
class DedupeStyles { | |
/** | |
* @param Element $node | |
* @param Env $env | |
* @return bool|Element | |
*/ | |
public static function dedupe( Element $node, Env $env ) { | |
if ( !$node->hasAttribute( 'data-mw-deduplicate' ) ) { | |
// Not a templatestyles <style> tag | |
return true; | |
} | |
$key = $node->getAttribute( 'data-mw-deduplicate' ); | |
if ( !isset( $env->styleTagKeys[$key] ) ) { | |
// Not a dupe | |
$env->styleTagKeys[$key] = true; | |
return true; | |
} | |
if ( !DOMUtils::isFosterablePosition( $node ) ) { | |
// Dupe - replace with a placeholder <link> reference | |
$link = $node->ownerDocument->createElement( 'link' ); | |
$link->setAttribute( 'rel', 'mw-deduplicated-inline-style' ); | |
$link->setAttribute( 'href', 'mw-data:' . $key ); | |
$link->setAttribute( 'about', $node->getAttribute( 'about' ) ?? '' ); | |
$link->setAttribute( 'typeof', $node->getAttribute( 'typeof' ) ?? '' ); | |
DOMDataUtils::setDataParsoid( $link, DOMDataUtils::getDataParsoid( $node ) ); | |
DOMDataUtils::setDataMw( $link, DOMDataUtils::getDataMw( $node ) ); | |
$node->parentNode->replaceChild( $link, $node ); | |
return $link; | |
} else { | |
$env->log( 'info/wt2html/templatestyle', | |
'Duplicate style tag found in fosterable position. ' . | |
'Not deduping it, but emptying out the style tag for performance reasons.' | |
); | |
DOMCompat::replaceChildren( $node ); | |
return true; | |
} | |
} | |
} |