diff options
Diffstat (limited to 'plugins/jetpack/jetpack_vendor/automattic/jetpack-blocks/src/class-blocks.php')
-rw-r--r-- | plugins/jetpack/jetpack_vendor/automattic/jetpack-blocks/src/class-blocks.php | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/plugins/jetpack/jetpack_vendor/automattic/jetpack-blocks/src/class-blocks.php b/plugins/jetpack/jetpack_vendor/automattic/jetpack-blocks/src/class-blocks.php new file mode 100644 index 00000000..2ddf6f3d --- /dev/null +++ b/plugins/jetpack/jetpack_vendor/automattic/jetpack-blocks/src/class-blocks.php @@ -0,0 +1,291 @@ +<?php +/** Blocks package. + * + * @since 1.1.0 + * + * This package lifts elements from Jetpack's Jetpack_Gutenberg class. + * It is now an standalone package reusable outside Jetpack. + * + * @package automattic/jetpack-blocks + */ + +namespace Automattic\Jetpack; + +use Jetpack_Gutenberg; + +/** + * Register and manage blocks within a plugin. Used to manage block registration, enqueues, and more. + * + * @since 1.1.0 + */ +class Blocks { + /** + * Wrapper function to safely register a Gutenberg block type + * + * @see register_block_type + * @see Automattic\Jetpack\Blocks::is_gutenberg_version_available + * + * @since 1.1.0 + * + * @param string $slug Slug of the block. + * @param array $args { + * Arguments that are passed into register_block_type. + * See register_block_type for full list of arguments. + * Can also include 2 extra arguments not currently supported by register_block_type. + * + * @type array $version_requirements Array containing required Gutenberg version and, if known, the WordPress version that was released with this minimum version. + * @type bool $plan_check Should we check for a specific plan before registering the block. + * } + * + * @return WP_Block_Type|false The registered block type on success, or false on failure. + */ + public static function jetpack_register_block( $slug, $args = array() ) { + if ( 0 !== strpos( $slug, 'jetpack/' ) && ! strpos( $slug, '/' ) ) { + _doing_it_wrong( 'jetpack_register_block', 'Prefix the block with jetpack/ ', 'Jetpack 9.0.0' ); + $slug = 'jetpack/' . $slug; + } + + if ( + isset( $args['version_requirements'] ) + && ! self::is_gutenberg_version_available( $args['version_requirements'], $slug ) + ) { + return false; + } + + // Checking whether block is registered to ensure it isn't registered twice. + if ( self::is_registered( $slug ) ) { + return false; + } + + $feature_name = self::remove_extension_prefix( $slug ); + + // This is only useful in Jetpack. + if ( ! self::is_standalone_block() ) { + // If the block is dynamic, and a Jetpack block, wrap the render_callback to check availability. + if ( ! empty( $args['plan_check'] ) ) { + // Set up attributes. + if ( ! isset( $args['attributes'] ) ) { + $args['attributes'] = array(); + } + $args['attributes'] = array_merge( + $args['attributes'], + array( + // Indicates that this block should display an upgrade nudge on the frontend when applicable. + 'shouldDisplayFrontendBanner' => array( + 'type' => 'boolean', + 'default' => true, + ), + ) + ); + if ( isset( $args['render_callback'] ) ) { + $args['render_callback'] = Jetpack_Gutenberg::get_render_callback_with_availability_check( $feature_name, $args['render_callback'] ); + } + $method_name = 'set_availability_for_plan'; + } else { + $method_name = 'set_extension_available'; + } + + add_action( + 'jetpack_register_gutenberg_extensions', + function () use ( $feature_name, $method_name ) { + call_user_func( array( 'Jetpack_Gutenberg', $method_name ), $feature_name ); + } + ); + + // Ensure editor styles are registered so that the site editor knows about the + // editor style dependency when copying styles to the editor iframe. + if ( ! isset( $args['editor_style'] ) ) { + $args['editor_style'] = 'jetpack-blocks-editor'; + } + } + + return register_block_type( $slug, $args ); + } + + /** + * Check if an extension/block is already registered + * + * @since 1.1.0 + * + * @param string $slug Name of extension/block to check. + * + * @return bool + */ + public static function is_registered( $slug ) { + return \WP_Block_Type_Registry::get_instance()->is_registered( $slug ); + } + + /** + * Remove the 'jetpack/' or jetpack-' prefix from an extension name + * + * @since 1.1.0 + * + * @param string $extension_name The extension name. + * + * @return string The unprefixed extension name. + */ + public static function remove_extension_prefix( $extension_name ) { + if ( 0 === strpos( $extension_name, 'jetpack/' ) || 0 === strpos( $extension_name, 'jetpack-' ) ) { + return substr( $extension_name, strlen( 'jetpack/' ) ); + } + return $extension_name; + } + + /** + * Check to see if a minimum version of Gutenberg is available. Because a Gutenberg version is not available in + * php if the Gutenberg plugin is not installed, if we know which minimum WP release has the required version we can + * optionally fall back to that. + * + * @since 1.1.0 + * + * @param array $version_requirements { + * An array containing the required Gutenberg version and, if known, the WordPress version that was released with this minimum version. + * + * @type string $gutenberg Gutenberg version. + * @type string $wp Optional. WordPress version. + * } + * @param string $slug The slug of the block or plugin that has the Gutenberg version requirement. + * + * @return boolean True if the version of Gutenberg required by the block or plugin is available. + */ + public static function is_gutenberg_version_available( $version_requirements, $slug ) { + global $wp_version; + + // Bail if we don't at least have the Gutenberg version requirement, the WP version is optional. + if ( empty( $version_requirements['gutenberg'] ) ) { + return false; + } + + // If running a local dev build of Gutenberg plugin GUTENBERG_DEVELOPMENT_MODE is set so assume correct version. + if ( defined( 'GUTENBERG_DEVELOPMENT_MODE' ) && GUTENBERG_DEVELOPMENT_MODE ) { + return true; + } + + $version_available = false; + + // If running a production build of the Gutenberg plugin then GUTENBERG_VERSION is set, otherwise if WP version + // with required version of Gutenberg is known check that. + if ( defined( 'GUTENBERG_VERSION' ) ) { + $version_available = version_compare( GUTENBERG_VERSION, $version_requirements['gutenberg'], '>=' ); + } elseif ( ! empty( $version_requirements['wp'] ) ) { + $version_available = version_compare( $wp_version, $version_requirements['wp'], '>=' ); + } + + if ( + ! $version_available + && ! self::is_standalone_block() // This is only useful in Jetpack. + ) { + Jetpack_Gutenberg::set_extension_unavailable( + $slug, + 'incorrect_gutenberg_version', + array( + 'required_feature' => $slug, + 'required_version' => $version_requirements, + 'current_version' => array( + 'wp' => $wp_version, + 'gutenberg' => defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : null, + ), + ) + ); + } + + return $version_available; + } + + /** + * Get CSS classes for a block. + * + * @since 1.1.0 + * + * @param string $slug Block slug. + * @param array $attr Block attributes. + * @param array $extra Potential extra classes you may want to provide. + * + * @return string $classes List of CSS classes for a block. + */ + public static function classes( $slug, $attr, $extra = array() ) { + if ( empty( $slug ) ) { + return ''; + } + + // Basic block name class. + $classes = array( + 'wp-block-jetpack-' . $slug, + ); + + // Add alignment if provided. + if ( + ! empty( $attr['align'] ) + && in_array( $attr['align'], array( 'left', 'center', 'right', 'wide', 'full' ), true ) + ) { + $classes[] = 'align' . $attr['align']; + } + + // Add custom classes if provided in the block editor. + if ( ! empty( $attr['className'] ) ) { + $classes[] = $attr['className']; + } + + // Add any extra classes. + if ( is_array( $extra ) && ! empty( $extra ) ) { + $classes = array_merge( $classes, array_filter( $extra ) ); + } + + return implode( ' ', $classes ); + } + + /** + * Does the page return AMP content. + * + * @since 1.1.0 + * + * @return bool $is_amp_request Are we on an AMP view. + */ + public static function is_amp_request() { + $is_amp_request = ( function_exists( 'is_amp_endpoint' ) && is_amp_endpoint() ); + + /** This filter is documented in 3rd-party/class.jetpack-amp-support.php */ + return apply_filters( 'jetpack_is_amp_request', $is_amp_request ); + } + + /** + * Is the current theme an FSE/Site Editor theme. + * + * @since 1.4.0 + * + * @return bool True if the current theme is an FSE/Site Editor theme. + */ + public static function is_fse_theme() { + $is_fse_theme = function_exists( 'gutenberg_is_fse_theme' ) && gutenberg_is_fse_theme(); + + /** + * Returns true if the current theme is an FSE/Site Editor theme. + * + * @since 1.4.0 + * + * @param boolean $is_fse_theme Is the theme an FSE theme. + */ + return apply_filters( 'jetpack_is_fse_theme', $is_fse_theme ); + } + + /** + * Check whether or the block being registered is a standalone block, + * running in a context outside of the Jetpack plugin. + * + * @since 1.3.0 + * + * @return bool + */ + public static function is_standalone_block() { + $is_standalone_block = ! class_exists( Jetpack_Gutenberg::class ); + + /** + * Returns true if the block is not being registered within a Jetpack plugin context. + * + * @since 1.3.0 + * + * @param boolean $is_standalone_block Is the block running standalone versus as part of the Jetpack plugin. + */ + return apply_filters( 'jetpack_is_standalone_block', $is_standalone_block ); + } +} |