Пример #1
0
 /**
  * @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
 }
Пример #2
0
 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';
 }
Пример #3
0
 /**
  * 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;
 }
Пример #4
0
    /**
     * 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 
    }
Пример #5
0
        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 
        }