summaryrefslogtreecommitdiffstats
path: root/wp-includes/style-engine
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-09-19 04:51:18 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-09-19 04:51:18 +0000
commit0e41b5d52fdc6af6442816b5f465c9db9f84e126 (patch)
treee139a90049b158d4eed892d1662ee7f5c358fa31 /wp-includes/style-engine
parentAdding upstream version 6.5.5+dfsg1. (diff)
downloadwordpress-upstream.tar.xz
wordpress-upstream.zip
Adding upstream version 6.6.1+dfsg1.upstream/6.6.1+dfsg1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'wp-includes/style-engine')
-rw-r--r--wp-includes/style-engine/class-wp-style-engine-css-rule.php64
-rw-r--r--wp-includes/style-engine/class-wp-style-engine-css-rules-store.php15
-rw-r--r--wp-includes/style-engine/class-wp-style-engine-processor.php21
-rw-r--r--wp-includes/style-engine/class-wp-style-engine.php8
4 files changed, 96 insertions, 12 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}}";
}
}
diff --git a/wp-includes/style-engine/class-wp-style-engine-css-rules-store.php b/wp-includes/style-engine/class-wp-style-engine-css-rules-store.php
index 371e59f..4a82f28 100644
--- a/wp-includes/style-engine/class-wp-style-engine-css-rules-store.php
+++ b/wp-includes/style-engine/class-wp-style-engine-css-rules-store.php
@@ -121,19 +121,30 @@ class WP_Style_Engine_CSS_Rules_Store {
* If the rule does not exist, it will be created.
*
* @since 6.1.0
+ * @since 6.6.0 Added the $rules_group parameter.
*
* @param string $selector The CSS selector.
+ * @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|void Returns a WP_Style_Engine_CSS_Rule object,
* or void if the selector is empty.
*/
- public function add_rule( $selector ) {
- $selector = trim( $selector );
+ public function add_rule( $selector, $rules_group = '' ) {
+ $selector = $selector ? trim( $selector ) : '';
+ $rules_group = $rules_group ? trim( $rules_group ) : '';
// Bail early if there is no selector.
if ( empty( $selector ) ) {
return;
}
+ if ( ! empty( $rules_group ) ) {
+ if ( empty( $this->rules[ "$rules_group $selector" ] ) ) {
+ $this->rules[ "$rules_group $selector" ] = new WP_Style_Engine_CSS_Rule( $selector, array(), $rules_group );
+ }
+ return $this->rules[ "$rules_group $selector" ];
+ }
+
// Create the rule if it doesn't exist.
if ( empty( $this->rules[ $selector ] ) ) {
$this->rules[ $selector ] = new WP_Style_Engine_CSS_Rule( $selector );
diff --git a/wp-includes/style-engine/class-wp-style-engine-processor.php b/wp-includes/style-engine/class-wp-style-engine-processor.php
index 0778748..d5e6c73 100644
--- a/wp-includes/style-engine/class-wp-style-engine-processor.php
+++ b/wp-includes/style-engine/class-wp-style-engine-processor.php
@@ -58,6 +58,7 @@ class WP_Style_Engine_Processor {
* Adds rules to be processed.
*
* @since 6.1.0
+ * @since 6.6.0 Added support for rules_group.
*
* @param WP_Style_Engine_CSS_Rule|WP_Style_Engine_CSS_Rule[] $css_rules A single, or an array of,
* WP_Style_Engine_CSS_Rule objects
@@ -70,7 +71,24 @@ class WP_Style_Engine_Processor {
}
foreach ( $css_rules as $rule ) {
- $selector = $rule->get_selector();
+ $selector = $rule->get_selector();
+ $rules_group = $rule->get_rules_group();
+
+ /**
+ * If there is a rules_group and it already exists in the css_rules array,
+ * add the rule to it.
+ * Otherwise, create a new entry for the rules_group.
+ */
+ if ( ! empty( $rules_group ) ) {
+ if ( isset( $this->css_rules[ "$rules_group $selector" ] ) ) {
+ $this->css_rules[ "$rules_group $selector" ]->add_declarations( $rule->get_declarations() );
+ continue;
+ }
+ $this->css_rules[ "$rules_group $selector" ] = $rule;
+ continue;
+ }
+
+ // If the selector already exists, add the declarations to it.
if ( isset( $this->css_rules[ $selector ] ) ) {
$this->css_rules[ $selector ]->add_declarations( $rule->get_declarations() );
continue;
@@ -117,6 +135,7 @@ class WP_Style_Engine_Processor {
// Build the CSS.
$css = '';
foreach ( $this->css_rules as $rule ) {
+ // See class WP_Style_Engine_CSS_Rule for the get_css method.
$css .= $rule->get_css( $options['prettify'] );
$css .= $options['prettify'] ? "\n" : '';
}
diff --git a/wp-includes/style-engine/class-wp-style-engine.php b/wp-includes/style-engine/class-wp-style-engine.php
index 99372b5..1ba813e 100644
--- a/wp-includes/style-engine/class-wp-style-engine.php
+++ b/wp-includes/style-engine/class-wp-style-engine.php
@@ -364,6 +364,7 @@ final class WP_Style_Engine {
* Stores a CSS rule using the provided CSS selector and CSS declarations.
*
* @since 6.1.0
+ * @since 6.6.0 Added the `$rules_group` parameter.
*
* @param string $store_name A valid store key.
* @param string $css_selector When a selector is passed, the function will return
@@ -371,12 +372,14 @@ final class WP_Style_Engine {
* otherwise a concatenated string of properties and values.
* @param string[] $css_declarations An associative array of CSS definitions,
* e.g. `array( "$property" => "$value", "$property" => "$value" )`.
+ * @param string $rules_group Optional. 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 static function store_css_rule( $store_name, $css_selector, $css_declarations ) {
+ public static function store_css_rule( $store_name, $css_selector, $css_declarations, $rules_group = '' ) {
if ( empty( $store_name ) || empty( $css_selector ) || empty( $css_declarations ) ) {
return;
}
- static::get_store( $store_name )->add_rule( $css_selector )->add_declarations( $css_declarations );
+ static::get_store( $store_name )->add_rule( $css_selector, $rules_group )->add_declarations( $css_declarations );
}
/**
@@ -467,6 +470,7 @@ final class WP_Style_Engine {
foreach ( $style_definition['classnames'] as $classname => $property_key ) {
if ( true === $property_key ) {
$classnames[] = $classname;
+ continue;
}
$slug = static::get_slug_from_preset_value( $style_value, $property_key );