Completed
Push — master ( afa14d...f0d99a )
by Iman
13s
created

Compressor::load_files()   F

Complexity

Conditions 20
Paths 384

Size

Total Lines 131
Code Lines 68

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 68
nc 384
nop 0
dl 0
loc 131
c 0
b 0
f 0
cc 20
rs 3.6338

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
	/******
3
	 *
4
	 *	EditArea PHP compressor
5
	 * 	Developped by Christophe Dolivet
6
	 *	Released under LGPL, Apache and BSD licenses
7
	 *	v1.1.3 (2007/01/18)	 
8
	 *
9
	******/
10
	
11
	// CONFIG
12
	$param['cache_duration']= 3600 * 24 * 10;		// 10 days util client cache expires
13
	$param['compress'] = true;						// enable the code compression, should be activated but it can be usefull to desactivate it for easier error retrieving (true or false)
14
	$param['debug'] = false;						// Enable this option if you need debuging info
15
	$param['use_disk_cache']= true;					// If you enable this option gzip files will be cached on disk.
16
	$param['use_gzip']= true;						// Enable gzip compression
17
	// END CONFIG
18
	
19
	$compressor= new Compressor($param);
20
	
21
	class Compressor{
22
	
23
		
24
		function compressor($param)
25
		{
26
			$this->__construct($param);
27
		}
28
		
29
		function __construct($param)
30
		{
31
			$this->start_time= $this->get_microtime();
32
			$this->file_loaded_size=0;
33
			$this->param= $param;
34
			$this->script_list="";
35
			$this->path= dirname(__FILE__)."/";
36
			if(isset($_GET['plugins'])){
37
				$this->load_all_plugins= true;
38
				$this->full_cache_file= $this->path."edit_area_full_with_plugins.js";
39
				$this->gzip_cache_file= $this->path."edit_area_full_with_plugins.gz";
40
			}else{
41
				$this->load_all_plugins= false;
42
				$this->full_cache_file= $this->path."edit_area_full.js";
43
				$this->gzip_cache_file= $this->path."edit_area_full.gz";
44
			}
45
			
46
			$this->check_gzip_use();
47
			$this->send_headers();
48
			$this->check_cache();
49
			$this->load_files();
50
			$this->send_datas();
51
		}
52
		
53
		function send_headers()
54
		{
55
			header("Content-type: text/javascript; charset: UTF-8");
56
			header("Vary: Accept-Encoding"); // Handle proxies
57
			header(sprintf("Expires: %s GMT", gmdate("D, d M Y H:i:s", time() + $this->param['cache_duration'])) );
58
			if($this->use_gzip)
59
				header("Content-Encoding: ".$this->gzip_enc_header);
60
		}
61
		
62
		function check_gzip_use()
63
		{
64
			$encodings = array();
65
			$desactivate_gzip=false;
66
					
67
			if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
68
				$encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING'])));
69
			
70
			// desactivate gzip for IE version < 7
71
			if(preg_match("/(?:msie )([0-9.]+)/i", $_SERVER['HTTP_USER_AGENT'], $ie))
72
			{
73
				if($ie[1]<7)
74
					$desactivate_gzip=true;	
75
			}
76
			
77
			// Check for gzip header or northon internet securities
78
			if (!$desactivate_gzip && $this->param['use_gzip'] && (in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression')) {
79
				$this->gzip_enc_header= in_array('x-gzip', $encodings) ? "x-gzip" : "gzip";
80
				$this->use_gzip=true;
81
				$this->cache_file=$this->gzip_cache_file;
82
			}else{
83
				$this->use_gzip=false;
84
				$this->cache_file=$this->full_cache_file;
85
			}
86
		}
87
		
88
		function check_cache()
89
		{
90
			// Only gzip the contents if clients and server support it
91
			if (file_exists($this->cache_file)) {
92
				// check if cache file must be updated
93
				$cache_date=0;				
94
				if ($dir = opendir($this->path)) {
95
					while (($file = readdir($dir)) !== false) {
96
						if(is_file($this->path.$file) && $file!="." && $file!="..")
97
							$cache_date= max($cache_date, filemtime($this->path.$file));
98
					}
99
					closedir($dir);
100
				}
101
				if($this->load_all_plugins){
102
					$plug_path= $this->path."plugins/";
103
					if (($dir = @opendir($plug_path)) !== false)
104
					{
105
						while (($file = readdir($dir)) !== false)
106
						{
107
							if ($file !== "." && $file !== "..")
108
							{
109
								if(is_dir($plug_path.$file) && file_exists($plug_path.$file."/".$file.".js"))
110
									$cache_date= max($cache_date, filemtime("plugins/".$file."/".$file.".js"));
111
							}
112
						}
113
						closedir($dir);
114
					}
115
				}
116
117
				if(filemtime($this->cache_file) >= $cache_date){
118
					// if cache file is up to date
119
					$last_modified = gmdate("D, d M Y H:i:s",filemtime($this->cache_file))." GMT";
120
					if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]) && strcasecmp($_SERVER["HTTP_IF_MODIFIED_SINCE"], $last_modified) === 0)
121
					{
122
						header("HTTP/1.1 304 Not Modified");
123
						header("Last-modified: ".$last_modified);
124
						header("Cache-Control: Public"); // Tells HTTP 1.1 clients to cache
125
						header("Pragma:"); // Tells HTTP 1.0 clients to cache
126
					}
127
					else
128
					{
129
						header("Last-modified: ".$last_modified);
130
						header("Cache-Control: Public"); // Tells HTTP 1.1 clients to cache
131
						header("Pragma:"); // Tells HTTP 1.0 clients to cache
132
						header('Content-Length: '.filesize($this->cache_file));
133
						echo file_get_contents($this->cache_file);
134
					}				
135
					die;
136
				}
137
			}
