WordPress.org

Make WordPress Core

Ticket #5807: new-mce-compressor.patch

File new-mce-compressor.patch, 27.6 KB (added by azaozz, 10 years ago)
  • wp-includes/default-filters.php

     
    143143add_filter('option_blog_charset', 'wp_specialchars');
    144144add_filter('option_home', '_config_wp_home');
    145145add_filter('option_siteurl', '_config_wp_siteurl');
    146 add_filter('mce_plugins', '_mce_load_rtl_plugin');
    147 add_filter('mce_buttons', '_mce_add_direction_buttons');
     146add_filter('tiny_mce_before_init', '_mce_set_direction');
    148147add_filter('pre_kses', 'wp_pre_kses_less_than');
    149148add_filter('sanitize_title', 'sanitize_title_with_dashes');
    150149add_action('check_comment_flood', 'check_comment_flood_db', 10, 3);
     
    173172add_action('do_robots', 'do_robots');
    174173add_action('sanitize_comment_cookies', 'sanitize_comment_cookies');
    175174add_action('admin_print_scripts', 'wp_print_scripts', 20);
    176 add_action('mce_options', '_mce_set_direction');
    177175add_action('init', 'smilies_init', 5);
    178176add_action( 'plugins_loaded', 'wp_maybe_load_widgets', 0 );
    179177add_action( 'shutdown', 'wp_ob_end_flush_all', 1);
  • wp-includes/functions.php

     
    13831383}
    13841384
    13851385
    1386 function _mce_set_direction() {
     1386function _mce_set_direction( $input ) {
    13871387        global $wp_locale;
    13881388
    13891389        if ( 'rtl' == $wp_locale->text_direction ) {
    1390                 echo 'directionality : "rtl" ,';
    1391                 echo 'theme_advanced_toolbar_align : "right" ,';
     1390                $input['directionality'] = 'rtl';
     1391                $input['theme_advanced_toolbar_align'] = 'right';
     1392                $input['plugins'] .= ',directionality';
     1393                $input['theme_advanced_buttons2'] .= ',|,ltr,rtl';
    13921394        }
    1393 }
    13941395
    1395 
    1396 function _mce_load_rtl_plugin( $input ) {
    1397         global $wp_locale;
    1398 
    1399         if ( 'rtl' == $wp_locale->text_direction )
    1400                 $input[] = 'directionality';
    1401 
    14021396        return $input;
    14031397}
    14041398
    14051399
    1406 function _mce_add_direction_buttons( $input ) {
    1407         global $wp_locale;
    1408 
    1409         if ( 'rtl' == $wp_locale->text_direction ) {
    1410                 $new_buttons = array( 'separator', 'ltr', 'rtl' );
    1411                 $input = array_merge( $input, $new_buttons );
    1412         }
    1413 
    1414         return $input;
    1415 }
    1416 
    1417 
    14181400function smilies_init() {
    14191401        global $wpsmiliestrans, $wp_smiliessearch, $wp_smiliesreplace;
    14201402
  • wp-includes/js/tinymce/tiny_mce_config.php

     
    1 <?php
    2         @ require('../../../wp-config.php');
    3         cache_javascript_headers();
     1<?php
     2// some code below is from:
     3/**
     4 * $Id: tiny_mce_gzip.php 315 2007-10-25 14:03:43Z spocke $
     5 *
     6 * @author Moxiecode
     7 * @copyright Copyright © 2005-2006, Moxiecode Systems AB, All rights reserved.
     8 *
     9 * This file compresses the TinyMCE JavaScript using GZip.
     10 **/
     11 
     12@ require('../../../wp-config.php');
    413
    5         // deprecated
    6     function wp_translate_tinymce_lang($text) {
    7                 if ( ! function_exists('__') ) {
    8                         return $text;
    9                 } else {
    10                         $search1 = "/^tinyMCELang\\[(['\"])(.*)\\1\]( ?= ?)(['\"])(.*)\\4/Uem";
    11                         $replace1 = "'tinyMCELang[\\1\\2\\1]\\3'.stripslashes('\\4').__('\\5').stripslashes('\\4')";
     14function getFileContents($path) {
     15        $path = realpath($path);
    1216
    13                         $search2 = "/ : (['\"])(.*)\\1/Uem";
    14                         $replace2 = "' : '.stripslashes('\\1').__('\\2').stripslashes('\\1')";
     17        if ( ! $path || ! @is_file($path) )
     18                return '';
    1519
    16                         $search = array($search1, $search2);
    17                         $replace = array($replace1, $replace2);
     20        if ( function_exists('file_get_contents') )
     21                return @file_get_contents($path);
    1822
    19                         $text = preg_replace($search, $replace, $text);
     23        $content = '';
     24        $fp = @fopen($path, 'r');
     25        if ( ! $fp )
     26                return '';
    2027
    21                         return $text;
    22                 }
     28        while ( ! feof($fp) )
     29                $content .= fgets($fp);
     30
     31        fclose($fp);
     32        return $content;
     33}
     34
     35function putFileContents( $path, $content ) {
     36        if ( function_exists('file_put_contents') )
     37                return @file_put_contents( $path, $content );
     38
     39        $fp = @fopen( $path, 'wb' );
     40        if ($fp) {
     41                fwrite( $fp, $content );
     42                fclose($fp);
    2343        }
     44}
    2445
    25         // Set up init variables
    26         $valid_elements = '*[*]';
    27         $valid_elements = apply_filters('mce_valid_elements', $valid_elements);
     46// Set up init variables
     47$https = ( isset($_SERVER['HTTPS']) && 'on' == $_SERVER['HTTPS'] ) ? true : false;
     48       
     49$baseurl = get_option('siteurl') . '/wp-includes/js/tinymce';
     50$baseurl = $https ? str_replace('http://', 'https://', $baseurl) : $baseurl;
    2851
    29     $invalid_elements = apply_filters('mce_invalid_elements', '');
     52$mce_css = $baseurl . '/wordpress.css';
     53$mce_css = apply_filters('mce_css', $mce_css);
     54$mce_css = $https ? str_replace('http://', 'https://', $mce_css) : $mce_css;
    3055
    31         $plugins = array( 'safari', 'inlinepopups', 'autosave', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen' );
    32         $plugins = apply_filters('mce_plugins', $plugins);
    33         $plugins = implode($plugins, ',');
     56$valid_elements = '*[*]';
     57$valid_elements = apply_filters('mce_valid_elements', $valid_elements);
     58       
     59$invalid_elements = apply_filters('mce_invalid_elements', '');
    3460
    35         $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'outdent', 'indent', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'image', 'wp_more', '|', 'spellchecker', '|', 'wp_help', 'wp_adv' ));
    36         $mce_buttons = implode($mce_buttons, ',');
     61$plugins = array( 'safari', 'inlinepopups', 'autosave', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen' );
    3762
     63/*
     64The following filter takes an associative array of external plugins for TinyMCE in the form "name" => "url".
     65It adds the plugin's name (including the required dash) to TinyMCE's plugins init and the call to PluginManager to load the plugin.
     66The url should be absolute and should include the js file name to be loaded.
     67Example: array( 'myplugin' => 'http://my-site.com/wp-content/plugins/myfolder/mce_plugin.js' ).
     68If the plugin uses a button, it should be added with one of the "$mce_buttons" filters.
     69*/
     70$mce_external_plugins = apply_filters('mce_external_plugins', array());
    3871
    39         $mce_buttons_2 = apply_filters('mce_buttons_2', array('formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', '|', 'removeformat', 'cleanup', '|', 'media', 'charmap', 'blockquote', '|', 'undo', 'redo', 'fullscreen' ));
    40         $mce_buttons_2 = implode($mce_buttons_2, ',');
     72$ext_plugins = "\n";
     73foreach ( $mce_external_plugins as $name => $url ) {
     74        $plugins[] = '-' . $name;
     75        $url = $https ? str_replace('http://', 'https://', $url) : $url;
     76       
     77        $ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . "\n";
     78}
    4179
    42         $mce_buttons_3 = apply_filters('mce_buttons_3', array());
    43         $mce_buttons_3 = implode($mce_buttons_3, ',');
     80$plugins = implode($plugins, ',');
    4481
    45         $mce_buttons_4 = apply_filters('mce_buttons_4', array());
    46         $mce_buttons_4 = implode($mce_buttons_4, ',');
     82$mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'outdent', 'indent', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'image', 'wp_more', '|', 'spellchecker', '|', 'wp_help', 'wp_adv' ));
     83$mce_buttons = implode($mce_buttons, ',');
    4784
    48         $mce_browsers = apply_filters('mce_browsers', array('msie', 'gecko', 'opera', 'safari'));
    49         $mce_browsers = implode($mce_browsers, ',');
     85$mce_buttons_2 = apply_filters('mce_buttons_2', array('formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', '|', 'removeformat', 'cleanup', '|', 'media', 'charmap', 'blockquote', '|', 'undo', 'redo', 'fullscreen' ));
     86$mce_buttons_2 = implode($mce_buttons_2, ',');
    5087
    51         $mce_css = get_option('siteurl') . '/wp-includes/js/tinymce/wordpress.css';
    52         $mce_css = apply_filters('mce_css', $mce_css);
    53         if ( $_SERVER['HTTPS'] == 'on' )
    54                 $mce_css = str_replace('http://', 'https://', $mce_css);
     88$mce_buttons_3 = apply_filters('mce_buttons_3', array());
     89$mce_buttons_3 = implode($mce_buttons_3, ',');
     90       
     91$mce_buttons_4 = apply_filters('mce_buttons_4', array());
     92$mce_buttons_4 = implode($mce_buttons_4, ',');
    5593
    56         $mce_locale = ( '' == get_locale() ) ? 'en' : strtolower( substr(get_locale(), 0, 2) ); // only ISO 639-1
    57 ?>
     94// all these browsers are now 100% supported, no need for this
     95//$mce_browsers = apply_filters('mce_browsers', array('msie', 'gecko', 'opera', 'safari'));
     96//$mce_browsers = implode($mce_browsers, ',');
    5897
    59 initArray = {
    60         mode : "none",
    61         onpageload : "wpEditorInit",
    62     width : "100%",
    63         theme : "advanced",
    64         skin : "wp_theme",
    65         theme_advanced_buttons1 : "<?php echo $mce_buttons; ?>",
    66         theme_advanced_buttons2 : "<?php echo $mce_buttons_2; ?>",
    67         theme_advanced_buttons3 : "<?php echo $mce_buttons_3; ?>",
    68         theme_advanced_buttons4 : "<?php echo $mce_buttons_4; ?>",
    69         language : "<?php echo $mce_locale; ?>",
    70         theme_advanced_toolbar_location : "top",
    71         theme_advanced_toolbar_align : "left",
    72         theme_advanced_statusbar_location : "bottom",
    73         theme_advanced_resizing : true,
    74         browsers : "<?php echo $mce_browsers; ?>",
    75         dialog_type : "modal",
    76         theme_advanced_resize_horizontal : false,
    77         convert_urls : false,
    78         relative_urls : false,
    79         remove_script_host : false,
    80         fix_list_elements : true,
    81         fix_table_elements : true,
    82         gecko_spellcheck : true,
    83         entities : "38,amp,60,lt,62,gt",
    84         accessibility_focus : false,
    85         tab_focus : ":next",
    86         content_css : "<?php echo $mce_css; ?>",
    87         <?php if ( $valid_elements ) echo 'valid_elements : "' . $valid_elements . '",' . "\n"; ?>
    88         <?php if ( $invalid_elements ) echo 'invalid_elements : "' . $invalid_elements . '",' . "\n"; ?>
    89         save_callback : "switchEditors.saveCallback",
    90 <?php do_action('mce_options'); ?>
    91         plugins : "<?php echo $plugins; ?>"
    92 };
     98$mce_locale = ( '' == get_locale() ) ? 'en' : strtolower( substr(get_locale(), 0, 2) ); // only ISO 639-1
    9399
    94 <?php
    95         // For people who really REALLY know what they're doing with TinyMCE
    96         // You can modify initArray to add, remove, change elements of the config before tinyMCE.init
    97         do_action('tinymce_before_init');
    98 ?>
     100// TinyMCE init settings
     101$initArray = array (
     102        'mode' => 'none',
     103        'onpageload' => 'wpEditorInit',
     104    'width' => '100%',
     105        'theme' => 'advanced',
     106        'skin' => 'wp_theme',
     107        'theme_advanced_buttons1' => "$mce_buttons",
     108        'theme_advanced_buttons2' => "$mce_buttons_2",
     109        'theme_advanced_buttons3' => "$mce_buttons_3",
     110        'theme_advanced_buttons4' => "$mce_buttons_4",
     111        'language' => "$mce_locale",
     112        'theme_advanced_toolbar_location' => 'top',
     113        'theme_advanced_toolbar_align' => 'left',
     114        'theme_advanced_statusbar_location' => 'bottom',
     115        'theme_advanced_resizing' => true,
     116        'theme_advanced_resize_horizontal' => false,
     117//      'browsers' => "$mce_browsers",
     118        'dialog_type' => 'modal',
     119        'convert_urls' => false,
     120        'relative_urls' => false,
     121        'remove_script_host' => false,
     122        'fix_list_elements' => true,
     123        'fix_table_elements' => true,
     124        'gecko_spellcheck' => true,
     125        'entities' => '38,amp,60,lt,62,gt',
     126        'accessibility_focus' => false,
     127        'tab_focus' => ':next',
     128        'content_css' => "$mce_css",
     129        'save_callback' => 'switchEditors.saveCallback',
     130        'plugins' => "$plugins",
     131        // pass-through the settings for compression and caching, so they can be changed with "tiny_mce_before_init"
     132        'disk_cache' => true,
     133        'compress' => true,
     134        'del_old_cache' => true
     135);
    99136
    100 tinyMCE_GZ.init(initArray);
     137if ( $valid_elements ) $initArray['valid_elements'] = $valid_elements;
     138if ( $invalid_elements ) $initArray['invalid_elements'] = $invalid_elements;
     139
     140// For people who really REALLY know what they're doing with TinyMCE
     141// You can modify initArray to add, remove, change elements of the config before tinyMCE.init
     142$initArray = apply_filters('tiny_mce_before_init', $initArray); // changed from action to filter
     143
     144// support for deprecated actions
     145ob_start();
     146do_action('mce_options');
     147$mce_deprecated1 = ob_get_contents() || '';
     148ob_end_clean();
     149
     150/*
     151// Do we need to support this? Most likely will breal TinyMCE 3...
     152ob_start();
     153do_action('tinymce_before_init');
     154$mce_deprecated2 = ob_get_contents() || '';
     155ob_end_clean();
     156*/
     157
     158// Settings for the gzip compression and cache
     159$cache_path = dirname(__FILE__); // Cache path, this is where the .gz files will be stored
     160$cache_ext = '.js';
     161
     162$disk_cache = ( ! isset($initArray['disk_cache']) || false == $initArray['disk_cache'] ) ? false : true;
     163$compress = ( ! isset($initArray['compress']) || false == $initArray['compress'] ) ? false : true;
     164$del_old_cache = ( ! isset($initArray['del_old_cache']) || false == $initArray['del_old_cache'] ) ? false : true;
     165
     166$initArray['disk_cache'] = $initArray['compress'] = $initArray['del_old_cache'] = null;
     167unset( $initArray['disk_cache'], $initArray['compress'], $initArray['del_old_cache'] );
     168
     169$plugins = explode( ',', $initArray['plugins'] );
     170$theme = ( 'simple' == $initArray['theme'] ) ? 'simple' : 'advanced';
     171$language = isset($initArray['language']) ? substr( $initArray['language'], 0, 2 ) : 'en';
     172$enc = $cacheKey = $suffix = $mce_options = '';
     173
     174// Custom extra javascripts to pack
     175$custom_js = array(); //$custom_js = apply_filters('tinymce_custom_js', array());
     176
     177// Check if supports gzip
     178if ( $compress && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) {
     179        $encodings = explode( ',', strtolower( preg_replace('/\s+/', '', $_SERVER['HTTP_ACCEPT_ENCODING']) ) );
     180
     181        if ( (in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------']) ) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression') ) {
     182                $enc = in_array('x-gzip', $encodings) ? 'x-gzip' : 'gzip';
     183                $cache_ext = '.gz';
     184        }
     185}
     186
     187// Setup cache info
     188if ( $disk_cache && $cache_path ) {
     189
     190        $ver = isset($_GET['ver']) ? (int) $_GET['ver'] : '';
     191        $cacheKey = $initArray['plugins'] . $language . $theme . $suffix . $ver;
     192
     193        foreach ( $custom_js as $file )
     194                $cacheKey .= $file;
     195
     196        $cacheKey = md5( $cacheKey );
     197        $cache_file = $cache_path . '/tiny_mce_' . $cacheKey . $cache_ext;
     198}
     199
     200cache_javascript_headers();
     201
     202// Use cached file if exists
     203if ( $disk_cache && file_exists($cache_file) ) {
     204        if ( '.gz' == $cache_ext )
     205                header( 'Content-Encoding: ' . $enc );
     206
     207        echo getFileContents( $cache_file );
     208        exit;
     209}
     210
     211foreach ( $initArray as $k => $v )
     212    $mce_options .= $k . ':"' . $v . '", ';
     213
     214$mce_options .= $mce_deprecated1;
     215$mce_options = rtrim( trim($mce_options), '\n\r,' );
     216
     217$content = 'var tinyMCEPreInit = { suffix : "' . $suffix . '", base : "' . $baseurl . '" };';
     218$content .= 'var tinyMCE_GZ = { settings : { themes : "' . $theme . '", plugins : "' . $initArray['plugins'] . '", languages : "' . $language . '", debug : false, suffix : "' . $suffix . '" }, baseURL : "' . $baseurl . '" };';
     219
     220// Load patch
     221$content .= getFileContents( 'tiny_mce_ext.js' );
     222
     223// Add core
     224$content .= getFileContents( 'tiny_mce' . $suffix . '.js' );
     225
     226// Patch loading functions
     227$content .= 'tinyMCE_GZ.start();';
     228
     229// Add all languages (WP)
     230include_once( dirname(__FILE__).'/langs/wp-langs.php' );
     231$content .= $strings;
     232
     233// Add themes
     234$content .= getFileContents( 'themes/' . $theme . '/editor_template' . $suffix . '.js' );
     235
     236// Add plugins
     237foreach ( $plugins as $plugin )
     238        $content .= getFileContents( 'plugins/' . $plugin . '/editor_plugin' . $suffix . '.js' );
     239
     240// Add custom files
     241foreach ( $custom_js as $file )
     242        $content .= getFileContents($file);
     243
     244// Add external plugins and init
     245$content .= $ext_plugins . 'tinyMCE.init({' . $mce_options . '});'; // $mce_deprecated2 .
     246
     247// Generate GZIP'd content
     248if ( '.gz' == $cache_ext ) {
     249        header('Content-Encoding: ' . $enc);
     250        $cache_data = gzencode( $content, 9, FORCE_GZIP );
     251} else
     252        $cache_data = $content;
     253
     254// Stream to client
     255echo $cache_data;
     256
     257// Write file
     258if ( '' != $cacheKey ) {
     259        if ( $del_old_cache ) {
     260                $old_key = getFileContents('tiny_mce_compressed_key');
     261                       
     262                if ( '' != $old_key ) { //  && $old_key != $cacheKey
     263                        $old_cache = $cache_path . '/tiny_mce_' . $old_key . $cache_ext;
     264                        @unlink($old_cache);
     265                }
     266                       
     267                putFileContents( 'tiny_mce_compressed_key', $cacheKey );
     268        }
     269               
     270        putFileContents( $cache_file, $cache_data );
     271}
     272?>
     273 No newline at end of file
  • wp-includes/js/tinymce/tiny_mce_ext.js

     
     1       
     2    tinyMCE_GZ.start = function() {
     3                var t = this, each = tinymce.each, s = t.settings, sl = tinymce.ScriptLoader, ln = s.languages.split(',');
     4
     5                function load(u, sp) {
     6                        var o;
     7
     8                        if (!sp)
     9                                u = t.baseURL + u;
     10
     11                        o = {url : u, state : 2};
     12                        sl.queue.push(o);
     13                        sl.lookup[o.url] = o;
     14                };
     15
     16                // Add core languages
     17                each (ln, function(c) {
     18                        if (c)
     19                                load('/langs/' + c + '.js');
     20                });
     21
     22                // Add themes with languages
     23                each(s.themes.split(','), function(n) {
     24                        if (n) {
     25                                load('/themes/' + n + '/editor_template' + s.suffix + '.js');
     26
     27                                each (ln, function(c) {
     28                                        if (c)
     29                                                load('/themes/' + n + '/langs/' + c + '.js');
     30                                });
     31                        }
     32                });
     33
     34                // Add plugins with languages
     35                each(s.plugins.split(','), function(n) {
     36                        if (n && n.charAt(0) != '-') {
     37                                load('/plugins/' + n + '/editor_plugin' + s.suffix + '.js');
     38
     39                                each (ln, function(c) {
     40                                        if (c)
     41                                                load('/plugins/' + n + '/langs/' + c + '.js');
     42                                });
     43                        }
     44                });
     45        };
     46//      tinyMCE_GZ.end = function() {};
  • wp-includes/js/tinymce/tiny_mce_gzip.php

     
    1 <?php
    2 /** Based on:
    3  * $Id: tiny_mce_gzip.php 315 2007-10-25 14:03:43Z spocke $
    4  *
    5  * @author Moxiecode
    6  * @copyright Copyright © 2005-2006, Moxiecode Systems AB, All rights reserved.
    7  *
    8  * This file compresses the TinyMCE JavaScript using GZip and
    9  * enables the browser to do two requests instead of one for each .js file.
    10  * Notice: This script defaults the button_tile_map option to true for extra performance.
    11  */
    12 
    13 @require_once('../../../wp-config.php');  // For get_bloginfo().
    14 cache_javascript_headers();
    15 
    16 if ( isset($_GET['load']) ) {
    17 
    18         function getParam( $name, $def = false ) {
    19                 if ( ! isset($_GET[$name]) )
    20                         return $def;
    21 
    22                 return preg_replace( "/[^0-9a-z\-_,]+/i", "", $_GET[$name] ); // Remove anything but 0-9,a-z,-_
    23         }
    24 
    25         function getFileContents($path) {
    26                 $path = realpath($path);
    27 
    28                 if ( ! $path || !@is_file($path) )
    29                         return '';
    30 
    31                 if ( function_exists('file_get_contents') )
    32                         return @file_get_contents($path);
    33 
    34                 $content = '';
    35                 $fp = @fopen( $path, 'r' );
    36                 if (!$fp)
    37                         return '';
    38 
    39                 while ( ! feof($fp) )
    40                         $content .= fgets($fp);
    41 
    42                 fclose($fp);
    43 
    44                 return $content;
    45         }
    46 
    47         function putFileContents( $path, $content ) {
    48                 if ( function_exists('file_put_contents') )
    49                         return @file_put_contents( $path, $content );
    50 
    51                 $fp = @fopen($path, 'wb');
    52                 if ($fp) {
    53                         fwrite($fp, $content);
    54                         fclose($fp);
    55                 }
    56         }
    57 
    58         // WP defaults
    59         $themes = explode( ',', getParam('themes', 'advanced') );
    60 
    61         $language = getParam( 'languages', 'en' );
    62         $language = strtolower( substr($language, 0, 2) ); // only ISO 639-1
    63 
    64         $plugins = explode( ',', getParam('plugins', '') );
    65         $cachePath = realpath('.'); // Cache path, this is where the .gz files will be stored
    66 
    67         $encodings = array();
    68         $supportsGzip = $diskCache = false;
    69         $compress = $core = true;
    70         $suffix = $content = $enc = $cacheKey = '';
    71 
    72         // Custom extra javascripts to pack
    73         // WP - add a hook for external plugins to be compressed too?
    74         $custom = array(/*
    75                 'some custom .js file',
    76                 'some custom .js file'
    77         */);
    78 
    79         // Setup cache info
    80         if ( $diskCache ) {
    81                 if ( ! $cachePath )
    82                         die('Real path failed.');
    83 
    84                 $cacheKey = getParam( 'plugins', '' ) . getParam( 'languages', '' ) . getParam( 'themes', '' ) . $suffix;
    85 
    86                 foreach ( $custom as $file )
    87                         $cacheKey .= $file;
    88 
    89                 $cacheKey = md5($cacheKey);
    90 
    91                 if ( $compress )
    92                         $cacheFile = $cachePath . '/tiny_mce_' . $cacheKey . '.gz';
    93                 else
    94                         $cacheFile = $cachePath . '/tiny_mce_' . $cacheKey . '.js';
    95         }
    96 
    97         // Check if it supports gzip
    98         if ( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) )
    99                 $encodings = explode(',', strtolower(preg_replace( '/\s+/', '', $_SERVER['HTTP_ACCEPT_ENCODING']) ) );
    100 
    101         if ( ( in_array('gzip', $encodings ) || in_array( 'x-gzip', $encodings ) || isset($_SERVER['---------------']) ) && function_exists( 'ob_gzhandler' ) && ! ini_get('zlib.output_compression') ) {
    102                 $enc = in_array( 'x-gzip', $encodings ) ? 'x-gzip' : 'gzip';
    103                 $supportsGzip = true;
    104         }
    105 
    106         // Use cached file disk cache
    107         if ( $diskCache && $supportsGzip && file_exists($cacheFile) ) {
    108                 if ( $compress )
    109                         header('Content-Encoding: ' . $enc);
    110 
    111                 echo getFileContents( $cacheFile );
    112                 die();
    113         }
    114 
    115         // Add core
    116         if ( $core == 'true' ) {
    117                 $content .= getFileContents( 'tiny_mce' . $suffix . '.js' );
    118 
    119                 // Patch loading functions
    120                 $content .= 'tinyMCE_GZ.start();';
    121         }
    122 
    123         // Add all languages (WP)
    124         include_once( dirname(__file__).'/langs/wp-langs.php' );
    125         $content .= $strings;
    126 
    127         // Add themes
    128         foreach ( $themes as $theme )
    129                 $content .= getFileContents( 'themes/' . $theme . '/editor_template' . $suffix . '.js' );
    130        
    131         // Add plugins
    132         foreach ( $plugins as $plugin )
    133                 $content .= getFileContents( 'plugins/' . $plugin . '/editor_plugin' . $suffix . '.js' );
    134 
    135         // Add custom files
    136         foreach ( $custom as $file )
    137                 $content .= getFileContents($file);
    138 
    139         // Restore loading functions
    140         if ( $core == 'true' )
    141                 $content .= 'tinyMCE_GZ.end();';
    142 
    143         // Generate GZIP'd content
    144         if ( $supportsGzip ) {
    145                 if ( $compress ) {
    146                         header('Content-Encoding: ' . $enc);
    147                         $cacheData = gzencode( $content, 9, FORCE_GZIP );
    148                 } else
    149                         $cacheData = $content;
    150 
    151                 // Write gz file
    152                 if ( $diskCache && '' != $cacheKey )
    153                         putFileContents( $cacheFile, $cacheData );
    154 
    155                 // Stream to client
    156                 echo $cacheData;
    157         } else {
    158                 // Stream uncompressed content
    159                 echo $content;
    160         }
    161 
    162         exit;
    163 }
    164 ?>
    165 
    166 var tinyMCEPreInit = {suffix : ''};
    167 
    168 var tinyMCE_GZ = {
    169         settings : {
    170                 themes : '',
    171                 plugins : '',
    172                 languages : '',
    173                 disk_cache : false,
    174                 page_name : 'tiny_mce_gzip.php',
    175                 debug : false,
    176                 suffix : ''
    177         },
    178 
    179         opt : {},
    180 
    181         init : function(o, cb) {
    182                 var t = this, n, s = t.settings, nl = document.getElementsByTagName('script');
    183 
    184                 t.opt = o;
    185 
    186                 s.themes = o.theme;
    187                 s.plugins = o.plugins;
    188                 s.languages = o.language;
    189                 t.settings = s;
    190 
    191                 t.cb = cb || '';
    192 
    193                 for (i=0; i<nl.length; i++) {
    194                         n = nl[i];
    195 
    196                         if (n.src && n.src.indexOf('tiny_mce') != -1)
    197                                 t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));
    198                 }
    199                 tinyMCEPreInit.base = t.baseURL;
    200                
    201                 if (!t.coreLoaded)
    202                         t.loadScripts(1, s.themes, s.plugins, s.languages);
    203         },
    204 
    205         loadScripts : function(co, th, pl, la, cb, sc) {
    206                 var t = this, x, w = window, q, c = 0, ti, s = t.settings;
    207 
    208                 function get(s) {
    209                         x = 0;
    210 
    211                         try {
    212                                 x = new ActiveXObject(s);
    213                         } catch (s) {
    214                         }
    215 
    216                         return x;
    217                 };
    218 
    219                 // Build query string
    220                 q = 'load=true&js=true&diskcache=' + (s.disk_cache ? 'true' : 'false') + '&core=' + (co ? 'true' : 'false') + '&suffix=' + escape(s.suffix) + '&themes=' + escape(th) + '&plugins=' + escape(pl) + '&languages=' + escape(la);
    221 
    222                 if (co)
    223                         t.coreLoaded = 1;
    224 
    225         //      document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + t.baseURL + '/' + s.page_name + '?' + q + '"></script>');
    226 
    227                 // Send request
    228                 x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Msxml2.XMLHTTP') || get('Microsoft.XMLHTTP');
    229                 x.overrideMimeType && x.overrideMimeType('text/javascript');
    230                 x.open('GET', t.baseURL + '/' + s.page_name + '?' + q, !!cb);
    231 //              x.setRequestHeader('Content-Type', 'text/javascript');
    232                 x.send('');
    233 
    234                 // Handle asyncronous loading
    235                 if (cb) {
    236                         // Wait for response
    237                         ti = w.setInterval(function() {
    238                                 if (x.readyState == 4 || c++ > 10000) {
    239                                         w.clearInterval(ti);
    240 
    241                                         if (c < 10000 && x.status == 200) {
    242                                                 t.loaded = 1;
    243                                                 t.eval(x.responseText);
    244                                                 tinymce.dom.Event.domLoaded = true;
    245                                         //      cb.call(sc || t, x);
    246                                         }
    247 
    248                                         ti = x = null;
    249                                 }
    250                         }, 10);
    251                 } else
    252                         t.eval(x.responseText);
    253         },
    254 
    255         start : function() {
    256                 var t = this, each = tinymce.each, s = t.settings, sl, ln = s.languages.split(',');
    257 
    258                 tinymce.suffix = s.suffix;
    259 
    260                 // Extend script loader
    261                 tinymce.create('tinymce.compressor.ScriptLoader:tinymce.dom.ScriptLoader', {
    262                         loadScripts : function(sc, cb, s) {
    263                                 var ti = this, th = [], pl = [], la = [];
    264 
    265                                 each(sc, function(o) {
    266                                         var u = o.url;
    267 
    268                                         if ((!ti.lookup[u] || ti.lookup[u].state != 2) && u.indexOf(t.baseURL) === 0) {
    269                                                 // Collect theme
    270                                                 if (u.indexOf('editor_template') != -1) {
    271                                                         th.push(/\/themes\/([^\/]+)/.exec(u)[1]);
    272                                                         load(u, 1);
    273                                                 }
    274 
    275                                                 // Collect plugin
    276                                                 if (u.indexOf('editor_plugin') != -1) {
    277                                                         pl.push(/\/plugins\/([^\/]+)/.exec(u)[1]);
    278                                                         load(u, 1);
    279                                                 }
    280 
    281                                                 // Collect language
    282                                                 if (u.indexOf('/langs/') != -1) {
    283                                                         la.push(/\/langs\/([^.]+)/.exec(u)[1]);
    284                                                         load(u, 1);
    285                                                 }
    286                                         }
    287                                 });
    288 
    289                                 if (th.length + pl.length + la.length > 0) {
    290                                         if (sl.settings.strict_mode) {
    291                                                 // Async
    292                                                 t.loadScripts(0, th.join(','), pl.join(','), la.join(','), cb, s);
    293                                                 return;
    294                                         } else
    295                                                 t.loadScripts(0, th.join(','), pl.join(','), la.join(','), cb, s);
    296                                 }
    297 
    298                                 return ti.parent(sc, cb, s);
    299                         }
    300                 });
    301 
    302                 sl = tinymce.ScriptLoader = new tinymce.compressor.ScriptLoader();
    303 
    304                 function load(u, sp) {
    305                         var o;
    306 
    307                         if (!sp)
    308                                 u = t.baseURL + u;
    309 
    310                         o = {url : u, state : 2};
    311                         sl.queue.push(o);
    312                         sl.lookup[o.url] = o;
    313                 };
    314 
    315                 // Add core languages
    316                 each (ln, function(c) {
    317                         if (c)
    318                                 load('/langs/' + c + '.js');
    319                 });
    320 
    321                 // Add themes with languages
    322                 each(s.themes.split(','), function(n) {
    323                         if (n) {
    324                                 load('/themes/' + n + '/editor_template' + s.suffix + '.js');
    325 
    326                                 each (ln, function(c) {
    327                                         if (c)
    328                                                 load('/themes/' + n + '/langs/' + c + '.js');
    329                                 });
    330                         }
    331                 });
    332 
    333                 // Add plugins with languages
    334                 each(s.plugins.split(','), function(n) {
    335                         if (n) {
    336                                 load('/plugins/' + n + '/editor_plugin' + s.suffix + '.js');
    337 
    338                                 each (ln, function(c) {
    339                                         if (c)
    340                                                 load('/plugins/' + n + '/langs/' + c + '.js');
    341                                 });
    342                         }
    343                 });
    344         },
    345 
    346         end : function() {
    347            tinyMCE.init(this.opt);
    348         },
    349 
    350         eval : function(co) {
    351                 var w = window;
    352 
    353                 // Evaluate script
    354                 if (!w.execScript) {
    355                         try {
    356                                 eval.call(w, co);
    357                         } catch (ex) {
    358                                 eval(co, w); // Firefox 3.0a8
    359                         }
    360                 } else
    361                         w.execScript(co); // IE
    362         }
    363 };
  • wp-includes/script-loader.php

     
    3030                $this->add( 'colorpicker', '/wp-includes/js/colorpicker.js', false, '3517' );
    3131
    3232                // Modify this version when tinyMCE plugins are changed
    33                 $this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '20080208' );
    34 
    3533                $mce_config = apply_filters('tiny_mce_config_url', '/wp-includes/js/tinymce/tiny_mce_config.php');
    36                 $this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '20080208' );
     34                $this->add( 'tiny_mce', $mce_config, false, '20080209' );
    3735               
    3836                $this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6');
    3937
     
    478476
    479477// These localizations require information that may not be loaded even by init
    480478function wp_just_in_time_script_localization() {
    481         wp_localize_script( 'wp_tiny_mce', 'wpTinyMCEConfig', array( 'defaultEditor' => wp_default_editor() ) );
     479        wp_localize_script( 'tiny_mce', 'wpTinyMCEConfig', array( 'defaultEditor' => wp_default_editor() ) );
    482480}
    483481
    484482add_filter( 'wp_print_scripts', 'wp_just_in_time_script_localization' );