PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / pelago / emogrifier / src / Css / CssDocument.php
mailpoet / vendor-prefixed / pelago / emogrifier / src / Css Last commit date
CssDocument.php 2 years ago StyleRule.php 2 years ago index.php 2 years ago
CssDocument.php
108 lines
1 <?php
2 declare (strict_types=1);
3 namespace MailPoetVendor\Pelago\Emogrifier\Css;
4 if (!defined('ABSPATH')) exit;
5 use MailPoetVendor\Sabberworm\CSS\CSSList\AtRuleBlockList as CssAtRuleBlockList;
6 use MailPoetVendor\Sabberworm\CSS\CSSList\Document as SabberwormCssDocument;
7 use MailPoetVendor\Sabberworm\CSS\Parser as CssParser;
8 use MailPoetVendor\Sabberworm\CSS\Property\AtRule as CssAtRule;
9 use MailPoetVendor\Sabberworm\CSS\Property\Charset as CssCharset;
10 use MailPoetVendor\Sabberworm\CSS\Property\Import as CssImport;
11 use MailPoetVendor\Sabberworm\CSS\Renderable as CssRenderable;
12 use MailPoetVendor\Sabberworm\CSS\RuleSet\DeclarationBlock as CssDeclarationBlock;
13 use MailPoetVendor\Sabberworm\CSS\RuleSet\RuleSet as CssRuleSet;
14 use MailPoetVendor\Sabberworm\CSS\Settings as ParserSettings;
15 class CssDocument
16 {
17 private $sabberwormCssDocument;
18 private $isImportRuleAllowed = \true;
19 public function __construct(string $css, bool $debug)
20 {
21 // CSS Parser currently throws exception with nested at-rules (like `@media`) in strict parsing mode
22 $parserSettings = ParserSettings::create()->withLenientParsing(!$debug || $this->hasNestedAtRule($css));
23 // CSS Parser currently throws exception with non-empty whitespace-only CSS in strict parsing mode, so `trim()`
24 // @see https://github.com/sabberworm/PHP-CSS-Parser/issues/349
25 $this->sabberwormCssDocument = (new CssParser(\trim($css), $parserSettings))->parse();
26 }
27 private function hasNestedAtRule(string $css) : bool
28 {
29 return \preg_match('/@(?:media|supports|(?:-webkit-|-moz-|-ms-|-o-)?+(keyframes|document))\\b/', $css) === 1;
30 }
31 public function getStyleRulesData(array $allowedMediaTypes) : array
32 {
33 $ruleMatches = [];
34 foreach ($this->sabberwormCssDocument->getContents() as $rule) {
35 if ($rule instanceof CssAtRuleBlockList) {
36 $containingAtRule = $this->getFilteredAtIdentifierAndRule($rule, $allowedMediaTypes);
37 if (\is_string($containingAtRule)) {
38 foreach ($rule->getContents() as $nestedRule) {
39 if ($nestedRule instanceof CssDeclarationBlock) {
40 $ruleMatches[] = new StyleRule($nestedRule, $containingAtRule);
41 }
42 }
43 }
44 } elseif ($rule instanceof CssDeclarationBlock) {
45 $ruleMatches[] = new StyleRule($rule);
46 }
47 }
48 return $ruleMatches;
49 }
50 public function renderNonConditionalAtRules() : string
51 {
52 $this->isImportRuleAllowed = \true;
53 $cssContents = $this->sabberwormCssDocument->getContents();
54 $atRules = \array_filter($cssContents, [$this, 'isValidAtRuleToRender']);
55 if ($atRules === []) {
56 return '';
57 }
58 $atRulesDocument = new SabberwormCssDocument();
59 $atRulesDocument->setContents($atRules);
60 return $atRulesDocument->render();
61 }
62 private function getFilteredAtIdentifierAndRule(CssAtRuleBlockList $rule, array $allowedMediaTypes) : ?string
63 {
64 $result = null;
65 if ($rule->atRuleName() === 'media') {
66 $mediaQueryList = $rule->atRuleArgs();
67 [$mediaType] = \explode('(', $mediaQueryList, 2);
68 if (\trim($mediaType) !== '') {
69 $escapedAllowedMediaTypes = \array_map(static function (string $allowedMediaType) : string {
70 return \preg_quote($allowedMediaType, '/');
71 }, $allowedMediaTypes);
72 $mediaTypesMatcher = \implode('|', $escapedAllowedMediaTypes);
73 $isAllowed = \preg_match('/^\\s*+(?:only\\s++)?+(?:' . $mediaTypesMatcher . ')/i', $mediaType) > 0;
74 } else {
75 $isAllowed = \true;
76 }
77 if ($isAllowed) {
78 $result = '@media ' . $mediaQueryList;
79 }
80 }
81 return $result;
82 }
83 private function isValidAtRuleToRender(CssRenderable $rule) : bool
84 {
85 if ($rule instanceof CssCharset) {
86 return \false;
87 }
88 if ($rule instanceof CssImport) {
89 return $this->isImportRuleAllowed;
90 }
91 $this->isImportRuleAllowed = \false;
92 if (!$rule instanceof CssAtRule) {
93 return \false;
94 }
95 switch ($rule->atRuleName()) {
96 case 'media':
97 $result = \false;
98 break;
99 case 'font-face':
100 $result = $rule instanceof CssRuleSet && $rule->getRules('font-family') !== [] && $rule->getRules('src') !== [];
101 break;
102 default:
103 $result = \true;
104 }
105 return $result;
106 }
107 }
108