PHP Cross Reference of WordPress Subversion HEAD |
| [ Index ] [ Classes ] [ Functions ] [ Variables ] [ Constants ] |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * $Id: tiny_mce_gzip.php 158 2006-12-21 14:32:19Z 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 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); 49 $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') && ini_get('output_handler') != 'ob_gzhandler') { 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 } 100 101 if ($index > -1) { 102 // Write main script and patch some things 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;'; 108 } else 109 $content .= 'tinyMCE = realTinyMCE;'; 110 111 // Patch loading functions 112 //$content .= "tinyMCE_GZ.start();"; 113 114 // Do init based on index 115 $content .= "tinyMCE.init(tinyMCECompressed.configs[" . $index . "]);"; 116 117 // Load external plugins 118 if ( $index == 0 ) 119 $content .= "tinyMCECompressed.loadPlugins();"; 120 121 // Add core languages 122 $lang_content = ''; 123 foreach ($languages as $lang) 124 $lang_content .= getFileContents("langs/" . $lang . ".js"); 125 if ( empty($lang_content) ) 126 $lang_content .= getFileContents("langs/en.js"); 127 $content .= $lang_content; 128 129 // Add themes 130 foreach ($themes as $theme) { 131 $content .= wp_compact_tinymce_js(getFileContents( "themes/" . $theme . "/editor_template" . $suffix . ".js")); 132 133 $lang_content = ''; 134 foreach ($languages as $lang) 135 $lang_content .= getFileContents("themes/" . $theme . "/langs/" . $lang . ".js"); 136 if ( empty($lang_content) ) 137 $lang_content .= getFileContents("themes/" . $theme . "/langs/en.js"); 138 $content .= $lang_content; 139 } 140 141 // Add plugins 142 foreach ($plugins as $plugin) { 143 $content .= getFileContents("plugins/" . $plugin . "/editor_plugin" . $suffix . ".js"); 144 145 $lang_content = ''; 146 foreach ($languages as $lang) 147 $lang_content .= getFileContents("plugins/" . $plugin . "/langs/" . $lang . ".js"); 148 if ( empty($lang_content) ) 149 $lang_content .= getFileContents("plugins/" . $plugin . "/langs/en.js"); 150 $content .= $lang_content; 151 } 152 153 // Add custom files 154 foreach ($custom as $file) 155 $content .= getFileContents($file); 156 157 // Reset tinyMCE compressor engine 158 $content .= "tinyMCE = tinyMCECompressed;"; 159 160 // Restore loading functions 161 //$content .= "tinyMCE_GZ.end();"; 162 163 // Generate GZIP'd content 164 if ($supportsGzip) { 165 if ($compress) { 166 header("Content-Encoding: " . $enc); 167 $cacheData = gzencode($content, 9, FORCE_GZIP); 168 } else 169 $cacheData = $content; 170 171 // Write gz file 172 if ($diskCache && $cacheKey != "") 173 putFileContents($cacheFile, $cacheData); 174 175 // Stream to client 176 echo $cacheData; 177 } else { 178 // Stream uncompressed content 179 echo $content; 180 } 181 182 die; 183 } 184 185 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 186 187 function getParam($name, $def = false) { 188 if (!isset($_GET[$name])) 189 return $def; 190 191 return preg_replace("/[^0-9a-z\-_,]+/i", "", $_GET[$name]); // Remove anything but 0-9,a-z,-_ 192 } 193 194 function getFileContents($path) { 195 $path = realpath($path); 196 197 if (!$path || !@is_file($path)) 198 return ""; 199 200 if (function_exists("file_get_contents")) 201 return @file_get_contents($path); 202 203 $content = ""; 204 $fp = @fopen($path, "r"); 205 if (!$fp) 206 return ""; 207 208 while (!feof($fp)) 209 $content .= fgets($fp); 210 211 fclose($fp); 212 213 return $content; 214 } 215 216 function putFileContents($path, $content) { 217 if (function_exists("file_put_contents")) 218 return @file_put_contents($path, $content); 219 220 $fp = @fopen($path, "wb"); 221 if ($fp) { 222 fwrite($fp, $content); 223 fclose($fp); 224 } 225 } 226 227 // WP specific 228 function wp_compact_tinymce_js($text) { 229 // This function was custom-made for TinyMCE 2.0, not expected to work with any other JS. 230 231 // Strip comments 232 $text = preg_replace("!(^|\s+)//.*$!m", '', $text); 233 $text = preg_replace("!/\*.*?\*/!s", '', $text); 234 235 // Strip leading tabs, carriage returns and unnecessary line breaks. 236 $text = preg_replace("!^\t+!m", '', $text); 237 $text = str_replace("\r", '', $text); 238 $text = preg_replace("!(^|{|}|;|:|\))\n!m", '\\1', $text); 239 240 return "$text\n"; 241 } 242 ?> 243 244 function TinyMCECompressed() { 245 this.configs = new Array(); 246 this.loadedFiles = new Array(); 247 this.externalPlugins = new Array(); 248 this.loadAdded = false; 249 this.isLoaded = false; 250 } 251 252 TinyMCECompressed.prototype.init = function(settings) { 253 var elements = document.getElementsByTagName('script'); 254 var scriptURL = ""; 255 256 for (var i=0; i<elements.length; i++) { 257 if (elements[i].src && elements[i].src.indexOf("tiny_mce_gzip.php") != -1) { 258 scriptURL = elements[i].src; 259 break; 260 } 261 } 262 263 settings["theme"] = typeof(settings["theme"]) != "undefined" ? settings["theme"] : "default"; 264 settings["plugins"] = typeof(settings["plugins"]) != "undefined" ? settings["plugins"] : ""; 265 settings["language"] = typeof(settings["language"]) != "undefined" ? settings["language"] : "en"; 266 settings["button_tile_map"] = typeof(settings["button_tile_map"]) != "undefined" ? settings["button_tile_map"] : true; 267 this.configs[this.configs.length] = settings; 268 this.settings = settings; 269 270 scriptURL += (scriptURL.indexOf('?') == -1) ? '?' : '&'; 271 scriptURL += "theme=" + escape(this.getOnce(settings["theme"])) + "&language=" + escape(this.getOnce(settings["language"])) + "&plugins=" + escape(this.getOnce(settings["plugins"])) + "&lang=" + settings["language"] + "&index=" + escape(this.configs.length-1); 272 document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + scriptURL + '"></script>'); 273 274 if (!this.loadAdded) { 275 tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCECompressed.prototype.onLoad); 276 tinyMCE.addEvent(window, "load", TinyMCECompressed.prototype.onLoad); 277 this.loadAdded = true; 278 } 279 } 280 281 TinyMCECompressed.prototype.onLoad = function() { 282 if (tinyMCE.isLoaded) 283 return true; 284 285 tinyMCE = realTinyMCE; 286 TinyMCE_Engine.prototype.onLoad(); 287 tinyMCE._addUnloadEvents(); 288 289 tinyMCE.isLoaded = true; 290 } 291 292 TinyMCECompressed.prototype.addEvent = function(o, n, h) { 293 if (o.attachEvent) 294 o.attachEvent("on" + n, h); 295 else 296 o.addEventListener(n, h, false); 297 } 298 299 TinyMCECompressed.prototype.getOnce = function(str) { 300 var ar = str.replace(/\s+/g, '').split(','); 301 302 for (var i=0; i<ar.length; i++) { 303 if (ar[i] == '' || ar[i].charAt(0) == '-') { 304 ar[i] = null; 305 continue; 306 } 307 308 // Skip load 309 for (var x=0; x<this.loadedFiles.length; x++) { 310 if (this.loadedFiles[x] == ar[i]) 311 ar[i] = null; 312 } 313 314 this.loadedFiles[this.loadedFiles.length] = ar[i]; 315 } 316 317 // Glue 318 str = ""; 319 for (var i=0; i<ar.length; i++) { 320 if (ar[i] == null) 321 continue; 322 323 str += ar[i]; 324 325 if (i != ar.length-1) 326 str += ","; 327 } 328 329 return str; 330 }; 331 332 TinyMCECompressed.prototype.loadPlugins = function() { 333 var i, ar; 334 335 TinyMCE.prototype.loadScript = TinyMCE.prototype.orgLoadScript; 336 tinyMCE = realTinyMCE; 337 338 ar = tinyMCECompressed.externalPlugins; 339 for (i=0; i<ar.length; i++) 340 tinyMCE.loadPlugin(ar[i].name, ar[i].url); 341 342 TinyMCE.prototype.loadScript = function() {}; 343 }; 344 345 TinyMCECompressed.prototype.loadPlugin = function(n, u) { 346 this.externalPlugins[this.externalPlugins.length] = {name : n, url : u}; 347 }; 348 349 TinyMCECompressed.prototype.importPluginLanguagePack = function(n, v) { 350 tinyMCE = realTinyMCE; 351 TinyMCE.prototype.loadScript = TinyMCE.prototype.orgLoadScript; 352 tinyMCE.importPluginLanguagePack(n, v); 353 }; 354 355 TinyMCECompressed.prototype.addPlugin = function(n, p) { 356 tinyMCE = realTinyMCE; 357 tinyMCE.addPlugin(n, p); 358 }; 359 360 var tinyMCE = new TinyMCECompressed(); 361 var tinyMCECompressed = tinyMCE;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated Thu Dec 6 06:47:08 2007 for RedAlt XRefs | Cross-referenced by PHPXref 0.6 and RedAlt |