From a415c29efee45520ae252d2aa28f1083a521cd7b Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 09:56:49 +0200 Subject: Adding upstream version 6.4.3+dfsg1. Signed-off-by: Daniel Baumann --- .../class-wp-style-engine-processor.php | 162 +++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 wp-includes/style-engine/class-wp-style-engine-processor.php (limited to 'wp-includes/style-engine/class-wp-style-engine-processor.php') diff --git a/wp-includes/style-engine/class-wp-style-engine-processor.php b/wp-includes/style-engine/class-wp-style-engine-processor.php new file mode 100644 index 0000000..0778748 --- /dev/null +++ b/wp-includes/style-engine/class-wp-style-engine-processor.php @@ -0,0 +1,162 @@ +stores[ $store->get_name() ] = $store; + + return $this; + } + + /** + * Adds rules to be processed. + * + * @since 6.1.0 + * + * @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 + * from a store or otherwise. + * @return WP_Style_Engine_Processor Returns the object to allow chaining methods. + */ + public function add_rules( $css_rules ) { + if ( ! is_array( $css_rules ) ) { + $css_rules = array( $css_rules ); + } + + foreach ( $css_rules as $rule ) { + $selector = $rule->get_selector(); + if ( isset( $this->css_rules[ $selector ] ) ) { + $this->css_rules[ $selector ]->add_declarations( $rule->get_declarations() ); + continue; + } + $this->css_rules[ $rule->get_selector() ] = $rule; + } + + return $this; + } + + /** + * Gets the CSS rules as a string. + * + * @since 6.1.0 + * @since 6.4.0 The Optimization is no longer the default. + * + * @param array $options { + * Optional. An array of options. Default empty array. + * + * @type bool $optimize Whether to optimize the CSS output, e.g. combine rules. + * Default false. + * @type bool $prettify Whether to add new lines and indents to output. + * Defaults to whether the `SCRIPT_DEBUG` constant is defined. + * } + * @return string The computed CSS. + */ + public function get_css( $options = array() ) { + $defaults = array( + 'optimize' => false, + 'prettify' => defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG, + ); + $options = wp_parse_args( $options, $defaults ); + + // If we have stores, get the rules from them. + foreach ( $this->stores as $store ) { + $this->add_rules( $store->get_all_rules() ); + } + + // Combine CSS selectors that have identical declarations. + if ( true === $options['optimize'] ) { + $this->combine_rules_selectors(); + } + + // Build the CSS. + $css = ''; + foreach ( $this->css_rules as $rule ) { + $css .= $rule->get_css( $options['prettify'] ); + $css .= $options['prettify'] ? "\n" : ''; + } + return $css; + } + + /** + * Combines selectors from the rules store when they have the same styles. + * + * @since 6.1.0 + */ + private function combine_rules_selectors() { + // Build an array of selectors along with the JSON-ified styles to make comparisons easier. + $selectors_json = array(); + foreach ( $this->css_rules as $rule ) { + $declarations = $rule->get_declarations()->get_declarations(); + ksort( $declarations ); + $selectors_json[ $rule->get_selector() ] = wp_json_encode( $declarations ); + } + + // Combine selectors that have the same styles. + foreach ( $selectors_json as $selector => $json ) { + // Get selectors that use the same styles. + $duplicates = array_keys( $selectors_json, $json, true ); + // Skip if there are no duplicates. + if ( 1 >= count( $duplicates ) ) { + continue; + } + + $declarations = $this->css_rules[ $selector ]->get_declarations(); + + foreach ( $duplicates as $key ) { + // Unset the duplicates from the $selectors_json array to avoid looping through them as well. + unset( $selectors_json[ $key ] ); + // Remove the rules from the rules collection. + unset( $this->css_rules[ $key ] ); + } + // Create a new rule with the combined selectors. + $duplicate_selectors = implode( ',', $duplicates ); + $this->css_rules[ $duplicate_selectors ] = new WP_Style_Engine_CSS_Rule( $duplicate_selectors, $declarations ); + } + } +} -- cgit v1.2.3