/** * @static * * @global string $wp_version * @global string $tinymce_version * * @param string $editor_id * @param array $set */ public static function editor_settings($editor_id, $set) { global $wp_version, $tinymce_version; if (empty(self::$first_init)) { if (is_admin()) { add_action('admin_print_footer_scripts', array(__CLASS__, 'editor_js'), 50); add_action('admin_print_footer_scripts', array(__CLASS__, 'enqueue_scripts'), 1); } else { add_action('wp_print_footer_scripts', array(__CLASS__, 'editor_js'), 50); add_action('wp_print_footer_scripts', array(__CLASS__, 'enqueue_scripts'), 1); } } if (self::$this_quicktags) { $qtInit = array('id' => $editor_id, 'buttons' => ''); if (is_array($set['quicktags'])) { $qtInit = array_merge($qtInit, $set['quicktags']); } if (empty($qtInit['buttons'])) { $qtInit['buttons'] = 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close'; } if ($set['_content_editor_dfw']) { $qtInit['buttons'] .= ',dfw'; } /** * Filters the Quicktags settings. * * @since 3.3.0 * * @param array $qtInit Quicktags settings. * @param string $editor_id The unique editor ID, e.g. 'content'. */ $qtInit = apply_filters('quicktags_settings', $qtInit, $editor_id); self::$qt_settings[$editor_id] = $qtInit; self::$qt_buttons = array_merge(self::$qt_buttons, explode(',', $qtInit['buttons'])); } if (self::$this_tinymce) { if (empty(self::$first_init)) { self::$baseurl = includes_url('js/tinymce'); $mce_locale = get_locale(); self::$mce_locale = $mce_locale = empty($mce_locale) ? 'en' : strtolower(substr($mce_locale, 0, 2)); // ISO 639-1 /** This filter is documented in wp-admin/includes/media.php */ $no_captions = (bool) apply_filters('disable_captions', ''); $ext_plugins = ''; if ($set['teeny']) { /** * Filters the list of teenyMCE plugins. * * @since 2.7.0 * * @param array $plugins An array of teenyMCE plugins. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ self::$plugins = $plugins = apply_filters('teeny_mce_plugins', array('colorpicker', 'lists', 'fullscreen', 'image', 'wordpress', 'wpeditimage', 'wplink'), $editor_id); } else { /** * Filters the list of TinyMCE external plugins. * * The filter takes an associative array of external plugins for * TinyMCE in the form 'plugin_name' => 'url'. * * The url should be absolute, and should include the js filename * to be loaded. For example: * 'myplugin' => 'http://mysite.com/wp-content/plugins/myfolder/mce_plugin.js'. * * If the external plugin adds a button, it should be added with * one of the 'mce_buttons' filters. * * @since 2.5.0 * * @param array $external_plugins An array of external TinyMCE plugins. */ $mce_external_plugins = apply_filters('mce_external_plugins', array()); $plugins = array('charmap', 'colorpicker', 'hr', 'lists', 'media', 'paste', 'tabfocus', 'textcolor', 'fullscreen', 'wordpress', 'wpautoresize', 'wpeditimage', 'wpemoji', 'wpgallery', 'wplink', 'wpdialogs', 'wptextpattern', 'wpview', 'wpembed'); if (!self::$has_medialib) { $plugins[] = 'image'; } /** * Filters the list of default TinyMCE plugins. * * The filter specifies which of the default plugins included * in WordPress should be added to the TinyMCE instance. * * @since 3.3.0 * * @param array $plugins An array of default TinyMCE plugins. */ $plugins = array_unique(apply_filters('tiny_mce_plugins', $plugins)); if (($key = array_search('spellchecker', $plugins)) !== false) { // Remove 'spellchecker' from the internal plugins if added with 'tiny_mce_plugins' filter to prevent errors. // It can be added with 'mce_external_plugins'. unset($plugins[$key]); } if (!empty($mce_external_plugins)) { /** * Filters the translations loaded for external TinyMCE 3.x plugins. * * The filter takes an associative array ('plugin_name' => 'path') * where 'path' is the include path to the file. * * The language file should follow the same format as wp_mce_translation(), * and should define a variable ($strings) that holds all translated strings. * * @since 2.5.0 * * @param array $translations Translations for external TinyMCE plugins. */ $mce_external_languages = apply_filters('mce_external_languages', array()); $loaded_langs = array(); $strings = ''; if (!empty($mce_external_languages)) { foreach ($mce_external_languages as $name => $path) { if (@is_file($path) && @is_readable($path)) { include_once $path; $ext_plugins .= $strings . "\n"; $loaded_langs[] = $name; } } } foreach ($mce_external_plugins as $name => $url) { if (in_array($name, $plugins, true)) { unset($mce_external_plugins[$name]); continue; } $url = set_url_scheme($url); $mce_external_plugins[$name] = $url; $plugurl = dirname($url); $strings = ''; // Try to load langs/[locale].js and langs/[locale]_dlg.js if (!in_array($name, $loaded_langs, true)) { $path = str_replace(content_url(), '', $plugurl); $path = WP_CONTENT_DIR . $path . '/langs/'; if (function_exists('realpath')) { $path = trailingslashit(realpath($path)); } if (@is_file($path . $mce_locale . '.js')) { $strings .= @file_get_contents($path . $mce_locale . '.js') . "\n"; } if (@is_file($path . $mce_locale . '_dlg.js')) { $strings .= @file_get_contents($path . $mce_locale . '_dlg.js') . "\n"; } if ('en' != $mce_locale && empty($strings)) { if (@is_file($path . 'en.js')) { $str1 = @file_get_contents($path . 'en.js'); $strings .= preg_replace('/([\'"])en\\./', '$1' . $mce_locale . '.', $str1, 1) . "\n"; } if (@is_file($path . 'en_dlg.js')) { $str2 = @file_get_contents($path . 'en_dlg.js'); $strings .= preg_replace('/([\'"])en\\./', '$1' . $mce_locale . '.', $str2, 1) . "\n"; } } if (!empty($strings)) { $ext_plugins .= "\n" . $strings . "\n"; } } $ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n"; $ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . "\n"; } } } self::$plugins = $plugins; self::$ext_plugins = $ext_plugins; self::$first_init = array('theme' => 'modern', 'skin' => 'lightgray', 'language' => self::$mce_locale, 'formats' => '{' . 'alignleft: [' . '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"left"}},' . '{selector: "img,table,dl.wp-caption", classes: "alignleft"}' . '],' . 'aligncenter: [' . '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"center"}},' . '{selector: "img,table,dl.wp-caption", classes: "aligncenter"}' . '],' . 'alignright: [' . '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"right"}},' . '{selector: "img,table,dl.wp-caption", classes: "alignright"}' . '],' . 'strikethrough: {inline: "del"}' . '}', 'relative_urls' => false, 'remove_script_host' => false, 'convert_urls' => false, 'browser_spellcheck' => true, 'fix_list_elements' => true, 'entities' => '38,amp,60,lt,62,gt', 'entity_encoding' => 'raw', 'keep_styles' => false, 'cache_suffix' => 'wp-mce-' . $tinymce_version, 'preview_styles' => 'font-family font-size font-weight font-style text-decoration text-transform', 'end_container_on_empty_block' => true, 'wpeditimage_disable_captions' => $no_captions, 'wpeditimage_html5_captions' => current_theme_supports('html5', 'caption'), 'plugins' => implode(',', $plugins), 'wp_lang_attr' => get_bloginfo('language')); if (!empty($mce_external_plugins)) { self::$first_init['external_plugins'] = wp_json_encode($mce_external_plugins); } $suffix = SCRIPT_DEBUG ? '' : '.min'; $version = 'ver=' . $wp_version; $dashicons = includes_url("css/dashicons{$suffix}.css?{$version}"); // WordPress default stylesheet and dashicons $mce_css = array($dashicons, self::$baseurl . '/skins/wordpress/wp-content.css?' . $version); $editor_styles = get_editor_stylesheets(); if (!empty($editor_styles)) { foreach ($editor_styles as $style) { $mce_css[] = $style; } } /** * Filters the comma-delimited list of stylesheets to load in TinyMCE. * * @since 2.1.0 * * @param string $stylesheets Comma-delimited list of stylesheets. */ $mce_css = trim(apply_filters('mce_css', implode(',', $mce_css)), ' ,'); if (!empty($mce_css)) { self::$first_init['content_css'] = $mce_css; } } if ($set['teeny']) { /** * Filters the list of teenyMCE buttons (Text tab). * * @since 2.7.0 * * @param array $buttons An array of teenyMCE buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons = apply_filters('teeny_mce_buttons', array('bold', 'italic', 'underline', 'blockquote', 'strikethrough', 'bullist', 'numlist', 'alignleft', 'aligncenter', 'alignright', 'undo', 'redo', 'link', 'unlink', 'fullscreen'), $editor_id); $mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = array(); } else { $mce_buttons = array('bold', 'italic', 'strikethrough', 'bullist', 'numlist', 'blockquote', 'hr', 'alignleft', 'aligncenter', 'alignright', 'link', 'unlink', 'wp_more', 'spellchecker'); if (!wp_is_mobile()) { if ($set['_content_editor_dfw']) { $mce_buttons[] = 'dfw'; } else { $mce_buttons[] = 'fullscreen'; } } $mce_buttons[] = 'wp_adv'; /** * Filters the first-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * * @param array $buttons First-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons = apply_filters('mce_buttons', $mce_buttons, $editor_id); $mce_buttons_2 = array('formatselect', 'underline', 'alignjustify', 'forecolor', 'pastetext', 'removeformat', 'charmap', 'outdent', 'indent', 'undo', 'redo'); if (!wp_is_mobile()) { $mce_buttons_2[] = 'wp_help'; } /** * Filters the second-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * * @param array $buttons Second-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons_2 = apply_filters('mce_buttons_2', $mce_buttons_2, $editor_id); /** * Filters the third-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * * @param array $buttons Third-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons_3 = apply_filters('mce_buttons_3', array(), $editor_id); /** * Filters the fourth-row list of TinyMCE buttons (Visual tab). * * @since 2.5.0 * * @param array $buttons Fourth-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons_4 = apply_filters('mce_buttons_4', array(), $editor_id); } $body_class = $editor_id; if ($post = get_post()) { $body_class .= ' post-type-' . sanitize_html_class($post->post_type) . ' post-status-' . sanitize_html_class($post->post_status); if (post_type_supports($post->post_type, 'post-formats')) { $post_format = get_post_format($post); if ($post_format && !is_wp_error($post_format)) { $body_class .= ' post-format-' . sanitize_html_class($post_format); } else { $body_class .= ' post-format-standard'; } } } $body_class .= ' locale-' . sanitize_html_class(strtolower(str_replace('_', '-', get_locale()))); if (!empty($set['tinymce']['body_class'])) { $body_class .= ' ' . $set['tinymce']['body_class']; unset($set['tinymce']['body_class']); } $mceInit = array('selector' => "#{$editor_id}", 'resize' => 'vertical', 'menubar' => false, 'wpautop' => (bool) $set['wpautop'], 'indent' => !$set['wpautop'], 'toolbar1' => implode($mce_buttons, ','), 'toolbar2' => implode($mce_buttons_2, ','), 'toolbar3' => implode($mce_buttons_3, ','), 'toolbar4' => implode($mce_buttons_4, ','), 'tabfocus_elements' => $set['tabfocus_elements'], 'body_class' => $body_class); // Merge with the first part of the init array $mceInit = array_merge(self::$first_init, $mceInit); if (is_array($set['tinymce'])) { $mceInit = array_merge($mceInit, $set['tinymce']); } /* * For people who really REALLY know what they're doing with TinyMCE * You can modify $mceInit to add, remove, change elements of the config * before tinyMCE.init. Setting "valid_elements", "invalid_elements" * and "extended_valid_elements" can be done through this filter. Best * is to use the default cleanup by not specifying valid_elements, * as TinyMCE checks against the full set of HTML 5.0 elements and attributes. */ if ($set['teeny']) { /** * Filters the teenyMCE config before init. * * @since 2.7.0 * * @param array $mceInit An array with teenyMCE config. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mceInit = apply_filters('teeny_mce_before_init', $mceInit, $editor_id); } else { /** * Filters the TinyMCE config before init. * * @since 2.5.0 * * @param array $mceInit An array with TinyMCE config. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mceInit = apply_filters('tiny_mce_before_init', $mceInit, $editor_id); } if (empty($mceInit['toolbar3']) && !empty($mceInit['toolbar4'])) { $mceInit['toolbar3'] = $mceInit['toolbar4']; $mceInit['toolbar4'] = ''; } self::$mce_settings[$editor_id] = $mceInit; } // end if self::$this_tinymce }
private function has_editor_style() { if (!current_theme_supports('editor-style')) { return 'not-supporetd'; } $editor_stylesheets = get_editor_stylesheets(); if (is_array($editor_stylesheets)) { foreach ($editor_stylesheets as $url) { if (strpos($url, 'editor-style.css') !== false) { return 'present'; } } } return 'not-present'; }
/** * remove_theme_css * Remove the editor css from editors that aren't for post content. * * @param array $mceInit The tinymce init object. * @param string $editor_id The editor id. * * @return array The tinymce init object. * * @access public * @static * @since 1.0 */ public static function remove_theme_css($mceInit, $editor_id) { $prefix = piklist::$prefix . 'post_post_content'; if ($editor_id != 'content' && substr($editor_id, 0, strlen($prefix)) !== $prefix) { $stylesheets = get_editor_stylesheets(); $content_css = explode(',', $mceInit['content_css']); $content_css = array_diff($content_css, $stylesheets); array_push($content_css, piklist::$add_ons['piklist']['url'] . '/parts/css/tinymce-piklist.css'); $mceInit['content_css'] = implode(',', $content_css); } return $mceInit; }
/** * Generate javascript for the copying to the template. * * @param none * @return none */ public function admin_footer() { global $hook_suffix; if ('post-new.php' === $hook_suffix) { if (get_post_type() === $this->post_type) { if (isset($_GET['origin']) && intval($_GET['origin'])) { $origin = get_post(intval($_GET['origin'])); if ($origin) { $template = array('post_title' => $origin->post_title, 'post_content' => wpautop($origin->post_content)); ?> <script type="text/javascript"> var origin = <?php echo json_encode($template); ?> ; jQuery( '#title').val(origin.post_title ); jQuery( '#content').val(origin.post_content ); </script> <?php } } } } ?> <div id="tinymce-templates-backdrop" style="desplay: none;"></div> <div id="tinymce-templates-wrap" class="wp-core-ui search-panel-visible" style="desplay: none;"> <div class="modal"> <div class="header"> <h1><span class="dashicons dashicons-edit"></span> <?php _e('Insert Template', 'tinymce_templates'); ?> </h1> <a href="#" class="close"><span class="dashicons dashicons-no-alt"></span></a> </div> <div class="container"> <select id="tinymce-templates-list"></select> <iframe id="tinymce-templates-preview"></iframe> </div> <div class="footer"> <div id="tinymce-templates-message"><?php _e('Note: The template will be inserted as shortcode.', 'tinymce_templates'); ?> </div> <a href="#" id="tinymce-templates-insert" class="button button-primary button-large template-button-insert" disabled><?php _e('Insert Template', 'tinymce_templates'); ?> </a> </div> </div> </div> <?php $url = admin_url('admin-ajax.php'); $nonce = wp_create_nonce('tinymce_templates'); $args = array('action' => 'tinymce_templates', 'nonce' => $nonce); ?> <script type="text/javascript"> var tinymce_templates_list_uri = '<?php echo esc_url($url); ?> '; var tinymce_templates_list_args = <?php echo json_encode($args); ?> ; var tinymce_templates_editor_stylesheets = <?php echo json_encode(get_editor_stylesheets()); ?> ; </script> <?php }
public function print_window_js_var() { global $wp_version, $tinymce_version, $concatenate_scripts, $compress_scripts; /** * Filter "tiny_mce_version" is deprecated * * The tiny_mce_version filter is not needed since external plugins are loaded directly by TinyMCE. * These plugins can be refreshed by appending query string to the URL passed to "mce_external_plugins" filter. * If the plugin has a popup dialog, a query string can be added to the button action that opens it (in the plugin's code). */ $version = 'ver=' . $tinymce_version; $ext_plugins = ''; $mce_locale = get_locale(); /** * Filter the list of teenyMCE buttons (Text tab). * * @since 2.7.0 * * @param array $buttons An array of teenyMCE buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $ctf_teeny_mce_buttons = apply_filters('teeny_mce_buttons', array('bold', 'italic', 'underline', 'blockquote', 'strikethrough', 'bullist', 'numlist', 'alignleft', 'aligncenter', 'alignright', 'undo', 'redo', 'link', 'unlink', 'fullscreen')); $mce_buttons = array('bold', 'italic', 'strikethrough', 'bullist', 'numlist', 'blockquote', 'hr', 'alignleft', 'aligncenter', 'alignright', 'link', 'unlink', 'wp_more', 'spellchecker'); if (!wp_is_mobile()) { $mce_buttons[] = 'fullscreen'; } $mce_buttons[] = 'wp_adv'; /** * Filter the first-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * * @param array $buttons First-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons = apply_filters('mce_buttons', $mce_buttons); $mce_buttons_2 = array('formatselect', 'underline', 'alignjustify', 'forecolor', 'pastetext', 'removeformat', 'charmap', 'outdent', 'indent', 'undo', 'redo'); if (!wp_is_mobile()) { $mce_buttons_2[] = 'wp_help'; } /** * Filter the second-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * * @param array $buttons Second-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons_2 = apply_filters('mce_buttons_2', $mce_buttons_2); /** * Filter the third-row list of TinyMCE buttons (Visual tab). * * @since 2.0.0 * * @param array $buttons Third-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons_3 = apply_filters('mce_buttons_3', array()); /** * Filter the fourth-row list of TinyMCE buttons (Visual tab). * * @since 2.5.0 * * @param array $buttons Fourth-row list of buttons. * @param string $editor_id Unique editor identifier, e.g. 'content'. */ $mce_buttons_4 = apply_filters('mce_buttons_4', array()); $ctf_teeny_plugins = apply_filters('teeny_mce_plugins', array('colorpicker', 'lists', 'fullscreen', 'image', 'wordpress', 'wpeditimage', 'wplink')); /** * Filter the list of TinyMCE external plugins. * * The filter takes an associative array of external plugins for * TinyMCE in the form 'plugin_name' => 'url'. * * The url should be absolute, and should include the js filename * to be loaded. For example: * 'myplugin' => 'http://mysite.com/wp-content/plugins/myfolder/mce_plugin.js'. * * If the external plugin adds a button, it should be added with * one of the 'mce_buttons' filters. * * @since 2.5.0 * * @param array $external_plugins An array of external TinyMCE plugins. */ $mce_external_plugins = apply_filters('mce_external_plugins', array()); $plugins = array('charmap', 'colorpicker', 'hr', 'lists', 'media', 'paste', 'tabfocus', 'textcolor', 'fullscreen', 'wordpress', 'wpautoresize', 'wpeditimage', 'wpemoji', 'wpgallery', 'wplink', 'wpdialogs', 'wptextpattern', 'wpview', 'wpembed'); $plugins[] = 'image'; /** * Filter the list of default TinyMCE plugins. * * The filter specifies which of the default plugins included * in WordPress should be added to the TinyMCE instance. * * @since 3.3.0 * * @param array $plugins An array of default TinyMCE plugins. */ $plugins = array_unique(apply_filters('tiny_mce_plugins', $plugins)); if (($key = array_search('spellchecker', $plugins)) !== false) { // Remove 'spellchecker' from the internal plugins if added with 'tiny_mce_plugins' filter to prevent errors. // It can be added with 'mce_external_plugins'. unset($plugins[$key]); } if (!empty($mce_external_plugins)) { /** * Filter the translations loaded for external TinyMCE 3.x plugins. * * The filter takes an associative array ('plugin_name' => 'path') * where 'path' is the include path to the file. * * The language file should follow the same format as wp_mce_translation(), * and should define a variable ($strings) that holds all translated strings. * * @since 2.5.0 * * @param array $translations Translations for external TinyMCE plugins. */ $mce_external_languages = apply_filters('mce_external_languages', array()); $loaded_langs = array(); $strings = ''; if (!empty($mce_external_languages)) { foreach ($mce_external_languages as $name => $path) { if (@is_file($path) && @is_readable($path)) { include_once $path; $ext_plugins .= $strings . "\n"; $loaded_langs[] = $name; } } } foreach ($mce_external_plugins as $name => $url) { if (in_array($name, $plugins, true)) { unset($mce_external_plugins[$name]); continue; } $url = set_url_scheme($url); $mce_external_plugins[$name] = $url; $plugurl = dirname($url); $strings = ''; // Try to load langs/[locale].js and langs/[locale]_dlg.js if (!in_array($name, $loaded_langs, true)) { $path = str_replace(content_url(), '', $plugurl); $path = WP_CONTENT_DIR . $path . '/langs/'; if (function_exists('realpath')) { $path = trailingslashit(realpath($path)); } if (@is_file($path . $mce_locale . '.js')) { $strings .= @file_get_contents($path . $mce_locale . '.js') . "\n"; } if (@is_file($path . $mce_locale . '_dlg.js')) { $strings .= @file_get_contents($path . $mce_locale . '_dlg.js') . "\n"; } if ('en' != $mce_locale && empty($strings)) { if (@is_file($path . 'en.js')) { $str1 = @file_get_contents($path . 'en.js'); $strings .= preg_replace('/([\'"])en\\./', '$1' . $mce_locale . '.', $str1, 1) . "\n"; } if (@is_file($path . 'en_dlg.js')) { $str2 = @file_get_contents($path . 'en_dlg.js'); $strings .= preg_replace('/([\'"])en\\./', '$1' . $mce_locale . '.', $str2, 1) . "\n"; } } if (!empty($strings)) { $ext_plugins .= "\n" . $strings . "\n"; } } $ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . "\n"; } } // WordPress default stylesheet and dashicons $mce_css = array(includes_url("css/dashicons.min.css"), includes_url('js/tinymce') . '/skins/wordpress/wp-content.css?' . $version); $editor_styles = get_editor_stylesheets(); if (!empty($editor_styles)) { foreach ($editor_styles as $style) { $mce_css[] = $style; } } /** * Filter the comma-delimited list of stylesheets to load in TinyMCE. * * @since 2.1.0 * * @param string $stylesheets Comma-delimited list of stylesheets. */ $mce_css = trim(apply_filters('mce_css', implode(',', $mce_css)), ' ,'); ?> <script type="text/javascript"> window.ctf_teeny_mce_buttons = "<?php echo implode(',', $ctf_teeny_mce_buttons); ?> "; window.ctf_mce_buttons = "<?php echo implode(',', $mce_buttons); ?> "; window.ctf_mce_buttons_2 = "<?php echo implode(',', $mce_buttons_2); ?> "; window.ctf_mce_buttons_3 = "<?php echo implode(',', $mce_buttons_3); ?> "; window.ctf_mce_buttons_4 = "<?php echo implode(',', $mce_buttons_4); ?> "; window.ctf_plugins = "<?php echo implode(',', $plugins); ?> "; window.ctf_mce_css = "<?php echo $mce_css; ?> "; window.ctf_mce_external_plugins = <?php echo json_encode($mce_external_plugins); ?> ; </script> <?php }