From 18d0fbc3e6c8c635e2dcb6fa84a954f0579c5b06 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Tue, 20 Nov 2018 19:00:10 +0200 Subject: [PATCH] Fix the TinyMCE init array (#10968) * Fix the TinyMCE init array - Added "manual" convert from php to js, same as in class-wp-editor.php. - Reformated the code so it's more readable. * Fix missing space to fix failing tests... * Fix phpcs --- lib/client-assets.php | 196 ++++++++++++++++++++++-------------------- 1 file changed, 102 insertions(+), 94 deletions(-) diff --git a/lib/client-assets.php b/lib/client-assets.php index 620fe7c349852..fd1553c3cfd87 100644 --- a/lib/client-assets.php +++ b/lib/client-assets.php @@ -283,102 +283,110 @@ function gutenberg_register_scripts_and_styles() { 'window.wp.oldEditor = window.wp.editor;', 'after' ); - $tinymce_settings = apply_filters( - 'tiny_mce_before_init', - array( - 'plugins' => implode( - ',', - array_unique( - apply_filters( - 'tiny_mce_plugins', - array( - 'charmap', - 'colorpicker', - 'hr', - 'lists', - 'media', - 'paste', - 'tabfocus', - 'textcolor', - 'fullscreen', - 'wordpress', - 'wpautoresize', - 'wpeditimage', - 'wpemoji', - 'wpgallery', - 'wplink', - 'wpdialogs', - 'wptextpattern', - 'wpview', - ) - ) - ) - ), - 'toolbar1' => implode( - ',', - apply_filters( - 'mce_buttons', - array( - 'formatselect', - 'bold', - 'italic', - 'bullist', - 'numlist', - 'blockquote', - 'alignleft', - 'aligncenter', - 'alignright', - 'link', - 'unlink', - 'wp_more', - 'spellchecker', - 'wp_add_media', - 'kitchensink', - ), - 'editor' - ) - ), - 'toolbar2' => implode( - ',', - apply_filters( - 'mce_buttons_2', - array( - 'strikethrough', - 'hr', - 'forecolor', - 'pastetext', - 'removeformat', - 'charmap', - 'outdent', - 'indent', - 'undo', - 'redo', - 'wp_help', - ), - 'editor' - ) - ), - 'toolbar3' => implode( ',', apply_filters( 'mce_buttons_3', array(), 'editor' ) ), - 'toolbar4' => implode( ',', apply_filters( 'mce_buttons_4', array(), 'editor' ) ), - 'external_plugins' => apply_filters( 'mce_external_plugins', array() ), - ), - 'editor' + + $tinymce_plugins = array( + 'charmap', + 'colorpicker', + 'hr', + 'lists', + 'media', + 'paste', + 'tabfocus', + 'textcolor', + 'fullscreen', + 'wordpress', + 'wpautoresize', + 'wpeditimage', + 'wpemoji', + 'wpgallery', + 'wplink', + 'wpdialogs', + 'wptextpattern', + 'wpview', ); - if ( isset( $tinymce_settings['style_formats'] ) && is_string( $tinymce_settings['style_formats'] ) ) { - // Decode the options as we used to recommende json_encoding the TinyMCE settings. - $tinymce_settings['style_formats'] = json_decode( $tinymce_settings['style_formats'] ); - } - wp_localize_script( - 'wp-block-library', - 'wpEditorL10n', - array( - 'tinymce' => array( - 'baseURL' => includes_url( 'js/tinymce' ), - 'suffix' => SCRIPT_DEBUG ? '' : '.min', - 'settings' => $tinymce_settings, - ), - ) + $tinymce_plugins = apply_filters( 'tiny_mce_plugins', $tinymce_plugins, 'classic-block' ); + $tinymce_plugins = array_unique( $tinymce_plugins ); + + $toolbar1 = array( + 'formatselect', + 'bold', + 'italic', + 'bullist', + 'numlist', + 'blockquote', + 'alignleft', + 'aligncenter', + 'alignright', + 'link', + 'unlink', + 'wp_more', + 'spellchecker', + 'wp_add_media', + 'kitchensink', + ); + $toolbar1 = apply_filters( 'mce_buttons', $toolbar1, 'classic-block' ); + + $toolbar2 = array( + 'strikethrough', + 'hr', + 'forecolor', + 'pastetext', + 'removeformat', + 'charmap', + 'outdent', + 'indent', + 'undo', + 'redo', + 'wp_help', + ); + $toolbar2 = apply_filters( 'mce_buttons_2', $toolbar2, 'classic-block' ); + + $toolbar3 = apply_filters( 'mce_buttons_3', array(), 'classic-block' ); + $toolbar4 = apply_filters( 'mce_buttons_4', array(), 'classic-block' ); + + $external_plugins = apply_filters( 'mce_external_plugins', array(), 'classic-block' ); + + $tinymce_settings = array( + 'plugins' => implode( ',', $tinymce_plugins ), + 'toolbar1' => implode( ',', $toolbar1 ), + 'toolbar2' => implode( ',', $toolbar2 ), + 'toolbar3' => implode( ',', $toolbar3 ), + 'toolbar4' => implode( ',', $toolbar4 ), + 'external_plugins' => wp_json_encode( $external_plugins ), + 'classic_block_editor' => true, ); + $tinymce_settings = apply_filters( 'tiny_mce_before_init', $tinymce_settings, 'classic-block' ); + + // Do "by hand" translation from PHP array to js object. + // Prevents breakage in some custom settings. + $init_obj = ''; + foreach ( $tinymce_settings as $key => $value ) { + if ( is_bool( $value ) ) { + $val = $value ? 'true' : 'false'; + $init_obj .= $key . ':' . $val . ','; + continue; + } elseif ( ! empty( $value ) && is_string( $value ) && ( + ( '{' == $value{0} && '}' == $value{strlen( $value ) - 1} ) || + ( '[' == $value{0} && ']' == $value{strlen( $value ) - 1} ) || + preg_match( '/^\(?function ?\(/', $value ) ) ) { + + $init_obj .= $key . ':' . $value . ','; + continue; + } + $init_obj .= $key . ':"' . $value . '",'; + } + + $init_obj = '{' . trim( $init_obj, ' ,' ) . '}'; + + $script = 'window.wpEditorL10n = { + tinymce: { + baseURL: ' . wp_json_encode( includes_url( 'js/tinymce' ) ) . ', + suffix: ' . ( SCRIPT_DEBUG ? '""' : '".min"' ) . ', + settings: ' . $init_obj . ', + } + }'; + + wp_add_inline_script( 'wp-block-library', $script, 'before' ); // Editor Styles. // This empty stylesheet is defined to ensure backwards compatibility.