Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
DedupeStyles
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 1
 dedupe
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2declare( strict_types = 1 );
3
4namespace Wikimedia\Parsoid\Wt2Html\DOM\Handlers;
5
6use Wikimedia\Assert\Assert;
7use Wikimedia\Parsoid\DOM\Element;
8use Wikimedia\Parsoid\Utils\DOMCompat;
9use Wikimedia\Parsoid\Utils\DOMDataUtils;
10use Wikimedia\Parsoid\Utils\DOMUtils;
11use Wikimedia\Parsoid\Utils\DTState;
12
13class 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}