138
			return false;
139
		}
140
		
141
		function load_files()
142
		{
143
			$loader= $this->get_content("edit_area_loader.js")."\n";
144
			
145
			// get the list of other files to load
146
	    	$loader= preg_replace("/(t\.scripts_to_load=\s*)\[([^\]]*)\];/e"
147
						, "\$this->replace_scripts('script_list', '\\1', '\\2')"
148
						, $loader);
149
		
150
			$loader= preg_replace("/(t\.sub_scripts_to_load=\s*)\[([^\]]*)\];/e"
151
						, "\$this->replace_scripts('sub_script_list', '\\1', '\\2')"
152
						, $loader);
153
154
			// replace languages names
155
			$reg_path= $this->path."reg_syntax/";
156
			$a_displayName	= array();
157
			if (($dir = @opendir($reg_path)) !== false)
158
			{
159
				while (($file = readdir($dir)) !== false)
160
				{
161
					if( $file !== "." && $file !== ".." && ( $pos = strpos( $file, '.js' ) ) !== false )
162
					{
163
						$jsContent	= $this->file_get_contents( $reg_path.$file );
164
						if( preg_match( '@(\'|")DISPLAY_NAME\1\s*:\s*(\'|")(.*)\2@', $jsContent, $match ) )
165
						{
166
							$a_displayName[] = "'". substr( $file, 0, $pos ) ."':'". htmlspecialchars( $match[3], ENT_QUOTES ) ."'";
167
						}
168
					}
169
				}
170
				closedir($dir);
171
			}
172
			$loader	= str_replace( '/*syntax_display_name_AUTO-FILL-BY-COMPRESSOR*/', implode( ",", $a_displayName ), $loader );
173
						
174
			$this->datas= $loader;
175
			$this->compress_javascript($this->datas);
176
			
177
			// load other scripts needed for the loader
178
			preg_match_all('/"([^"]*)"/', $this->script_list, $match);
179
			foreach($match[1] as $key => $value)
180
			{
181
				$content= $this->get_content(preg_replace("/\\|\//i", "", $value).".js");
182
				$this->compress_javascript($content);
183
				$this->datas.= $content."\n";
184
			}
185
			//$this->datas);
186
			//$this->datas= preg_replace('/(( |\t|\r)*\n( |\t)*)+/s', "", $this->datas);
187
			
188
			// improved compression step 1/2	
189
			$this->datas= preg_replace(array("/(\b)EditAreaLoader(\b)/", "/(\b)editAreaLoader(\b)/", "/(\b)editAreas(\b)/"), array("EAL", "eAL", "eAs"), $this->datas);
190
			//$this->datas= str_replace(array("EditAreaLoader", "editAreaLoader", "editAreas"), array("EAL", "eAL", "eAs"), $this->datas);
191
			$this->datas.= "var editAreaLoader= eAL;var editAreas=eAs;EditAreaLoader=EAL;";
192
		
193
			// load sub scripts
194
			$sub_scripts="";
195
			$sub_scripts_list= array();
196
			preg_match_all('/"([^"]*)"/', $this->sub_script_list, $match);
197
			foreach($match[1] as $value){
198
				$sub_scripts_list[]= preg_replace("/\\|\//i", "", $value).".js";
199
			}
200
		
201
			if($this->load_all_plugins){
202
				// load plugins scripts
203
				$plug_path= $this->path."plugins/";
204
				if (($dir = @opendir($plug_path)) !== false)
205
				{
206
					while (($file = readdir($dir)) !== false)
207
					{
208
						if ($file !== "." && $file !== "..")
209
						{
210
							if(is_dir($plug_path.$file) && file_exists($plug_path.$file."/".$file.".js"))
211
								$sub_scripts_list[]= "plugins/".$file."/".$file.".js";
212
						}
213
					}
214
					closedir($dir);
215
				}
216
			}
217
							
218
			foreach($sub_scripts_list as $value){
219
				$sub_scripts.= $this->get_javascript_content($value);
220
			}
221
			// improved compression step 2/2	
222
			$sub_scripts= preg_replace(array("/(\b)editAreaLoader(\b)/", "/(\b)editAreas(\b)/", "/(\b)editArea(\b)/", "/(\b)EditArea(\b)/"), array("eAL", "eAs", "eA", "EA"), $sub_scripts);
223
		//	$sub_scripts= str_replace(array("editAreaLoader", "editAreas", "editArea", "EditArea"), array("eAL", "eAs", "eA", "EA"), $sub_scripts);
224
			$sub_scripts.= "var editArea= eA;EditArea=EA;";
225
			
226
			
227
			// add the scripts
228
		//	$this->datas.= sprintf("editAreaLoader.iframe_script= \"<script type='text/javascript'>%s</script>\";\n", $sub_scripts);
229
		
230
		
231
			// add the script and use a last compression 
232
			if( $this->param['compress'] )
233
			{
234
				$last_comp	= array( 'Á' => 'this',
235
								 'Â' => 'textarea',
236
								 'Ã' => 'function',
237
								 'Ä' => 'prototype',
238
								 'Å' => 'settings',
239
								 'Æ' => 'length',
240
								 'Ç' => 'style',
241
								 'È' => 'parent',
242
								 'É' => 'last_selection',
243
								 'Ê' => 'value',
244
								 'Ë' => 'true',
245
								 'Ì' => 'false'
246
								 /*,
247
									'Î' => '"',
248
								 'Ï' => "\n",
249
								 'À' => "\r"*/);
250
			}
251
			else
252
			{
253
				$last_comp	= array();
254
			}
255
			
256
			$js_replace= '';
257
			foreach( $last_comp as $key => $val )
258
				$js_replace .= ".replace(/". $key ."/g,'". str_replace( array("\n", "\r"), array('\n','\r'), $val ) ."')";
259
			
260
			$this->datas.= sprintf("editAreaLoader.iframe_script= \"<script type='text/javascript'>%s</script>\"%s;\n",
261
								str_replace( array_values($last_comp), array_keys($last_comp), $sub_scripts ), 
262
								$js_replace);
263
			
264
			if($this->load_all_plugins)
265
				$this->datas.="editAreaLoader.all_plugins_loaded=true;\n";
266
		
267
			
268
			// load the template
269
			$this->datas.= sprintf("editAreaLoader.template= \"%s\";\n", $this->get_html_content("template.html"));
270
			// load the css
271
			$this->datas.= sprintf("editAreaLoader.iframe_css= \"<style>%s</style>\";\n", $this->get_css_content("edit_area.css"));
272
					
273
		//	$this->datas= "function editArea(){};editArea.prototype.loader= function(){alert('bouhbouh');} var a= new editArea();a.loader();";
274
					
275
		}
