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 );