diff -r c7c34916027a -r 177826044cd9 wp/wp-includes/class-wp-block-type.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wp/wp-includes/class-wp-block-type.php Mon Oct 14 18:28:13 2019 +0200 @@ -0,0 +1,216 @@ +name = $block_type; + + $this->set_props( $args ); + } + + /** + * Renders the block type output for given attributes. + * + * @since 5.0.0 + * + * @param array $attributes Optional. Block attributes. Default empty array. + * @param string $content Optional. Block content. Default empty string. + * @return string Rendered block type output. + */ + public function render( $attributes = array(), $content = '' ) { + if ( ! $this->is_dynamic() ) { + return ''; + } + + $attributes = $this->prepare_attributes_for_render( $attributes ); + + return (string) call_user_func( $this->render_callback, $attributes, $content ); + } + + /** + * Returns true if the block type is dynamic, or false otherwise. A dynamic + * block is one which defers its rendering to occur on-demand at runtime. + * + * @since 5.0.0 + * + * @return boolean Whether block type is dynamic. + */ + public function is_dynamic() { + return is_callable( $this->render_callback ); + } + + /** + * Validates attributes against the current block schema, populating + * defaulted and missing values. + * + * @since 5.0.0 + * + * @param array $attributes Original block attributes. + * @return array Prepared block attributes. + */ + public function prepare_attributes_for_render( $attributes ) { + // If there are no attribute definitions for the block type, skip + // processing and return vebatim. + if ( ! isset( $this->attributes ) ) { + return $attributes; + } + + foreach ( $attributes as $attribute_name => $value ) { + // If the attribute is not defined by the block type, it cannot be + // validated. + if ( ! isset( $this->attributes[ $attribute_name ] ) ) { + continue; + } + + $schema = $this->attributes[ $attribute_name ]; + + // Validate value by JSON schema. An invalid value should revert to + // its default, if one exists. This occurs by virtue of the missing + // attributes loop immediately following. If there is not a default + // assigned, the attribute value should remain unset. + $is_valid = rest_validate_value_from_schema( $value, $schema ); + if ( is_wp_error( $is_valid ) ) { + unset( $attributes[ $attribute_name ] ); + } + } + + // Populate values of any missing attributes for which the block type + // defines a default. + $missing_schema_attributes = array_diff_key( $this->attributes, $attributes ); + foreach ( $missing_schema_attributes as $attribute_name => $schema ) { + if ( isset( $schema['default'] ) ) { + $attributes[ $attribute_name ] = $schema['default']; + } + } + + return $attributes; + } + + /** + * Sets block type properties. + * + * @since 5.0.0 + * + * @param array|string $args Array or string of arguments for registering a block type. + */ + public function set_props( $args ) { + $args = wp_parse_args( + $args, + array( + 'render_callback' => null, + ) + ); + + $args['name'] = $this->name; + + foreach ( $args as $property_name => $property_value ) { + $this->$property_name = $property_value; + } + } + + /** + * Get all available block attributes including possible layout attribute from Columns block. + * + * @since 5.0.0 + * + * @return array Array of attributes. + */ + public function get_attributes() { + return is_array( $this->attributes ) ? + array_merge( + $this->attributes, + array( + 'layout' => array( + 'type' => 'string', + ), + ) + ) : + array( + 'layout' => array( + 'type' => 'string', + ), + ); + } +}