diff options
Diffstat (limited to 'wp-includes/style-engine/class-wp-style-engine-css-rule.php')
-rw-r--r-- | wp-includes/style-engine/class-wp-style-engine-css-rule.php | 64 |
1 files changed, 57 insertions, 7 deletions
diff --git a/wp-includes/style-engine/class-wp-style-engine-css-rule.php b/wp-includes/style-engine/class-wp-style-engine-css-rule.php index 2b31cff..291652a 100644 --- a/wp-includes/style-engine/class-wp-style-engine-css-rule.php +++ b/wp-includes/style-engine/class-wp-style-engine-css-rule.php @@ -36,19 +36,32 @@ class WP_Style_Engine_CSS_Rule { protected $declarations; /** + * A parent CSS selector in the case of nested CSS, or a CSS nested @rule, + * such as `@media (min-width: 80rem)` or `@layer module`. + * + * @since 6.6.0 + * @var string + */ + protected $rules_group; + + /** * Constructor. * * @since 6.1.0 + * @since 6.6.0 Added the `$rules_group` parameter. * * @param string $selector Optional. The CSS selector. Default empty string. * @param string[]|WP_Style_Engine_CSS_Declarations $declarations Optional. An associative array of CSS definitions, * e.g. `array( "$property" => "$value", "$property" => "$value" )`, * or a WP_Style_Engine_CSS_Declarations object. * Default empty array. + * @param string $rules_group A parent CSS selector in the case of nested CSS, or a CSS nested @rule, + * such as `@media (min-width: 80rem)` or `@layer module`. */ - public function __construct( $selector = '', $declarations = array() ) { + public function __construct( $selector = '', $declarations = array(), $rules_group = '' ) { $this->set_selector( $selector ); $this->add_declarations( $declarations ); + $this->set_rules_group( $rules_group ); } /** @@ -90,6 +103,31 @@ class WP_Style_Engine_CSS_Rule { } /** + * Sets the rules group. + * + * @since 6.6.0 + * + * @param string $rules_group A parent CSS selector in the case of nested CSS, or a CSS nested @rule, + * such as `@media (min-width: 80rem)` or `@layer module`. + * @return WP_Style_Engine_CSS_Rule Returns the object to allow chaining of methods. + */ + public function set_rules_group( $rules_group ) { + $this->rules_group = $rules_group; + return $this; + } + + /** + * Gets the rules group. + * + * @since 6.6.0 + * + * @return string + */ + public function get_rules_group() { + return $this->rules_group; + } + + /** * Gets the declarations object. * * @since 6.1.0 @@ -115,6 +153,7 @@ class WP_Style_Engine_CSS_Rule { * Gets the CSS. * * @since 6.1.0 + * @since 6.6.0 Added support for nested CSS with rules groups. * * @param bool $should_prettify Optional. Whether to add spacing, new lines and indents. * Default false. @@ -123,17 +162,28 @@ class WP_Style_Engine_CSS_Rule { * @return string */ public function get_css( $should_prettify = false, $indent_count = 0 ) { - $rule_indent = $should_prettify ? str_repeat( "\t", $indent_count ) : ''; - $declarations_indent = $should_prettify ? $indent_count + 1 : 0; - $suffix = $should_prettify ? "\n" : ''; - $spacer = $should_prettify ? ' ' : ''; - $selector = $should_prettify ? str_replace( ',', ",\n", $this->get_selector() ) : $this->get_selector(); - $css_declarations = $this->declarations->get_declarations_string( $should_prettify, $declarations_indent ); + $rule_indent = $should_prettify ? str_repeat( "\t", $indent_count ) : ''; + $nested_rule_indent = $should_prettify ? str_repeat( "\t", $indent_count + 1 ) : ''; + $declarations_indent = $should_prettify ? $indent_count + 1 : 0; + $nested_declarations_indent = $should_prettify ? $indent_count + 2 : 0; + $suffix = $should_prettify ? "\n" : ''; + $spacer = $should_prettify ? ' ' : ''; + // Trims any multiple selectors strings. + $selector = $should_prettify ? implode( ',', array_map( 'trim', explode( ',', $this->get_selector() ) ) ) : $this->get_selector(); + $selector = $should_prettify ? str_replace( array( ',' ), ",\n", $selector ) : $selector; + $rules_group = $this->get_rules_group(); + $has_rules_group = ! empty( $rules_group ); + $css_declarations = $this->declarations->get_declarations_string( $should_prettify, $has_rules_group ? $nested_declarations_indent : $declarations_indent ); if ( empty( $css_declarations ) ) { return ''; } + if ( $has_rules_group ) { + $selector = "{$rule_indent}{$rules_group}{$spacer}{{$suffix}{$nested_rule_indent}{$selector}{$spacer}{{$suffix}{$css_declarations}{$suffix}{$nested_rule_indent}}{$suffix}{$rule_indent}}"; + return $selector; + } + return "{$rule_indent}{$selector}{$spacer}{{$suffix}{$css_declarations}{$suffix}{$rule_indent}}"; } } |