276
		
277
		function send_datas()
278
		{
279
			if($this->param['debug']){
280
				$header=sprintf("/* USE PHP COMPRESSION\n");
281
				$header.=sprintf("javascript size: based files: %s => PHP COMPRESSION => %s ", $this->file_loaded_size, strlen($this->datas));
282
				if($this->use_gzip){
283
					$gzip_datas=  gzencode($this->datas, 9, FORCE_GZIP);				
284
					$header.=sprintf("=> GZIP COMPRESSION => %s", strlen($gzip_datas));
285
					$ratio = round(100 - strlen($gzip_datas) / $this->file_loaded_size * 100.0);			
286
				}else{
287
					$ratio = round(100 - strlen($this->datas) / $this->file_loaded_size * 100.0);
288
				}
289
				$header.=sprintf(", reduced by %s%%\n", $ratio);
290
				$header.=sprintf("compression time: %s\n", $this->get_microtime()-$this->start_time); 
291
				$header.=sprintf("%s\n", implode("\n", $this->infos));
292
				$header.=sprintf("*/\n");
293
				$this->datas= $header.$this->datas;	
294
			}
295
			$mtime= time(); // ensure that the 2 disk files will have the same update time
296
			// generate gzip file and cahce it if using disk cache
297
			if($this->use_gzip){
298
				$this->gzip_datas= gzencode($this->datas, 9, FORCE_GZIP);
299
				if($this->param['use_disk_cache'])
300
					$this->file_put_contents($this->gzip_cache_file, $this->gzip_datas, $mtime);
301
			}
302
			
303
			// generate full js file and cache it if using disk cache			
304
			if($this->param['use_disk_cache'])
305
				$this->file_put_contents($this->full_cache_file, $this->datas, $mtime);
306
			
307
			// generate output
308
			if($this->use_gzip)
309
				echo $this->gzip_datas;
310
			else
311
				echo $this->datas;
312
				
313
//			die;
314
		}
