wp/wp-includes/class-wp-block-type.php
changeset 9 177826044cd9
child 16 a86126ab1dd4
--- /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 @@
+<?php
+/**
+ * Blocks API: WP_Block_Type class
+ *
+ * @package WordPress
+ * @subpackage Blocks
+ * @since 5.0.0
+ */
+
+/**
+ * Core class representing a block type.
+ *
+ * @since 5.0.0
+ *
+ * @see register_block_type()
+ */
+class WP_Block_Type {
+	/**
+	 * Block type key.
+	 *
+	 * @since 5.0.0
+	 * @var string
+	 */
+	public $name;
+
+	/**
+	 * Block type render callback.
+	 *
+	 * @since 5.0.0
+	 * @var callable
+	 */
+	public $render_callback;
+
+	/**
+	 * Block type attributes property schemas.
+	 *
+	 * @since 5.0.0
+	 * @var array
+	 */
+	public $attributes;
+
+	/**
+	 * Block type editor script handle.
+	 *
+	 * @since 5.0.0
+	 * @var string
+	 */
+	public $editor_script;
+
+	/**
+	 * Block type front end script handle.
+	 *
+	 * @since 5.0.0
+	 * @var string
+	 */
+	public $script;
+
+	/**
+	 * Block type editor style handle.
+	 *
+	 * @since 5.0.0
+	 * @var string
+	 */
+	public $editor_style;
+
+	/**
+	 * Block type front end style handle.
+	 *
+	 * @since 5.0.0
+	 * @var string
+	 */
+	public $style;
+
+	/**
+	 * Constructor.
+	 *
+	 * Will populate object properties from the provided arguments.
+	 *
+	 * @since 5.0.0
+	 *
+	 * @see register_block_type()
+	 *
+	 * @param string       $block_type Block type name including namespace.
+	 * @param array|string $args       Optional. Array or string of arguments for registering a block type.
+	 *                                 Default empty array.
+	 */
+	public function __construct( $block_type, $args = array() ) {
+		$this->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',
+				),
+			);
+	}
+}