Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
80.00% covered (warning)
80.00%
48 / 60
50.00% covered (danger)
50.00%
1 / 2
CRAP
n/a
0 / 0
Automattic\Jetpack\Extensions\AIAssistant\register_block
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
5
Automattic\Jetpack\Extensions\AIAssistant\load_assets
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Jetpack AI Assistant Block.
4 *
5 * @since 12.2
6 *
7 * @package automattic/jetpack
8 */
9
10namespace Automattic\Jetpack\Extensions\AIAssistant;
11
12use Automattic\Jetpack\Blocks;
13use Automattic\Jetpack\Status;
14use Automattic\Jetpack\Status\Host;
15use Jetpack_Gutenberg;
16
17if ( ! defined( 'ABSPATH' ) ) {
18    exit( 0 );
19}
20
21// Required directly rather than relying on the plugin bootstrap: on
22// WordPress.com Simple the extension files load through wpcom's own loader
23// and load-jetpack.php never runs.
24// This file loads before PHPUnit starts collecting coverage.
25// @codeCoverageIgnoreStart
26require_once __DIR__ . '/../../../_inc/lib/class-jetpack-ai-settings.php';
27// @codeCoverageIgnoreEnd
28
29/**
30 * Registers our block for use in Gutenberg
31 * This is done via an action so that we can disable
32 * registration if we need to.
33 */
34function register_block() {
35    if (
36    ( ( new Host() )->is_wpcom_simple()
37        || ! ( new Status() )->is_offline_mode()
38    ) && \Jetpack_AI_Settings::is_ai_enabled()
39        && \Jetpack_AI_Settings::is_feature_enabled( 'writing_assistant' )
40    ) {
41        Blocks::jetpack_register_block(
42            __DIR__,
43            array( 'render_callback' => __NAMESPACE__ . '\load_assets' )
44        );
45    }
46}
47add_action( 'init', __NAMESPACE__ . '\register_block' );
48
49/**
50 * Jetpack AI Assistant block registration/dependency declaration.
51 *
52 * @param array  $attr    Array containing the Jetpack AI Assistant block attributes.
53 * @param string $content String containing the Jetpack AI Assistant block content.
54 *
55 * @return string
56 */
57function load_assets( $attr, $content ) {
58    /*
59     * Enqueue necessary scripts and styles.
60     */
61    Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
62
63    return sprintf(
64        '<div class="%1$s">%2$s</div>',
65        esc_attr( Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr ) ),
66        $content
67    );
68}
69
70/**
71 * Register extensions.
72 */
73add_action(
74    'jetpack_register_gutenberg_extensions',
75    function () {
76        if ( \Jetpack_AI_Settings::is_ai_enabled() ) {
77            // The usage meter reports on every AI feature, so it follows the
78            // master switch alone.
79            Jetpack_Gutenberg::set_extension_available( 'ai-assistant-usage-panel' );
80
81            if ( \Jetpack_AI_Settings::is_feature_enabled( 'writing_assistant' ) ) {
82                Jetpack_Gutenberg::set_extension_available( 'ai-content-lens' );
83                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-support' );
84                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-form-support' );
85                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-backend-prompts' );
86                Jetpack_Gutenberg::set_extension_available( 'ai-title-optimization' );
87                Jetpack_Gutenberg::set_extension_available( 'ai-title-optimization-keywords-support' );
88
89                $site_locale = get_locale();
90                // Only enable Write Brief for sites with an English locale.
91                // Disabled by default; set the 'breve_enabled' filter to true to re-enable.
92                if ( str_starts_with( $site_locale, 'en' ) && apply_filters( 'breve_enabled', false ) ) {
93                    Jetpack_Gutenberg::set_extension_available( 'ai-proofread-breve' );
94                }
95
96                if ( apply_filters( 'ai_correct_spelling_enabled', false ) ) {
97                    Jetpack_Gutenberg::set_extension_available( 'ai-correct-spelling' );
98                }
99            }
100
101            if ( \Jetpack_AI_Settings::is_feature_enabled( 'image_editor' ) ) {
102                Jetpack_Gutenberg::set_extension_available( 'ai-featured-image-generator' );
103                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-experimental-image-generation-support' );
104                Jetpack_Gutenberg::set_extension_available( 'ai-general-purpose-image-generator' );
105                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-site-logo-support' );
106                Jetpack_Gutenberg::set_extension_available( 'ai-assistant-image-extension' );
107            }
108
109            if ( apply_filters( 'ai_seo_enhancer_enabled', true ) ) {
110                Jetpack_Gutenberg::set_availability_for_plan( 'ai-seo-enhancer' );
111            }
112        }
113    }
114);
115
116/**
117 * Register the `ai-list-to-table-transform` extension.
118 */
119add_action(
120    'jetpack_register_gutenberg_extensions',
121    function () {
122        if ( \Jetpack_AI_Settings::is_ai_enabled() &&
123            apply_filters( 'list_to_table_transform_enabled', false )
124        ) {
125            \Jetpack_Gutenberg::set_extension_available( 'ai-list-to-table-transform' );
126        }
127    }
128);
129
130/**
131 * Register the `ai-response-feedback` extension.
132 */
133add_action(
134    'jetpack_register_gutenberg_extensions',
135    function () {
136        if ( \Jetpack_AI_Settings::is_ai_enabled() &&
137            apply_filters( 'ai_response_feedback_enabled', true )
138        ) {
139            \Jetpack_Gutenberg::set_extension_available( 'ai-response-feedback' );
140        }
141    }
142);