315
				
316
		
317
		function get_content($end_uri)
318
		{
319
			$end_uri=preg_replace("/\.\./", "", $end_uri); // Remove any .. (security)
320
			$file= $this->path.$end_uri;
321
			if(file_exists($file)){
322
				$this->infos[]=sprintf("'%s' loaded", $end_uri);
323
				/*$fd = fopen($file, 'rb');
324
				$content = fread($fd, filesize($file));
325
				fclose($fd);
326
				return $content;*/
327
				return $this->file_get_contents($file);
328
			}else{
329
				$this->infos[]=sprintf("'%s' not loaded", $end_uri);
330
				return "";
331
			}
332
		}
333
		
334
		function get_javascript_content($end_uri)
335
		{
336
			$val=$this->get_content($end_uri);
337
	
338
			$this->compress_javascript($val);
339
			$this->prepare_string_for_quotes($val);
340
			return $val;
341
		}
342
		
343
		function compress_javascript(&$code)
344
		{
345
			if($this->param['compress'])
346
			{
347
				// remove all comments
348
				//	(\"(?:[^\"\\]*(?:\\\\)*(?:\\\"?)?)*(?:\"|$))|(\'(?:[^\'\\]*(?:\\\\)*(?:\\'?)?)*(?:\'|$))|(?:\/\/(?:.|\r|\t)*?(\n|$))|(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$))
349
				$code= preg_replace("/(\"(?:[^\"\\\\]*(?:\\\\\\\\)*(?:\\\\\"?)?)*(?:\"|$))|(\'(?:[^\'\\\\]*(?:\\\\\\\\)*(?:\\\\\'?)?)*(?:\'|$))|(?:\/\/(?:.|\r|\t)*?(\n|$))|(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$))/s", "$1$2$3", $code);
350
				// remove line return, empty line and tabulation
351
				$code= preg_replace('/(( |\t|\r)*\n( |\t)*)+/s', " ", $code);
352
				// add line break before "else" otherwise navigators can't manage to parse the file
353
				$code= preg_replace('/(\b(else)\b)/', "\n$1", $code);
354
				// remove unnecessary spaces
355
				$code= preg_replace('/( |\t|\r)*(;|\{|\}|=|==|\-|\+|,|\(|\)|\|\||&\&|\:)( |\t|\r)*/', "$2", $code);
356
			}
357
		}
