eturn array Declaration options keyed by property name. */ public function get_declaration_options() { return $this->declaration_options; } /** * Filters a CSS property + value pair. * * @since 6.1.0 * @since 7.1.0 Added the `$options` parameter. * * @param string $property The CSS property. * @param string $value The value to be filtered. * @param string $spacer Optional. The spacer between the colon and the value. * Default empty string. * @param array $options { * Optional. An array of options. Default empty array. * * @type bool $important Whether to output the declaration with !important. Default false. * } * @return string The filtered declaration or an empty string. */ protected static function filter_declaration( $property, $value, $spacer = '', $options = array() ) { $filtered_value = wp_strip_all_tags( $value, true ); if ( '' !== $filtered_value ) { $options = wp_parse_args( $options, array( 'important' => false, ) ); $filtered_declaration = safecss_filter_attr( "{$property}:{$spacer}{$filtered_value}" ); // Only append !important in the presence of an option value and when sanitization returns a single declaration. if ( true === $options['important'] && '' !== $filtered_declaration && ! str_contains( $filtered_declaration, ';' ) ) { return "$filtered_declaration !important"; } return $filtered_declaration; } return ''; } /** * Filters and compiles the CSS declarations. * * @since 6.1.0 * * @param bool $should_prettify Optional. Whether to add spacing, new lines and indents. * Default false. * @param int $indent_count Optional. The number of tab indents to apply to the rule. * Applies if `prettify` is `true`. Default 0. * @return string The CSS declarations. */ public function get_declarations_string( $should_prettify = false, $indent_count = 0 ) { $declarations_array = $this->get_declarations(); $declarations_output = ''; $indent = $should_prettify ? str_repeat( "\t", $indent_count ) : ''; $suffix = $should_prettify ? ' ' : ''; $suffix = $should_prettify && $indent_count > 0 ? "\n" : $suffix; $spacer = $should_prettify ? ' ' : ''; foreach ( $declarations_array as $property => $value ) { $filtered_declaration = static::filter_declaration( $property, $value, $spacer, $this->declaration_options[ $property ] ?? array() ); if ( $filtered_declaration ) { $declarations_output .= "{$indent}{$filtered_declaration};$suffix"; } } return rtrim( $declarations_output ); } /** * Sanitizes property names. * * @since 6.1.0 * * @param string $property The CSS property. * @return string The sanitized property name. */ protected function sanitize_property( $property ) { return sanitize_key( $property ); } } this->rules_group; } /** * Gets the declarations object. * * @since 6.1.0 * * @return WP_Style_Engine_CSS_Declarations The declarations object. */ public function get_declarations() { return $this->declarations; } /** * Gets the full selector. * * @since 6.1.0 * * @return string */ public function get_selector() { return $this->selector; } /** * 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. * @param int $indent_count Optional. The number of tab indents to apply to the rule. * Applies if `prettify` is `true`. Default 0. * @return string */ public function get_css( $should_prettify = false, $indent_count = 0 ) { $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}}"; } }