balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

border.php (5399B)


      1 <?php
      2 /**
      3  * Border block support flag.
      4  *
      5  * @package WordPress
      6  * @since 5.8.0
      7  */
      8 
      9 /**
     10  * Registers the style attribute used by the border feature if needed for block
     11  * types that support borders.
     12  *
     13  * @since 5.8.0
     14  * @access private
     15  *
     16  * @param WP_Block_Type $block_type Block Type.
     17  */
     18 function wp_register_border_support( $block_type ) {
     19 	// Determine if any border related features are supported.
     20 	$has_border_support       = block_has_support( $block_type, array( '__experimentalBorder' ) );
     21 	$has_border_color_support = wp_has_border_feature_support( $block_type, 'color' );
     22 
     23 	// Setup attributes and styles within that if needed.
     24 	if ( ! $block_type->attributes ) {
     25 		$block_type->attributes = array();
     26 	}
     27 
     28 	if ( $has_border_support && ! array_key_exists( 'style', $block_type->attributes ) ) {
     29 		$block_type->attributes['style'] = array(
     30 			'type' => 'object',
     31 		);
     32 	}
     33 
     34 	if ( $has_border_color_support && ! array_key_exists( 'borderColor', $block_type->attributes ) ) {
     35 		$block_type->attributes['borderColor'] = array(
     36 			'type' => 'string',
     37 		);
     38 	}
     39 }
     40 
     41 /**
     42  * Adds CSS classes and inline styles for border styles to the incoming
     43  * attributes array. This will be applied to the block markup in the front-end.
     44  *
     45  * @since 5.8.0
     46  * @access private
     47  *
     48  * @param WP_Block_Type $block_type       Block type.
     49  * @param array         $block_attributes Block attributes.
     50  *
     51  * @return array Border CSS classes and inline styles.
     52  */
     53 function wp_apply_border_support( $block_type, $block_attributes ) {
     54 	if ( wp_skip_border_serialization( $block_type ) ) {
     55 		return array();
     56 	}
     57 
     58 	$classes = array();
     59 	$styles  = array();
     60 
     61 	// Border radius.
     62 	if (
     63 		wp_has_border_feature_support( $block_type, 'radius' ) &&
     64 		isset( $block_attributes['style']['border']['radius'] )
     65 	) {
     66 		$border_radius = (int) $block_attributes['style']['border']['radius'];
     67 		$styles[]      = sprintf( 'border-radius: %dpx;', $border_radius );
     68 	}
     69 
     70 	// Border style.
     71 	if (
     72 		wp_has_border_feature_support( $block_type, 'style' ) &&
     73 		isset( $block_attributes['style']['border']['style'] )
     74 	) {
     75 		$border_style = $block_attributes['style']['border']['style'];
     76 		$styles[]     = sprintf( 'border-style: %s;', $border_style );
     77 	}
     78 
     79 	// Border width.
     80 	if (
     81 		wp_has_border_feature_support( $block_type, 'width' ) &&
     82 		isset( $block_attributes['style']['border']['width'] )
     83 	) {
     84 		$border_width = intval( $block_attributes['style']['border']['width'] );
     85 		$styles[]     = sprintf( 'border-width: %dpx;', $border_width );
     86 	}
     87 
     88 	// Border color.
     89 	if ( wp_has_border_feature_support( $block_type, 'color' ) ) {
     90 		$has_named_border_color  = array_key_exists( 'borderColor', $block_attributes );
     91 		$has_custom_border_color = isset( $block_attributes['style']['border']['color'] );
     92 
     93 		if ( $has_named_border_color || $has_custom_border_color ) {
     94 			$classes[] = 'has-border-color';
     95 		}
     96 
     97 		if ( $has_named_border_color ) {
     98 			$classes[] = sprintf( 'has-%s-border-color', $block_attributes['borderColor'] );
     99 		} elseif ( $has_custom_border_color ) {
    100 			$border_color = $block_attributes['style']['border']['color'];
    101 			$styles[]     = sprintf( 'border-color: %s;', $border_color );
    102 		}
    103 	}
    104 
    105 	// Collect classes and styles.
    106 	$attributes = array();
    107 
    108 	if ( ! empty( $classes ) ) {
    109 		$attributes['class'] = implode( ' ', $classes );
    110 	}
    111 
    112 	if ( ! empty( $styles ) ) {
    113 		$attributes['style'] = implode( ' ', $styles );
    114 	}
    115 
    116 	return $attributes;
    117 }
    118 
    119 /**
    120  * Checks whether serialization of the current block's border properties should
    121  * occur.
    122  *
    123  * @since 5.8.0
    124  * @access private
    125  *
    126  * @param WP_Block_Type $block_type Block type.
    127  *
    128  * @return boolean
    129  */
    130 function wp_skip_border_serialization( $block_type ) {
    131 	$border_support = _wp_array_get( $block_type->supports, array( '__experimentalBorder' ), false );
    132 
    133 	return is_array( $border_support ) &&
    134 		array_key_exists( '__experimentalSkipSerialization', $border_support ) &&
    135 		$border_support['__experimentalSkipSerialization'];
    136 }
    137 
    138 /**
    139  * Checks whether the current block type supports the border feature requested.
    140  *
    141  * If the `__experimentalBorder` support flag is a boolean `true` all border
    142  * support features are available. Otherwise, the specific feature's support
    143  * flag nested under `experimentalBorder` must be enabled for the feature
    144  * to be opted into.
    145  *
    146  * @since 5.8.0
    147  * @access private
    148  *
    149  * @param WP_Block_Type $block_type Block type to check for support.
    150  * @param string        $feature    Name of the feature to check support for.
    151  * @param mixed         $default    Fallback value for feature support, defaults to false.
    152  *
    153  * @return boolean Whether or not the feature is supported.
    154  */
    155 function wp_has_border_feature_support( $block_type, $feature, $default = false ) {
    156 	// Check if all border support features have been opted into via `"__experimentalBorder": true`.
    157 	if (
    158 		property_exists( $block_type, 'supports' ) &&
    159 		( true === _wp_array_get( $block_type->supports, array( '__experimentalBorder' ), $default ) )
    160 	) {
    161 		return true;
    162 	}
    163 
    164 	// Check if the specific feature has been opted into individually
    165 	// via nested flag under `__experimentalBorder`.
    166 	return block_has_support( $block_type, array( '__experimentalBorder', $feature ), $default );
    167 }
    168 
    169 // Register the block support.
    170 WP_Block_Supports::get_instance()->register(
    171 	'border',
    172 	array(
    173 		'register_attribute' => 'wp_register_border_support',
    174 		'apply'              => 'wp_apply_border_support',
    175 	)
    176 );