author | Dan |
Mon, 18 Feb 2008 16:13:56 -0500 | |
changeset 425 | fa51b1b5eae6 |
parent 421 | dbae4d327846 |
child 430 | ec90736b9cb9 |
permissions | -rw-r--r-- |
1 | 1 |
<?php |
2 |
||
3 |
/* |
|
4 |
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between |
|
411 | 5 |
* Version 1.1.2 (Caoineag alpha 2) |
1 | 6 |
* Copyright (C) 2006-2007 Dan Fuhry |
7 |
* jsres.php - the Enano client-side runtime, a.k.a. AJAX on steroids |
|
8 |
* |
|
9 |
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License |
|
10 |
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. |
|
11 |
* |
|
12 |
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied |
|
13 |
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. |
|
14 |
*/ |
|
15 |
||
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
16 |
// Setup Enano |
1 | 17 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
18 |
// |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
19 |
// Determine the location of Enano as an absolute path. |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
20 |
// |
1 | 21 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
22 |
// We need to see if this is a specially marked Enano development server. You can create an Enano |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
23 |
// development server by cloning the Mercurial repository into a directory named repo, and then |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
24 |
// using symlinks to reference the original files so as to segregate unique files from non-unique |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
25 |
// and distribution-standard ones. Enano will pivot its root directory accordingly if the file |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
26 |
// .enanodev is found in the Enano root (not /repo/). |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
27 |
if ( strpos(__FILE__, '/repo/') && ( file_exists('../../.enanodev') || file_exists('../../../.enanodev') ) ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
28 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
29 |
// We have a development directory. Remove /repo/ from the picture. |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
30 |
$filename = str_replace('/repo/', '/', __FILE__); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
31 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
32 |
else |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
33 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
34 |
// Standard Enano installation |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
35 |
$filename = __FILE__; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
36 |
} |
1 | 37 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
38 |
// ENANO_ROOT is sometimes defined by plugins like AjIM that need the constant before the Enano API is initialized |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
39 |
if ( !defined('ENANO_ROOT') ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
40 |
define('ENANO_ROOT', dirname(dirname(dirname($filename)))); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
41 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
42 |
chdir(ENANO_ROOT); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
43 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
44 |
// CONFIG |
1 | 45 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
46 |
// Files safe to run full (aggressive) compression on |
421 | 47 |
$full_compress_safe = array( |
48 |
// Sorted by file size, descending (du -b *.js | sort -n) |
|
49 |
'ajax.js', |
|
50 |
'editor.js', |
|
51 |
'acl.js', |
|
52 |
'misc.js', |
|
53 |
'comments.js', |
|
54 |
'rijndael.js', |
|
55 |
'autofill.js', |
|
56 |
'dropdown.js', |
|
57 |
'paginate.js', |
|
58 |
'autocomplete.js', |
|
59 |
'md5.js', |
|
60 |
'flyin.js', |
|
61 |
'template-compiler.js', |
|
62 |
'toolbar.js' |
|
63 |
); |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
64 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
65 |
// Files that should NOT be compressed due to already being compressed, licensing, or invalid produced code |
421 | 66 |
$compress_unsafe = array('SpryEffects.js', 'json.js', 'fat.js', 'admin-menu.js'); |
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
67 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
68 |
require('includes/functions.php'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
69 |
require('includes/json2.php'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
70 |
require('includes/js-compressor.php'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
71 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
72 |
// Output format will always be JS |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
73 |
header('Content-type: text/javascript'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
74 |
$everything = ''; |
1 | 75 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
76 |
// Load and parse enano_lib_basic |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
77 |
$file = @file_get_contents('includes/clientside/static/enano-lib-basic.js'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
78 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
79 |
$pos_start_includes = strpos($file, '/*!START_INCLUDER*/'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
80 |
$pos_end_includes = strpos($file, '/*!END_INCLUDER*/'); |
1 | 81 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
82 |
if ( !$pos_start_includes || !$pos_end_includes ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
83 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
84 |
die('// Error: enano-lib-basic does not have required metacomments'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
85 |
} |
1 | 86 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
87 |
$pos_end_includes += strlen('/*!END_INCLUDER*/'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
88 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
89 |
preg_match('/var thefiles = (\[([^\]]+?)\]);/', $file, $match); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
90 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
91 |
if ( empty($match) ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
92 |
die('// Error: could not retrieve file list from enano-lib-basic'); |
1 | 93 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
94 |
// Decode file list |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
95 |
try |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
96 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
97 |
$file_list = enano_json_decode($match[1]); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
98 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
99 |
catch ( Exception $e ) |
1 | 100 |
{ |
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
101 |
die("// Exception caught during file list parsing"); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
102 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
103 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
104 |
$apex = filemtime('includes/clientside/static/enano-lib-basic.js'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
105 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
106 |
$before_includes = substr($file, 0, $pos_start_includes); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
107 |
$after_includes = substr($file, $pos_end_includes); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
108 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
109 |
$everything .= $before_includes; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
110 |
$everything .= $after_includes; |
1 | 111 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
112 |
foreach ( $file_list as $js_file ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
113 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
114 |
$file_contents = file_get_contents("includes/clientside/static/$js_file"); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
115 |
$file_md5 = md5($file_contents); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
116 |
$time = filemtime("includes/clientside/static/$js_file"); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
117 |
if ( $time > $apex ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
118 |
$apex = $time; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
119 |
// Is this file cached? |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
120 |
$cache_path = ENANO_ROOT . "/cache/jsres_$js_file.json"; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
121 |
$loaded_cache = false; |
1 | 122 |
|
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
123 |
if ( file_exists($cache_path) ) |
1 | 124 |
{ |
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
125 |
// Load the cache file and parse it. |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
126 |
$cache_file = file_get_contents($cache_path); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
127 |
try |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
128 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
129 |
$cache_file = enano_json_decode($cache_file); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
130 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
131 |
catch ( Exception $e ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
132 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
133 |
// Don't do anything - let our fallbacks come into place |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
134 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
135 |
if ( is_array($cache_file) && isset($cache_file['md5']) && isset($cache_file['src']) ) |
1 | 136 |
{ |
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
137 |
if ( $cache_file['md5'] === $file_md5 ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
138 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
139 |
$loaded_cache = true; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
140 |
$file_contents = $cache_file['src']; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
141 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
142 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
143 |
} |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
144 |
if ( !$loaded_cache ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
145 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
146 |
// Try to open the cache file and write to it. If we can't do that, just don't compress the code. |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
147 |
$handle = @fopen($cache_path, 'w'); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
148 |
if ( $handle ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
149 |
{ |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
150 |
$aggressive = in_array($js_file, $full_compress_safe); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
151 |
if ( !in_array($js_file, $compress_unsafe) ) |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
152 |
$file_contents = perform_js_compress($file_contents, $aggressive); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
153 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
154 |
$payload = enano_json_encode(array( |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
155 |
'md5' => $file_md5, |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
156 |
'src' => $file_contents |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
157 |
)); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
158 |
fwrite($handle, $payload); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
159 |
fclose($handle); |
1 | 160 |
} |
161 |
} |
|
162 |
||
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
163 |
$everything .= "\n // $js_file\n"; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
164 |
$everything .= "\n" . $file_contents; |
1 | 165 |
} |
420
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
166 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
167 |
$date = date('r', $apex); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
168 |
header("Date: $date"); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
169 |
header("Last-Modified: $date"); |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
170 |
|
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
171 |
echo $everything; |
301f546688d1
Re-enabled, debugged, and optimized Javascript compression code
Dan
parents:
411
diff
changeset
|
172 |