wp/wp-includes/block-supports/elements.php
changeset 18 be944660c56a
child 19 3d72ae0968f4
equal deleted inserted replaced
17:34716fd837a4 18:be944660c56a
       
     1 <?php
       
     2 /**
       
     3  * Elements styles block support.
       
     4  *
       
     5  * @package WordPress
       
     6  * @since 5.8.0
       
     7  */
       
     8 
       
     9 /**
       
    10  * Render the elements stylesheet.
       
    11  *
       
    12  * @since 5.8.0
       
    13  * @access private
       
    14  *
       
    15  * @param  string $block_content Rendered block content.
       
    16  * @param  array  $block         Block object.
       
    17  * @return string                Filtered block content.
       
    18  */
       
    19 function wp_render_elements_support( $block_content, $block ) {
       
    20 	$link_color = null;
       
    21 	if ( ! empty( $block['attrs'] ) ) {
       
    22 		$link_color = _wp_array_get( $block['attrs'], array( 'style', 'elements', 'link', 'color', 'text' ), null );
       
    23 	}
       
    24 
       
    25 	/*
       
    26 	* For now we only care about link color.
       
    27 	* This code in the future when we have a public API
       
    28 	* should take advantage of WP_Theme_JSON::compute_style_properties
       
    29 	* and work for any element and style.
       
    30 	*/
       
    31 	if ( null === $link_color ) {
       
    32 		return $block_content;
       
    33 	}
       
    34 
       
    35 	$class_name = 'wp-elements-' . uniqid();
       
    36 
       
    37 	if ( strpos( $link_color, 'var:preset|color|' ) !== false ) {
       
    38 		// Get the name from the string and add proper styles.
       
    39 		$index_to_splice = strrpos( $link_color, '|' ) + 1;
       
    40 		$link_color_name = substr( $link_color, $index_to_splice );
       
    41 		$link_color      = "var(--wp--preset--color--$link_color_name)";
       
    42 	}
       
    43 	$link_color_declaration = esc_html( safecss_filter_attr( "color: $link_color" ) );
       
    44 
       
    45 	$style = "<style>.$class_name a{" . $link_color_declaration . " !important;}</style>\n";
       
    46 
       
    47 	// Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
       
    48 	// Retrieve the opening tag of the first HTML element.
       
    49 	$html_element_matches = array();
       
    50 	preg_match( '/<[^>]+>/', $block_content, $html_element_matches, PREG_OFFSET_CAPTURE );
       
    51 	$first_element = $html_element_matches[0][0];
       
    52 	// If the first HTML element has a class attribute just add the new class
       
    53 	// as we do on layout and duotone.
       
    54 	if ( strpos( $first_element, 'class="' ) !== false ) {
       
    55 		$content = preg_replace(
       
    56 			'/' . preg_quote( 'class="', '/' ) . '/',
       
    57 			'class="' . $class_name . ' ',
       
    58 			$block_content,
       
    59 			1
       
    60 		);
       
    61 	} else {
       
    62 		// If the first HTML element has no class attribute we should inject the attribute before the attribute at the end.
       
    63 		$first_element_offset = $html_element_matches[0][1];
       
    64 		$content              = substr_replace( $block_content, ' class="' . $class_name . '"', $first_element_offset + strlen( $first_element ) - 1, 0 );
       
    65 	}
       
    66 
       
    67 	return $content . $style;
       
    68 
       
    69 }
       
    70 
       
    71 add_filter( 'render_block', 'wp_render_elements_support', 10, 2 );