PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / 4.17.0
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress v4.17.0
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 / Css / CssDocument.php
wp-user-avatar / third-party / vendor / pelago / emogrifier / src / Css Last commit date
CssDocument.php 2 months ago StyleRule.php 2 months ago
CssDocument.php
163 lines
1 <?php
2
3 declare (strict_types=1);
4 namespace ProfilePressVendor\Pelago\Emogrifier\Css;
5
6 use ProfilePressVendor\Sabberworm\CSS\CSSList\AtRuleBlockList as CssAtRuleBlockList;
7 use ProfilePressVendor\Sabberworm\CSS\CSSList\Document as SabberwormCssDocument;
8 use ProfilePressVendor\Sabberworm\CSS\Parser as CssParser;
9 use ProfilePressVendor\Sabberworm\CSS\Property\AtRule as CssAtRule;
10 use ProfilePressVendor\Sabberworm\CSS\Property\Charset as CssCharset;
11 use ProfilePressVendor\Sabberworm\CSS\Property\Import as CssImport;
12 use ProfilePressVendor\Sabberworm\CSS\Renderable as CssRenderable;
13 use ProfilePressVendor\Sabberworm\CSS\RuleSet\DeclarationBlock as CssDeclarationBlock;
14 use ProfilePressVendor\Sabberworm\CSS\RuleSet\RuleSet as CssRuleSet;
15 /**
16 * Parses and stores a CSS document from a string of CSS, and provides methods to obtain the CSS in parts or as data
17 * structures.
18 *
19 * @internal
20 */
21 class CssDocument
22 {
23 /**
24 * @var SabberwormCssDocument
25 */
26 private $sabberwormCssDocument;
27 /**
28 * `@import` rules must precede all other types of rules, except `@charset` rules. This property is used while
29 * rendering at-rules to enforce that.
30 *
31 * @var bool
32 */
33 private $isImportRuleAllowed = \true;
34 /**
35 * @param string $css
36 */
37 public function __construct(string $css)
38 {
39 $cssParser = new CssParser($css);
40 /** @var SabberwormCssDocument $sabberwormCssDocument */
41 $sabberwormCssDocument = $cssParser->parse();
42 $this->sabberwormCssDocument = $sabberwormCssDocument;
43 }
44 /**
45 * Collates the media query, selectors and declarations for individual rules from the parsed CSS, in order.
46 *
47 * @param array<array-key, string> $allowedMediaTypes
48 *
49 * @return array<int, StyleRule>
50 */
51 public function getStyleRulesData(array $allowedMediaTypes): array
52 {
53 $ruleMatches = [];
54 /** @var CssRenderable $rule */
55 foreach ($this->sabberwormCssDocument->getContents() as $rule) {
56 if ($rule instanceof CssAtRuleBlockList) {
57 $containingAtRule = $this->getFilteredAtIdentifierAndRule($rule, $allowedMediaTypes);
58 if (\is_string($containingAtRule)) {
59 /** @var CssRenderable $nestedRule */
60 foreach ($rule->getContents() as $nestedRule) {
61 if ($nestedRule instanceof CssDeclarationBlock) {
62 $ruleMatches[] = new StyleRule($nestedRule, $containingAtRule);
63 }
64 }
65 }
66 } elseif ($rule instanceof CssDeclarationBlock) {
67 $ruleMatches[] = new StyleRule($rule);
68 }
69 }
70 return $ruleMatches;
71 }
72 /**
73 * Renders at-rules from the parsed CSS that are valid and not conditional group rules (i.e. not rules such as
74 * `@media` which contain style rules whose data is returned by {@see getStyleRulesData}). Also does not render
75 * `@charset` rules; these are discarded (only UTF-8 is supported).
76 *
77 * @return string
78 */
79 public function renderNonConditionalAtRules(): string
80 {
81 $this->isImportRuleAllowed = \true;
82 /** @var array<int, CssRenderable> $cssContents */
83 $cssContents = $this->sabberwormCssDocument->getContents();
84 $atRules = \array_filter($cssContents, [$this, 'isValidAtRuleToRender']);
85 if ($atRules === []) {
86 return '';
87 }
88 $atRulesDocument = new SabberwormCssDocument();
89 $atRulesDocument->setContents($atRules);
90 /** @var string $renderedRules */
91 $renderedRules = $atRulesDocument->render();
92 return $renderedRules;
93 }
94 /**
95 * @param CssAtRuleBlockList $rule
96 * @param array<array-key, string> $allowedMediaTypes
97 *
98 * @return ?string
99 * If the nested at-rule is supported, it's opening declaration (e.g. "@media (max-width: 768px)") is
100 * returned; otherwise the return value is null.
101 */
102 private function getFilteredAtIdentifierAndRule(CssAtRuleBlockList $rule, array $allowedMediaTypes): ?string
103 {
104 $result = null;
105 if ($rule->atRuleName() === 'media') {
106 /** @var string $mediaQueryList */
107 $mediaQueryList = $rule->atRuleArgs();
108 [$mediaType] = \explode('(', $mediaQueryList, 2);
109 if (\trim($mediaType) !== '') {
110 $escapedAllowedMediaTypes = \array_map(static function (string $allowedMediaType): string {
111 return \preg_quote($allowedMediaType, '/');
112 }, $allowedMediaTypes);
113 $mediaTypesMatcher = \implode('|', $escapedAllowedMediaTypes);
114 $isAllowed = \preg_match('/^\s*+(?:only\s++)?+(?:' . $mediaTypesMatcher . ')/i', $mediaType) > 0;
115 } else {
116 $isAllowed = \true;
117 }
118 if ($isAllowed) {
119 $result = '@media ' . $mediaQueryList;
120 }
121 }
122 return $result;
123 }
124 /**
125 * Tests if a CSS rule is an at-rule that should be passed though and copied to a `<style>` element unmodified:
126 * - `@charset` rules are discarded - only UTF-8 is supported - `false` is returned;
127 * - `@import` rules are passed through only if they satisfy the specification ("user agents must ignore any
128 * '@import' rule that occurs inside a block or after any non-ignored statement other than an '@charset' or an
129 * '@import' rule");
130 * - `@media` rules are processed separately to see if their nested rules apply - `false` is returned;
131 * - `@font-face` rules are checked for validity - they must contain both a `src` and `font-family` property;
132 * - other at-rules are assumed to be valid and treated as a black box - `true` is returned.
133 *
134 * @param CssRenderable $rule
135 *
136 * @return bool
137 */
138 private function isValidAtRuleToRender(CssRenderable $rule): bool
139 {
140 if ($rule instanceof CssCharset) {
141 return \false;
142 }
143 if ($rule instanceof CssImport) {
144 return $this->isImportRuleAllowed;
145 }
146 $this->isImportRuleAllowed = \false;
147 if (!$rule instanceof CssAtRule) {
148 return \false;
149 }
150 switch ($rule->atRuleName()) {
151 case 'media':
152 $result = \false;
153 break;
154 case 'font-face':
155 $result = $rule instanceof CssRuleSet && $rule->getRules('font-family') !== [] && $rule->getRules('src') !== [];
156 break;
157 default:
158 $result = \true;
159 }
160 return $result;
161 }
162 }
163