← All changes
|
build/scripts/style-engine/class-wp-style-engine-css-declarations-gutenberg.php
+64
-4
23.1.0
→
trunk
View file →
| @@ -22,8 +22,15 @@ | ||
| 22 | 22 | */ |
| 23 | 23 | protected $declarations = array(); |
| 24 | 24 | |
| 25 | 25 | /** |
| 26 | + * CSS declaration options keyed by property name. | |
| 27 | + * | |
| 28 | + * @var array | |
| 29 | + */ | |
| 30 | + protected $declaration_options = array(); | |
| 31 | + | |
| 32 | + /** | |
| 26 | 33 | * Constructor for this object. |
| 27 | 34 | * |
| 28 | 35 | * If a `$declarations` array is passed, it will be used to populate |
| 29 | 36 | * the initial $declarations prop of the object by calling add_declarations(). |
| @@ -38,12 +45,17 @@ | ||
| 38 | 45 | * Adds a single declaration. |
| 39 | 46 | * |
| 40 | 47 | * @param string $property The CSS property. |
| 41 | 48 | * @param string $value The CSS value. |
| 49 | + * @param array $options { | |
| 50 | + * Optional. An array of options. Default empty array. | |
| 42 | 51 | * |
| 52 | + * @type bool $important Whether to output the declaration with !important. Default false. | |
| 53 | + * } | |
| 54 | + * | |
| 43 | 55 | * @return WP_Style_Engine_CSS_Declarations_Gutenberg Returns the object to allow chaining methods. |
| 44 | 56 | */ |
| 45 | - public function add_declaration( $property, $value ) { | |
| 57 | + public function add_declaration( $property, $value, $options = array() ) { | |
| 46 | 58 | // Sanitizes the property. |
| 47 | 59 | $property = $this->sanitize_property( $property ); |
| 48 | 60 | // Bails early if the property is empty. |
| 49 | 61 | if ( empty( $property ) ) { |
| @@ -58,10 +70,24 @@ | ||
| 58 | 70 | if ( '' === $value ) { |
| 59 | 71 | return $this; |
| 60 | 72 | } |
| 61 | 73 | |
| 74 | + $options = wp_parse_args( | |
| 75 | + $options, | |
| 76 | + array( | |
| 77 | + 'important' => false, | |
| 78 | + ) | |
| 79 | + ); | |
| 80 | + | |
| 81 | + $options = array_filter( $options ); | |
| 82 | + | |
| 62 | 83 | // Adds the declaration property/value pair. |
| 63 | 84 | $this->declarations[ $property ] = $value; |
| 85 | + if ( $options ) { | |
| 86 | + $this->declaration_options[ $property ] = $options; | |
| 87 | + } else { | |
| 88 | + unset( $this->declaration_options[ $property ] ); | |
| 89 | + } | |
| 64 | 90 | |
| 65 | 91 | return $this; |
| 66 | 92 | } |
| 67 | 93 | |
| @@ -73,8 +99,9 @@ | ||
| 73 | 99 | * @return WP_Style_Engine_CSS_Declarations_Gutenberg Returns the object to allow chaining methods. |
| 74 | 100 | */ |
| 75 | 101 | public function remove_declaration( $property ) { |
| 76 | 102 | unset( $this->declarations[ $property ] ); |
| 103 | + unset( $this->declaration_options[ $property ] ); | |
| 77 | 104 | return $this; |
| 78 | 105 | } |
| 79 | 106 | |
| 80 | 107 | /** |
| @@ -114,21 +141,49 @@ | ||
| 114 | 141 | return $this->declarations; |
| 115 | 142 | } |
| 116 | 143 | |
| 117 | 144 | /** |
| 145 | + * Gets declaration options keyed by property name. | |
| 146 | + * | |
| 147 | + * @return array | |
| 148 | + */ | |
| 149 | + public function get_declaration_options() { | |
| 150 | + return $this->declaration_options; | |
| 151 | + } | |
| 152 | + | |
| 153 | + /** | |
| 118 | 154 | * Filters a CSS property + value pair. |
| 119 | 155 | * |
| 120 | 156 | * @param string $property The CSS property. |
| 121 | 157 | * @param string $value The value to be filtered. |
| 122 | 158 | * @param string $spacer The spacer between the colon and the value. Defaults to an empty string. |
| 159 | + * @param array $options { | |
| 160 | + * Optional. An array of options. Default empty array. | |
| 123 | 161 | * |
| 162 | + * @type bool $important Whether to output the declaration with !important. Default false. | |
| 163 | + * } | |
| 164 | + * | |
| 124 | 165 | * @return string The filtered declaration or an empty string. |
| 125 | 166 | */ |
| 126 | - protected static function filter_declaration( $property, $value, $spacer = '' ) { | |
| 167 | + protected static function filter_declaration( $property, $value, $spacer = '', $options = array() ) { | |
| 127 | 168 | $filtered_value = wp_strip_all_tags( $value, true ); |
| 128 | 169 | |
| 129 | 170 | if ( '' !== $filtered_value ) { |
| 130 | - return safecss_filter_attr( "{$property}:{$spacer}{$filtered_value}" ); | |
| 171 | + $options = wp_parse_args( | |
| 172 | + $options, | |
| 173 | + array( | |
| 174 | + 'important' => false, | |
| 175 | + ) | |
| 176 | + ); | |
| 177 | + | |
| 178 | + $filtered_declaration = safecss_filter_attr( "{$property}:{$spacer}{$filtered_value}" ); | |
| 179 | + | |
| 180 | + // Only append !important in the presence of an option value and when sanitization returns a single declaration. | |
| 181 | + if ( true === $options['important'] && '' !== $filtered_declaration && ! str_contains( $filtered_declaration, ';' ) ) { | |
| 182 | + return "$filtered_declaration !important"; | |
| 183 | + } | |
| 184 | + | |
| 185 | + return $filtered_declaration; | |
| 131 | 186 | } |
| 132 | 187 | return ''; |
| 133 | 188 | } |
| 134 | 189 | |
| @@ -148,9 +203,14 @@ | ||
| 148 | 203 | $suffix = $should_prettify && $indent_count > 0 ? "\n" : $suffix; |
| 149 | 204 | $spacer = $should_prettify ? ' ' : ''; |
| 150 | 205 | |
| 151 | 206 | foreach ( $declarations_array as $property => $value ) { |
| 152 | - $filtered_declaration = static::filter_declaration( $property, $value, $spacer ); | |
| 207 | + $filtered_declaration = static::filter_declaration( | |
| 208 | + $property, | |
| 209 | + $value, | |
| 210 | + $spacer, | |
| 211 | + $this->declaration_options[ $property ] ?? array() | |
| 212 | + ); | |
| 153 | 213 | if ( $filtered_declaration ) { |
| 154 | 214 | $declarations_output .= "{$indent}{$filtered_declaration};$suffix"; |
| 155 | 215 | } |
| 156 | 216 | } |