PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / trunk
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress vtrunk
4.17.2 4.17.1 4.17.0 4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / third-party / vendor / pelago / emogrifier / src / HtmlProcessor / HtmlPruner.php
wp-user-avatar / third-party / vendor / pelago / emogrifier / src / HtmlProcessor Last commit date
AbstractHtmlProcessor.php 6 days ago CssToAttributeConverter.php 6 days ago CssVariableEvaluator.php 6 days ago HtmlNormalizer.php 6 days ago HtmlPruner.php 6 days ago
HtmlPruner.php
119 lines
1 <?php
2
3 declare (strict_types=1);
4 namespace ProfilePressVendor\Pelago\Emogrifier\HtmlProcessor;
5
6 use ProfilePressVendor\Pelago\Emogrifier\CssInliner;
7 use ProfilePressVendor\Pelago\Emogrifier\Utilities\ArrayIntersector;
8 use function ProfilePressVendor\Safe\preg_match_all;
9 use function ProfilePressVendor\Safe\preg_split;
10 /**
11 * This class can remove things from HTML.
12 */
13 final class HtmlPruner extends AbstractHtmlProcessor
14 {
15 /**
16 * We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only
17 * supports XPath 1.0, lower-case() isn't available to us. We've thus far only set attributes to lowercase,
18 * not attribute values. Consequently, we need to translate() the letters that would be in 'NONE' ("NOE")
19 * to lowercase.
20 */
21 private const DISPLAY_NONE_MATCHER = '//*[@style and contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")' . ' and not(@class and contains(concat(" ", normalize-space(@class), " "), " -emogrifier-keep "))]';
22 /**
23 * Removes elements that have a "display: none;" style.
24 *
25 * @return $this
26 */
27 public function removeElementsWithDisplayNone(): self
28 {
29 $elementsWithStyleDisplayNone = $this->getXPath()->query(self::DISPLAY_NONE_MATCHER);
30 if ($elementsWithStyleDisplayNone->length === 0) {
31 return $this;
32 }
33 foreach ($elementsWithStyleDisplayNone as $element) {
34 $parentNode = $element->parentNode;
35 if ($parentNode !== null) {
36 $parentNode->removeChild($element);
37 }
38 }
39 return $this;
40 }
41 /**
42 * Removes classes that are no longer required (e.g. because there are no longer any CSS rules that reference them)
43 * from `class` attributes.
44 *
45 * Note that this does not inspect the CSS, but expects to be provided with a list of classes that are still in use.
46 *
47 * This method also has the (presumably beneficial) side-effect of minifying (removing superfluous whitespace from)
48 * `class` attributes.
49 *
50 * @param array<array-key, string> $classesToKeep names of classes that should not be removed
51 *
52 * @return $this
53 */
54 public function removeRedundantClasses(array $classesToKeep = []): self
55 {
56 /** @var \DOMNodeList<\DOMElement> $elementsWithClassAttribute */
57 $elementsWithClassAttribute = $this->getXPath()->query('//*[@class]');
58 if ($classesToKeep !== []) {
59 $this->removeClassesFromElements($elementsWithClassAttribute, $classesToKeep);
60 } else {
61 // Avoid unnecessary processing if there are no classes to keep.
62 $this->removeClassAttributeFromElements($elementsWithClassAttribute);
63 }
64 return $this;
65 }
66 /**
67 * Removes classes from the `class` attribute of each element in `$elements`, except any in `$classesToKeep`,
68 * removing the `class` attribute itself if the resultant list is empty.
69 *
70 * @param \DOMNodeList<\DOMElement> $elements
71 * @param array<array-key, string> $classesToKeep
72 */
73 private function removeClassesFromElements(\DOMNodeList $elements, array $classesToKeep): void
74 {
75 $classesToKeepIntersector = new ArrayIntersector($classesToKeep);
76 foreach ($elements as $element) {
77 $elementClasses = preg_split('/\s++/', \trim($element->getAttribute('class')));
78 $elementClassesToKeep = $classesToKeepIntersector->intersectWith($elementClasses);
79 if ($elementClassesToKeep !== []) {
80 $element->setAttribute('class', \implode(' ', $elementClassesToKeep));
81 } else {
82 $element->removeAttribute('class');
83 }
84 }
85 }
86 /**
87 * @param \DOMNodeList<\DOMElement> $elements
88 */
89 private function removeClassAttributeFromElements(\DOMNodeList $elements): void
90 {
91 foreach ($elements as $element) {
92 $element->removeAttribute('class');
93 }
94 }
95 /**
96 * After CSS has been inlined, there will likely be some classes in `class` attributes that are no longer referenced
97 * by any remaining (uninlinable) CSS. This method removes such classes.
98 *
99 * Note that it does not inspect the remaining CSS, but uses information readily available from the `CssInliner`
100 * instance about the CSS rules that could not be inlined.
101 *
102 * @param CssInliner $cssInliner object instance that performed the CSS inlining
103 *
104 * @return $this
105 *
106 * @throws \BadMethodCallException if `inlineCss` has not first been called on `$cssInliner`
107 */
108 public function removeRedundantClassesAfterCssInlined(CssInliner $cssInliner): self
109 {
110 $classesToKeepAsKeys = [];
111 foreach ($cssInliner->getMatchingUninlinableSelectors() as $selector) {
112 preg_match_all('/\.(-?+[_a-zA-Z][\w\-]*+)/', $selector, $matches);
113 $classesToKeepAsKeys += \array_fill_keys($matches[1], \true);
114 }
115 $this->removeRedundantClasses(\array_keys($classesToKeepAsKeys));
116 return $this;
117 }
118 }
119