Changeset 5108

Show
Ignore:
Timestamp:
03/26/07 03:44:35 (1 year ago)
Author:
ryan
Message:

Update to latest tinyMCE compressor. Simplify MCE language loading. see #3882

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/wp-includes/js/tinymce/tiny_mce_gzip.php

    r4845 r5108  
    11<?php 
    22/** 
    3  * $RCSfile: tiny_mce_gzip.php,v $ 
    4  * $Revision: $ 
    5  * $Date: $ 
     3 * $Id: tiny_mce_gzip.php 158 2006-12-21 14:32:19Z spocke $ 
    64 * 
    7  * @version 1.08 
    85 * @author Moxiecode 
    96 * @copyright Copyright  2005-2006, Moxiecode Systems AB, All rights reserved. 
     
    1411 */ 
    1512 
    16 @require_once('../../../wp-config.php'); 
    17  
    18 // gzip_compression(); 
    19  
    20 function wp_tinymce_lang($path) { 
    21     global $language; 
    22  
    23     $text = ''; 
    24  
    25     // Look for xx_YY.js, xx_yy.js, xx.js 
    26     $file = realpath(sprintf($path, $language)); 
    27     if ( file_exists($file) ) 
    28         $text = file_get_contents($file); 
    29     $file = realpath(sprintf($path, strtolower($language))); 
    30     if ( file_exists($file) ) 
    31         $text = file_get_contents($file); 
    32     $file = realpath(sprintf($path, substr($language, 0, 2))); 
    33     if ( file_exists($file) ) 
    34         $text = file_get_contents($file); 
    35  
    36  
    37     // Fall back on en.js 
    38     $file = realpath(sprintf($path, 'en')); 
    39     if ( empty($text) && file_exists($file) ) 
    40         $text = file_get_contents($file); 
    41  
    42     // Send lang file through gettext 
    43     if ( function_exists('__') && strtolower(substr($language, 0, 2)) != 'en' ) { 
    44         $search1 = "/^tinyMCELang\\[(['\"])(.*)\\1\]( ?= ?)(['\"])(.*)\\4/Uem"; 
    45         $replace1 = "'tinyMCELang[\\1\\2\\1]\\3'.stripslashes('\\4').__('\\5').stripslashes('\\4')"; 
    46  
    47         $search2 = "/\\s:\\s(['\"])(.*)\\1(,|\\s*})/Uem"; 
    48         $replace2 = "' : '.stripslashes('\\1').__('\\2').stripslashes('\\1').'\\3'"; 
    49  
    50         $search = array($search1, $search2); 
    51         $replace = array($replace1, $replace2); 
    52  
    53         $text = preg_replace($search, $replace, $text); 
    54  
    55         return $text; 
    56     } 
    57  
    58     return $text; 
    59 
    60  
    61 function wp_compact_tinymce_js($text) { 
    62     // This function was custom-made for TinyMCE 2.0, not expected to work with any other JS. 
    63  
    64     // Strip comments 
    65     $text = preg_replace("!(^|\s+)//.*$!m", '', $text); 
    66     $text = preg_replace("!/\*.*?\*/!s", '', $text); 
    67  
    68     // Strip leading tabs, carriage returns and unnecessary line breaks. 
    69     $text = preg_replace("!^\t+!m", '', $text); 
    70     $text = str_replace("\r", '', $text); 
    71     $text = preg_replace("!(^|{|}|;|:|\))\n!m", '\\1', $text); 
    72  
    73     return "$text\n"; 
    74 
    75  
    76  
    77 // General options 
    78 $suffix = "";                           // Set to "_src" to use source version 
    79 $expiresOffset = 3600 * 24 * 10;        // 10 days util client cache expires 
    80 $diskCache = false;                     // If you enable this option gzip files will be cached on disk. 
    81 $cacheDir = realpath(".");              // Absolute directory path to where cached gz files will be stored 
    82 $debug = false;                         // Enable this option if you need debuging info 
    83  
    84 // Headers 
    85 header("Content-Type: text/javascript; charset=" . get_bloginfo('charset')); 
    86 // header("Cache-Control: must-revalidate"); 
    87 header("Vary: Accept-Encoding"); // Handle proxies 
    88 header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT"); 
    89  
    90 // Get data to load 
    91 $theme = isset($_GET['theme']) ? TinyMCE_cleanInput($_GET['theme']) : ""; 
    92 $language = isset($_GET['language']) ? TinyMCE_cleanInput($_GET['language']) : ""; 
    93 $plugins = isset($_GET['plugins']) ? TinyMCE_cleanInput($_GET['plugins']) : ""; 
    94 $lang = isset($_GET['lang']) ? TinyMCE_cleanInput($_GET['lang']) : "en"; 
    95 $index = isset($_GET['index']) ? TinyMCE_cleanInput($_GET['index']) : -1; 
    96 $cacheKey = md5($theme . $language . $plugins . $lang . $index . $debug); 
    97 $cacheFile = $cacheDir == "" ? "" : $cacheDir . "/" . "tinymce_" .  $cacheKey . ".gz"; 
    98 $cacheData = ""; 
    99  
    100 // Patch older versions of PHP < 4.3.0 
    101 if (!function_exists('file_get_contents')) { 
    102     function file_get_contents($filename) { 
    103         $fd = fopen($filename, 'rb'); 
    104         $content = fread($fd, filesize($filename)); 
    105         fclose($fd); 
    106         return $content; 
    107     } 
    108 
    109  
    110 // Security check function, can only contain a-z 0-9 , _ - and whitespace. 
    111 function TinyMCE_cleanInput($str) { 
    112     return preg_replace("/[^0-9a-z\-_,]+/i", "", $str); // Remove anything but 0-9,a-z,-_ 
    113 
    114  
    115 function TinyMCE_echo($str) { 
    116     global $cacheData, $diskCache; 
    117  
    118     if ($diskCache) 
    119         $cacheData .= $str; 
    120     else 
    121         echo $str; 
    122 
    123  
    124 // Only gzip the contents if clients and server support it 
    125 $encodings = array(); 
    126  
    127 if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) 
    128     $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); 
    129  
    130 // Check for gzip header or northon internet securities 
    131 if ((in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression')) { 
    132     $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; 
    133  
    134     // Use cached file if it exists but not in debug mode 
    135     if (file_exists($cacheFile) && !$debug) { 
    136         header("Content-Encoding: " . $enc); 
    137         echo file_get_contents($cacheFile); 
    138         die; 
    139     } 
    140  
    141     if (!$diskCache) 
    142         ob_start("ob_gzhandler"); 
    143 } else 
     13    @require_once('../../../wp-config.php');  // For get_bloginfo(). 
     14 
     15    // Get input 
     16    $plugins = explode(',', getParam("plugins", "")); 
     17    $languages = explode(',', getParam("languages", "")); 
     18    $themes = explode(',', getParam("themes", "")); 
     19    $diskCache = getParam("diskcache", "") == "true"; 
     20    $isJS = getParam("js", "") == "true"; 
     21    $compress = getParam("compress", "true") == "true"; 
     22    $suffix = getParam("suffix", "_src") == "_src" ? "_src" : ""; 
     23    $cachePath = realpath("."); // Cache path, this is where the .gz files will be stored 
     24    $expiresOffset = 3600 * 24 * 10; // Cache for 10 days in browser cache 
     25    $content = ""; 
     26    $encodings = array(); 
     27    $supportsGzip = false; 
     28    $enc = ""; 
     29    $cacheKey = ""; 
     30 
     31    // Custom extra javascripts to pack 
     32    $custom = array(/* 
     33        "some custom .js file", 
     34        "some custom .js file" 
     35    */); 
     36 
     37    // WP 
     38    $index = getParam("index", -1); 
     39    $theme = getParam("theme", ""); 
     40    $themes = array($theme); 
     41    $language = getParam("language", "en"); 
     42    if ( empty($language) ) 
     43        $language = 'en'; 
     44    $languages = array($language); 
     45    if ( $language != strtolower($language) ) 
     46        $languages[] = strtolower($language); 
     47    if ( $language != substr($language, 0, 2) ) 
     48        $languages[] = substr($language, 0, 2); 
    14449    $diskCache = false; 
     50    $isJS = true; 
     51    $suffix = ''; 
     52 
     53    // Headers 
     54    header("Content-Type: text/javascript; charset=" . get_bloginfo('charset')); 
     55    header("Vary: Accept-Encoding");  // Handle proxies 
     56    header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT"); 
     57 
     58    // Is called directly then auto init with default settings 
     59    if (!$isJS) { 
     60        echo getFileContents("tiny_mce_gzip.js"); 
     61        echo "tinyMCE_GZ.init({});"; 
     62        die(); 
     63    } 
     64 
     65    // Setup cache info 
     66    if ($diskCache) { 
     67        if (!$cachePath) 
     68            die("alert('Real path failed.');"); 
     69 
     70        $cacheKey = getParam("plugins", "") . getParam("languages", "") . getParam("themes", ""); 
     71 
     72        foreach ($custom as $file) 
     73            $cacheKey .= $file; 
     74 
     75        $cacheKey = md5($cacheKey); 
     76 
     77        if ($compress) 
     78            $cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".gz"; 
     79        else 
     80            $cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".js"; 
     81    } 
     82 
     83    // Check if it supports gzip 
     84    if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) 
     85        $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); 
     86 
     87    if ((in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression')) { 
     88        $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; 
     89        $supportsGzip = true; 
     90    } 
     91 
     92    // Use cached file disk cache 
     93    if ($diskCache && $supportsGzip && file_exists($cacheFile)) { 
     94        if ($compress) 
     95            header("Content-Encoding: " . $enc); 
     96 
     97        echo getFileContents($cacheFile); 
     98        die(); 
     99    } 
    145100 
    146101if ($index > -1) { 
    147102    // Write main script and patch some things 
    148     if ($index == 0) { 
    149         TinyMCE_echo(wp_compact_tinymce_js(file_get_contents(realpath("tiny_mce" . $suffix . ".js")))); // WP 
    150         TinyMCE_echo('TinyMCE.prototype.orgLoadScript = TinyMCE.prototype.loadScript;'); 
    151         TinyMCE_echo('TinyMCE.prototype.loadScript = function() {};var realTinyMCE = tinyMCE;'); 
     103    if ( $index == 0 ) { 
     104        // Add core 
     105        $content .= wp_compact_tinymce_js(getFileContents("tiny_mce" . $suffix . ".js")); 
     106        $content .= 'TinyMCE.prototype.orgLoadScript = TinyMCE.prototype.loadScript;'; 
     107        $content .= 'TinyMCE.prototype.loadScript = function() {};var realTinyMCE = tinyMCE;'; 
    152108    } else 
    153         TinyMCE_echo('tinyMCE = realTinyMCE;'); 
    154  
     109        $content .= 'tinyMCE = realTinyMCE;'; 
     110 
     111    // Patch loading functions 
     112    //$content .= "tinyMCE_GZ.start();"; 
     113     
    155114    // Do init based on index 
    156     TinyMCE_echo("tinyMCE.init(tinyMCECompressed.configs[" . $index . "]);")
     115    $content .= "tinyMCE.init(tinyMCECompressed.configs[" . $index . "]);"
    157116 
    158117    // Load external plugins 
    159     if ($index == 0) 
    160         TinyMCE_echo("tinyMCECompressed.loadPlugins();"); 
    161  
    162     // Load theme, language pack and theme language packs 
    163     if ($theme) { 
    164         TinyMCE_echo(wp_compact_tinymce_js(file_get_contents(realpath("themes/" . $theme . "/editor_template" . $suffix . ".js")))); // WP 
    165         TinyMCE_echo(wp_tinymce_lang("themes/" . $theme . "/langs/%s.js")); // WP 
    166     } 
    167  
    168     /* WP if ($language) WP */ 
    169         TinyMCE_echo(wp_tinymce_lang("langs/%s.js")); // WP 
    170  
    171     // Load all plugins and their language packs 
    172     $plugins = explode(",", $plugins); 
     118    if ( $index == 0 ) 
     119        $content .= "tinyMCECompressed.loadPlugins();"; 
     120 
     121    // Add core languages 
     122    foreach ($languages as $lang) 
     123        $content .= getFileContents("langs/" . $lang . ".js"); 
     124 
     125    // Add themes 
     126    foreach ($themes as $theme) { 
     127        $content .= wp_compact_tinymce_js(getFileContents( "themes/" . $theme . "/editor_template" . $suffix . ".js")); 
     128 
     129        foreach ($languages as $lang) 
     130            $content .= getFileContents("themes/" . $theme . "/langs/" . $lang . ".js"); 
     131    } 
     132 
     133    // Add plugins 
    173134    foreach ($plugins as $plugin) { 
    174         $pluginFile = realpath("plugins/" . $plugin . "/editor_plugin" . $suffix . ".js"); 
    175         /* WP $languageFile = realpath("plugins/" . $plugin . "/langs/" . $lang . ".js"); WP */ 
    176  
    177         if ($pluginFile) 
    178            TinyMCE_echo(file_get_contents($pluginFile)); 
    179  
    180        /* WP if ($languageFile) WP */ 
    181            TinyMCE_echo(wp_tinymce_lang("plugins/" . $plugin . "/langs/%s.js")); // WP 
    182     } 
     135        $content .= getFileContents("plugins/" . $plugin . "/editor_plugin" . $suffix . ".js"); 
     136 
     137        foreach ($languages as $lang) 
     138           $content .= getFileContents("plugins/" . $plugin . "/langs/" . $lang . ".js"); 
     139    } 
     140 
     141    // Add custom files 
     142    foreach ($custom as $file) 
     143       $content .= getFileContents($file); 
    183144 
    184145    // Reset tinyMCE compressor engine 
    185     TinyMCE_echo("tinyMCE = tinyMCECompressed;"); 
    186  
    187     // Write to cache 
    188     if ($diskCache) { 
    189         // Calculate compression ratio and debug target output path 
    190         if ($debug) { 
    191             $ratio = round(100 - strlen(gzencode($cacheData, 9, FORCE_GZIP)) / strlen($cacheData) * 100.0); 
    192             TinyMCE_echo("alert('TinyMCE was compressed by " . $ratio . "%.\\nOutput cache file: " . $cacheFile . "');"); 
    193         } 
    194  
    195         $cacheData = gzencode($cacheData, 9, FORCE_GZIP); 
    196  
    197         // Write to file if possible 
    198         $fp = @fopen($cacheFile, "wb"); 
     146    $content .= "tinyMCE = tinyMCECompressed;"; 
     147 
     148    // Restore loading functions 
     149    //$content .= "tinyMCE_GZ.end();"; 
     150 
     151    // Generate GZIP'd content 
     152    if ($supportsGzip) { 
     153        if ($compress) { 
     154            header("Content-Encoding: " . $enc); 
     155            $cacheData = gzencode($content, 9, FORCE_GZIP); 
     156        } else 
     157            $cacheData = $content; 
     158 
     159        // Write gz file 
     160        if ($diskCache && $cacheKey != "") 
     161            putFileContents($cacheFile, $cacheData); 
     162 
     163        // Stream to client 
     164        echo $cacheData; 
     165    } else { 
     166        // Stream uncompressed content 
     167        echo $content; 
     168    } 
     169 
     170    die; 
     171
     172 
     173    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 
     174 
     175    function getParam($name, $def = false) { 
     176        if (!isset($_GET[$name])) 
     177            return $def; 
     178 
     179        return preg_replace("/[^0-9a-z\-_,]+/i", "", $_GET[$name]); // Remove anything but 0-9,a-z,-_ 
     180    } 
     181 
     182    function getFileContents($path) { 
     183        $path = realpath($path); 
     184 
     185        if (!$path || !@is_file($path)) 
     186            return ""; 
     187 
     188        if (function_exists("file_get_contents")) 
     189            return @file_get_contents($path); 
     190 
     191        $content = ""; 
     192        $fp = @fopen($path, "r"); 
     193        if (!$fp) 
     194            return ""; 
     195 
     196        while (!feof($fp)) 
     197            $content .= fgets($fp); 
     198 
     199        fclose($fp); 
     200 
     201        return $content; 
     202    } 
     203 
     204    function putFileContents($path, $content) { 
     205        if (function_exists("file_put_contents")) 
     206            return @file_put_contents($path, $content); 
     207 
     208        $fp = @fopen($path, "wb"); 
    199209        if ($fp) { 
    200             fwrite($fp, $cacheData); 
     210            fwrite($fp, $content); 
    201211            fclose($fp); 
    202212        } 
    203  
    204         // Output 
    205         header("Content-Encoding: " . $enc); 
    206         echo $cacheData; 
    207     } 
    208  
    209     die; 
    210 
     213    } 
     214 
     215    // WP specific 
     216    function wp_compact_tinymce_js($text) { 
     217        // This function was custom-made for TinyMCE 2.0, not expected to work with any other JS. 
     218 
     219        // Strip comments 
     220        $text = preg_replace("!(^|\s+)//.*$!m", '', $text); 
     221        $text = preg_replace("!/\*.*?\*/!s", '', $text); 
     222 
     223        // Strip leading tabs, carriage returns and unnecessary line breaks. 
     224        $text = preg_replace("!^\t+!m", '', $text); 
     225        $text = str_replace("\r", '', $text); 
     226        $text = preg_replace("!(^|{|}|;|:|\))\n!m", '\\1', $text); 
     227 
     228        return "$text\n"; 
     229    } 
    211230?> 
    212231 
  • trunk/wp-includes/script-loader.php

    r5056 r5108  
    1616        $this->add( 'quicktags', '/wp-includes/js/quicktags.js', false, '3517' ); 
    1717        $this->add( 'colorpicker', '/wp-includes/js/colorpicker.js', false, '3517' ); 
    18         $this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '20070124' ); 
     18        $this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '20070325' ); 
    1919        $mce_config = apply_filters('tiny_mce_config_url', '/wp-includes/js/tinymce/tiny_mce_config.php'); 
    2020        $this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '20070225' );