358
		
359
		function get_css_content($end_uri){
360
			$code=$this->get_content($end_uri);
361
			// remove comments
362
			$code= preg_replace("/(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$))/s", "", $code);
363
			// remove spaces
364
			$code= preg_replace('/(( |\t|\r)*\n( |\t)*)+/s', "", $code);
365
			// remove spaces
366
			$code= preg_replace('/( |\t|\r)?(\:|,|\{|\})( |\t|\r)+/', "$2", $code);
367
		
368
			$this->prepare_string_for_quotes($code);
369
			return $code;
370
		}
371
		
372
		function get_html_content($end_uri){
373
			$code=$this->get_content($end_uri);
374
			//$code= preg_replace('/(\"(?:\\\"|[^\"])*(?:\"|$))|' . "(\'(?:\\\'|[^\'])*(?:\'|$))|(?:\/\/(?:.|\r|\t)*?(\n|$))|(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$))/s", "$1$2$3", $code);
375
			$code= preg_replace('/(( |\t|\r)*\n( |\t)*)+/s', " ", $code);
376
			$this->prepare_string_for_quotes($code);
377
			return $code;
378
		}
379
		
380
		function prepare_string_for_quotes(&$str){
381
			// prepare the code to be putted into quotes 
382
			/*$pattern= array("/(\\\\)?\"/", '/\\\n/'	, '/\\\r/'	, "/(\r?\n)/");
383
			$replace= array('$1$1\\"', '\\\\\\n', '\\\\\\r'	, '\\\n"$1+"');*/
384
			$pattern= array("/(\\\\)?\"/", '/\\\n/'	, '/\\\r/'	, "/(\r?\n)/");
385
			if($this->param['compress'])
386
				$replace= array('$1$1\\"', '\\\\\\n', '\\\\\\r'	, '\n');
387
			else
388
				$replace= array('$1$1\\"', '\\\\\\n', '\\\\\\r'	, "\\n\"\n+\"");
389
			$str= preg_replace($pattern, $replace, $str);
390
		}
391
		
392
		function replace_scripts($var, $param1, $param2)
393
		{
394
			$this->$var=stripslashes($param2);
395
	        return $param1."[];";
396
		}
397
398
		/* for php version that have not thoses functions */
399
		function file_get_contents($file)
400
		{
401
			$fd = fopen($file, 'rb');
402
			$content = fread($fd, filesize($file));
403
			fclose($fd);
404
			$this->file_loaded_size+= strlen($content);
405
			return $content;				
406
		}
407
		
408
		function file_put_contents($file, &$content, $mtime=-1)
409
		{
410
			if($mtime==-1)
411
				$mtime=time();
412
			$fp = @fopen($file, "wb");
413
			if ($fp) {
414
				fwrite($fp, $content);
415
				fclose($fp);
416
				touch($file, $mtime);
417
				return true;
418
			}
419
			return false;
420
		}
421
		
422
		function get_microtime()
423
		{
424
		   list($usec, $sec) = explode(" ", microtime());
425
		   return ((float)$usec + (float)$sec);
426
		}
427
	}	
428
?>
429