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 / Utilities / DeclarationBlockParser.php
wp-user-avatar / third-party / vendor / pelago / emogrifier / src / Utilities Last commit date
ArrayIntersector.php 1 day ago CssConcatenator.php 1 day ago DeclarationBlockParser.php 1 day ago
DeclarationBlockParser.php
89 lines
1 <?php
2
3 declare (strict_types=1);
4 namespace ProfilePressVendor\Pelago\Emogrifier\Utilities;
5
6 use function ProfilePressVendor\Safe\preg_match;
7 use function ProfilePressVendor\Safe\preg_split;
8 /**
9 * Provides a common method for parsing CSS declaration blocks.
10 * These might be from actual CSS, or from the `style` attribute of an HTML DOM element.
11 *
12 * Caches results globally.
13 *
14 * @internal
15 */
16 final class DeclarationBlockParser
17 {
18 /**
19 * @var array<non-empty-string, array<non-empty-string, string>>
20 */
21 private static $cache = [];
22 /**
23 * CSS custom properties (variables) have case-sensitive names, so their case must be preserved.
24 * Standard CSS properties have case-insensitive names, which are converted to lowercase.
25 *
26 * @param non-empty-string $name
27 *
28 * @return non-empty-string
29 */
30 public function normalizePropertyName(string $name): string
31 {
32 if (\substr($name, 0, 2) === '--') {
33 return $name;
34 }
35 return \strtolower($name);
36 }
37 /**
38 * Parses a CSS declaration block into property name/value pairs.
39 *
40 * Example:
41 *
42 * The declaration block
43 *
44 * ```css
45 * color: #000; font-weight: bold;
46 * ```
47 *
48 * will be parsed into the following array:
49 *
50 * ```php
51 * [
52 * 'color' => '#000',
53 * 'font-weight' => 'bold',
54 * ]
55 * ```
56 *
57 * @param string $declarationBlock the CSS declarations block (without the curly braces)
58 *
59 * @return array<non-empty-string, string>
60 * the CSS declarations with the property names as array keys and the property values as array values
61 *
62 * @throws \UnexpectedValueException if an empty property name is encountered (which cannot happen)
63 */
64 public function parse(string $declarationBlock): array
65 {
66 $trimmedDeclarationBlock = \trim($declarationBlock, "; \n\r\t\v\x00");
67 if ($trimmedDeclarationBlock === '') {
68 return [];
69 }
70 if (isset(self::$cache[$trimmedDeclarationBlock])) {
71 return self::$cache[$trimmedDeclarationBlock];
72 }
73 $declarations = preg_split('/;(?!base64|charset)/', $trimmedDeclarationBlock);
74 /** @var list<string> $declarations */
75 $properties = [];
76 foreach ($declarations as $declaration) {
77 $matches = [];
78 if (preg_match('/^(-?+[a-zA-Z_][a-zA-Z_0-9\-]*+|--[a-zA-Z_0-9\-]++)\s*+:\s*+(.++)$/s', \trim($declaration), $matches) === 0) {
79 continue;
80 }
81 $propertyName = $matches[1];
82 $propertyValue = $matches[2];
83 $properties[$this->normalizePropertyName($propertyName)] = $propertyValue;
84 }
85 self::$cache[$trimmedDeclarationBlock] = $properties;
86 return $properties;
87 }
88 }
89