From d7e321c7c74211e75d34f71c98a26c0cbdd1d13f Mon Sep 17 00:00:00 2001 From: jorgefilipecosta Date: Tue, 4 Feb 2020 20:16:04 +0000 Subject: [PATCH] Block Editor: Include navigation block server logic. Core did not include the navigation block PHP files. This commit fixes the issue referred, and now the navigation block is executed on the frontend. The block still does not work as expected and throws an error during frontend execution. That problem is going to be fixed on the next WordPress package update. This commit adds the file as it is on the npm package used. Props gziolo. Fixes #49348. Built from https://develop.svn.wordpress.org/trunk@47176 git-svn-id: http://core.svn.wordpress.org/trunk@46976 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/blocks/navigation.php | 195 ++++++++++++++++++++++++++++++ wp-includes/version.php | 2 +- wp-settings.php | 1 + 3 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 wp-includes/blocks/navigation.php diff --git a/wp-includes/blocks/navigation.php b/wp-includes/blocks/navigation.php new file mode 100644 index 0000000000..13b6df4256 --- /dev/null +++ b/wp-includes/blocks/navigation.php @@ -0,0 +1,195 @@ + array(), + 'inline_styles' => '', + ); + + $has_named_text_color = array_key_exists( 'textColor', $attributes ); + $has_custom_text_color = array_key_exists( 'customTextColor', $attributes ); + + // If has text color. + if ( $has_custom_text_color || $has_named_text_color ) { + // Add has-text-color class. + $colors['css_classes'][] = 'has-text-color'; + } + + if ( $has_named_text_color ) { + // Add the color class. + $colors['css_classes'][] = sprintf( 'has-%s-color', $attributes['textColor'] ); + } elseif ( $has_custom_text_color ) { + // Add the custom color inline style. + $colors['inline_styles'] = sprintf( 'color: %s;', $attributes['customTextColor'] ); + } + + return $colors; +} + +/** + * Build an array with CSS classes and inline styles defining the font sizes + * which will be applied to the navigation markup in the front-end. + * + * @param array $attributes Navigation block attributes. + * @return array Font size CSS classes and inline styles. + */ +function build_css_font_sizes( $attributes ) { + // CSS classes. + $font_sizes = array( + 'css_classes' => array(), + 'inline_styles' => '', + ); + + $has_named_font_size = array_key_exists( 'fontSize', $attributes ); + $has_custom_font_size = array_key_exists( 'customFontSize', $attributes ); + + if ( $has_named_font_size ) { + // Add the font size class. + $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $attributes['fontSize'] ); + } elseif ( $has_custom_font_size ) { + // Add the custom font size inline style. + $font_sizes['inline_styles'] = sprintf( 'font-size: %spx;', $attributes['customFontSize'] ); + } + + return $font_sizes; +} + +/** + * Renders the `core/navigation` block on server. + * + * @param array $attributes The block attributes. + * @param array $content The saved content. + * @param array $block The parsed block. + * + * @return string Returns the post content with the legacy widget added. + */ +function render_block_navigation( $attributes, $content, $block ) { + $colors = build_css_colors( $attributes ); + $font_sizes = build_css_font_sizes( $attributes ); + $classes = array_merge( + $colors['css_classes'], + $font_sizes['css_classes'], + array( 'wp-block-navigation' ), + isset( $attributes['className'] ) ? array( $attributes['className'] ) : array(), + isset( $attributes['itemsJustification'] ) ? array( 'items-justified-' . $attributes['itemsJustification'] ) : array(), + isset( $attributes['align'] ) ? array( 'align' . $attributes['align'] ) : array() + ); + $class_attribute = sprintf( ' class="%s"', esc_attr( implode( ' ', $classes ) ) ); + $style_attribute = ( $colors['inline_styles'] || $font_sizes['inline_styles'] ) + ? sprintf( ' style="%s"', esc_attr( $colors['inline_styles'] ) . esc_attr( $font_sizes['inline_styles'] ) ) + : ''; + + return sprintf( + '', + $class_attribute, + $style_attribute, + build_navigation_html( $block, $colors, $font_sizes ) + ); +} + +/** + * Walks the inner block structure and returns an HTML list for it. + * + * @param array $block The block. + * @param array $colors Contains inline styles and CSS classes to apply to navigation item. + * @param array $font_sizes Contains inline styles and CSS classes to apply to navigation item. + * + * @return string Returns an HTML list from innerBlocks. + */ +function build_navigation_html( $block, $colors, $font_sizes ) { + $html = ''; + $classes = array_merge( + $colors['css_classes'], + $font_sizes['css_classes'] + ); + $css_classes = implode( ' ', $classes ); + $class_attribute = sprintf( ' class="wp-block-navigation-link__content %s"', esc_attr( trim( $css_classes ) ) ); + $style_attribute = ( $colors['inline_styles'] || $font_sizes['inline_styles'] ) + ? sprintf( ' style="%s"', esc_attr( $colors['inline_styles'] ) . esc_attr( $font_sizes['inline_styles'] ) ) + : ''; + + foreach ( (array) $block['innerBlocks'] as $key => $block ) { + + $html .= ''; + } + return ''; +} + +/** + * Register the navigation block. + * + * @uses render_block_navigation() + * @throws WP_Error An WP_Error exception parsing the block definition. + */ +function register_block_core_navigation() { + + register_block_type( + 'core/navigation', + array( + 'attributes' => array( + 'className' => array( + 'type' => 'string', + ), + 'textColor' => array( + 'type' => 'string', + ), + 'customTextColor' => array( + 'type' => 'string', + ), + 'fontSize' => array( + 'type' => 'string', + ), + 'customFontSize' => array( + 'type' => 'number', + ), + 'itemsJustification' => array( + 'type' => 'string', + ), + ), + + 'render_callback' => 'render_block_navigation', + ) + ); +} +add_action( 'init', 'register_block_core_navigation' ); diff --git a/wp-includes/version.php b/wp-includes/version.php index 6ca6ecbbc6..07403f71cf 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.4-alpha-47175'; +$wp_version = '5.4-alpha-47176'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. diff --git a/wp-settings.php b/wp-settings.php index 13f9bbb3a5..230b54010a 100644 --- a/wp-settings.php +++ b/wp-settings.php @@ -263,6 +263,7 @@ require( ABSPATH . WPINC . '/blocks/calendar.php' ); require( ABSPATH . WPINC . '/blocks/categories.php' ); require( ABSPATH . WPINC . '/blocks/latest-comments.php' ); require( ABSPATH . WPINC . '/blocks/latest-posts.php' ); +require( ABSPATH . WPINC . '/blocks/navigation.php' ); require( ABSPATH . WPINC . '/blocks/rss.php' ); require( ABSPATH . WPINC . '/blocks/search.php' ); require( ABSPATH . WPINC . '/blocks/shortcode.php' );