@@ -53,6 +53,11 @@ class HTML5DOMDocument extends \DOMDocument
53
53
*/
54
54
const OPTIMIZE_HEAD = 32 ;
55
55
56
+ /**
57
+ * A modification (passed to modify()) that removes all but first styles with duplicate content.
58
+ */
59
+ const FIX_DUPLICATE_STYLES = 64 ;
60
+
56
61
/**
57
62
*
58
63
* @var array
@@ -612,6 +617,7 @@ public function insertHTMLMulti(array $sources)
612
617
* - HTML5DOMDocument::FIX_MULTIPLE_HEADS - merges multiple head elements.
613
618
* - HTML5DOMDocument::FIX_MULTIPLE_BODIES - merges multiple body elements.
614
619
* - HTML5DOMDocument::OPTIMIZE_HEAD - moves charset metatag and title elements first.
620
+ * - HTML5DOMDocument::FIX_DUPLICATE_STYLES - removes all but first styles with duplicate content.
615
621
*/
616
622
public function modify ($ modifications = 0 )
617
623
{
@@ -621,6 +627,7 @@ public function modify($modifications = 0)
621
627
$ fixMultipleHeads = ($ modifications & self ::FIX_MULTIPLE_HEADS ) !== 0 ;
622
628
$ fixMultipleBodies = ($ modifications & self ::FIX_MULTIPLE_BODIES ) !== 0 ;
623
629
$ optimizeHead = ($ modifications & self ::OPTIMIZE_HEAD ) !== 0 ;
630
+ $ fixDuplicateStyles = ($ modifications & self ::FIX_DUPLICATE_STYLES ) !== 0 ;
624
631
625
632
/** @var \DOMNodeList<HTML5DOMElement> */
626
633
$ headElements = $ this ->getElementsByTagName ('head ' );
@@ -696,6 +703,27 @@ public function modify($modifications = 0)
696
703
}
697
704
}
698
705
706
+ if ($ fixDuplicateStyles ) {
707
+ $ styles = $ headElement ->getElementsByTagName ('style ' );
708
+ if ($ styles ->length > 0 ) {
709
+ $ stylesToRemove = [];
710
+ $ list = [];
711
+ foreach ($ styles as $ style ) {
712
+ $ innerHTML = trim ($ style ->innerHTML );
713
+ if (array_search ($ innerHTML , $ list ) === false ) {
714
+ $ list [] = $ innerHTML ;
715
+ } else {
716
+ $ stylesToRemove [] = $ style ;
717
+ }
718
+ }
719
+ foreach ($ stylesToRemove as $ styleToRemove ) {
720
+ $ styleToRemove ->parentNode ->removeChild ($ styleToRemove );
721
+ }
722
+ unset($ list );
723
+ }
724
+ unset($ styles );
725
+ }
726
+
699
727
if ($ optimizeHead ) { // Moves charset metatag and title elements first.
700
728
$ titleElement = $ headElement ->getElementsByTagName ('title ' )->item (0 );
701
729
$ hasTitleElement = false ;
0 commit comments