From 1c5810d2b0c06ac3ce2e237d20a80188243c95be Mon Sep 17 00:00:00 2001
From: Steve Clay
Date: Wed, 19 Jan 2011 18:43:18 +0000
Subject: [PATCH] cleaning trunk
---
min/.htaccess | 4 -
min/README.txt | 152 -
min/builder/_index.js | 242 --
min/builder/bm.js | 36 -
min/builder/index.php | 186 -
min/builder/ocCheck.php | 36 -
min/builder/rewriteTest.js | 1 -
min/config.php | 157 -
min/groupsConfig.php | 38 -
min/index.php | 71 -
min/lib/FirePHP.php | 1370 -------
min/lib/HTTP/ConditionalGet.php | 348 --
min/lib/HTTP/Encoder.php | 326 --
min/lib/JSMin.php | 314 --
min/lib/JSMinPlus.php | 1980 ----------
min/lib/Minify.php | 519 ---
min/lib/Minify/Build.php | 103 -
min/lib/Minify/CSS.php | 80 -
min/lib/Minify/CSS/Compressor.php | 250 --
min/lib/Minify/CSS/UriRewriter.php | 270 --
min/lib/Minify/Cache/APC.php | 130 -
min/lib/Minify/Cache/File.php | 125 -
min/lib/Minify/Cache/Interface.php | 59 -
min/lib/Minify/Cache/Memcache.php | 137 -
min/lib/Minify/CommentPreserver.php | 90 -
min/lib/Minify/Controller/Base.php | 204 -
min/lib/Minify/Controller/Files.php | 78 -
min/lib/Minify/Controller/Groups.php | 94 -
min/lib/Minify/Controller/MinApp.php | 153 -
min/lib/Minify/Controller/Page.php | 82 -
min/lib/Minify/Controller/Version1.php | 116 -
min/lib/Minify/HTML.php | 245 --
min/lib/Minify/ImportProcessor.php | 157 -
min/lib/Minify/Lines.php | 130 -
min/lib/Minify/Logger.php | 45 -
min/lib/Minify/Packer.php | 37 -
min/lib/Minify/Source.php | 187 -
min/lib/Minify/YUICompressor.php | 139 -
min/lib/Solar/Dir.php | 199 -
min/pageBuffer.php | 93 -
min/pageConfig.php | 82 -
min/test/_inc.php | 182 -
min/test/index.php | 161 -
min/test/pageBuffer.php | 96 -
min/utils.php | 97 -
min_extras/README.txt | 15 -
min_extras/ab_tests/README.txt | 10 -
min_extras/ab_tests/_delimiter | 3 -
min_extras/ab_tests/ideal_php/before.php | 25 -
min_extras/ab_tests/minify/before.js | 3408 -----------------
min_extras/ab_tests/minify/test_Files.php | 13 -
.../ab_tests/minify/test_Files_Memcache.php | 33 -
min_extras/ab_tests/minify/test_Groups.php | 13 -
min_extras/ab_tests/minify/test_Version1.php | 11 -
min_extras/ab_tests/minify/test_memcache.php | 19 -
min_extras/ab_tests/mod_deflate/.htaccess-dev | 30 -
min_extras/ab_tests/mod_deflate/before.js | 374 --
min_extras/ab_tests/results_summary.txt | 37 -
min_extras/ab_tests/test_all.bat | 67 -
min_extras/ab_tests/test_memcache.bat | 13 -
min_extras/ab_tests/type-map/.htaccess-dev | 40 -
min_extras/ab_tests/type-map/before.js | 374 --
min_extras/ab_tests/type-map/before.js.var | 14 -
min_extras/ab_tests/type-map/before.js.zc | Bin 15999 -> 0 bytes
min_extras/ab_tests/type-map/before.js.zd | Bin 15993 -> 0 bytes
min_extras/ab_tests/type-map/before.js.zg | Bin 16011 -> 0 bytes
min_extras/ab_tests/v1.0/minify.php | 500 ---
min_extras/config.php | 16 -
min_extras/examples/1/_groupsSources.php | 11 -
min_extras/examples/1/index.php | 49 -
min_extras/examples/1/m.php | 13 -
min_extras/examples/2/_groupsSources.php | 11 -
min_extras/examples/2/index.php | 91 -
min_extras/examples/2/m.php | 13 -
min_extras/examples/index.php | 3 -
min_extras/examples/lib.js | 6 -
min_extras/examples/test space.js | 5 -
min_extras/examples/test.css | 41 -
min_extras/hydrogen_logo.gif | Bin 686 -> 0 bytes
min_extras/tools/encodeFile.php | 33 -
min_extras/tools/minifyFile.php | 45 -
min_extras/tools/minifyTextarea.php | 88 -
min_extras/tools/minifyUrl.php | 159 -
min_extras/tools/testRewriteUri.php | 58 -
min_unit_tests/HTTP_ConditionalGet/2.php | 44 -
min_unit_tests/HTTP_ConditionalGet/3.php | 40 -
min_unit_tests/HTTP_ConditionalGet/4.php | 49 -
min_unit_tests/HTTP_ConditionalGet/5.php | 27 -
.../HTTP_ConditionalGet/_include.php | 64 -
min_unit_tests/HTTP_ConditionalGet/index.php | 36 -
min_unit_tests/HTTP_Encoder/green.png | Bin 202 -> 0 bytes
min_unit_tests/HTTP_Encoder/index.php | 60 -
min_unit_tests/README.txt | 4 -
min_unit_tests/_inc.php | 53 -
min_unit_tests/_test_files/css/comments.css | 9 -
.../_test_files/css/comments.min.css | 3 -
min_unit_tests/_test_files/css/hacks.css | 66 -
min_unit_tests/_test_files/css/hacks.min.css | 4 -
min_unit_tests/_test_files/css/issue62.css | 890 -----
.../_test_files/css/issue62.min.css | 25 -
.../_test_files/css/paths_prepend.css | 12 -
.../_test_files/css/paths_prepend.min.css | 1 -
.../_test_files/css/paths_rewrite.css | 14 -
.../_test_files/css/paths_rewrite.min.css | 1 -
min_unit_tests/_test_files/css/readme.txt | 1 -
min_unit_tests/_test_files/css/selectors.css | 42 -
.../_test_files/css/selectors.min.css | 37 -
min_unit_tests/_test_files/css/styles.css | 31 -
min_unit_tests/_test_files/css/styles.min.css | 3 -
min_unit_tests/_test_files/css/subsilver.css | 434 ---
.../_test_files/css/subsilver.min.css | 18 -
.../_test_files/css/unusual_strings.css | 10 -
.../_test_files/css/unusual_strings.min.css | 2 -
.../_test_files/css/vladmirated.css | 658 ----
.../_test_files/css/vladmirated.min.css | 79 -
.../_test_files/css_uriRewriter/exp.css | 14 -
.../_test_files/css_uriRewriter/in.css | 14 -
min_unit_tests/_test_files/html/before.html | 96 -
.../_test_files/html/before.min.html | 36 -
min_unit_tests/_test_files/html/before2.html | 95 -
.../_test_files/html/before2.min.html | 36 -
.../importProcessor/1/adjacent.css | 3 -
.../_test_files/importProcessor/1/tv.css | 4 -
.../_test_files/importProcessor/adjacent.css | 4 -
.../_test_files/importProcessor/input.css | 4 -
.../_test_files/importProcessor/output.css | 48 -
min_unit_tests/_test_files/js/before.js | 57 -
min_unit_tests/_test_files/js/before.min.js | 22 -
.../_test_files/js/before.min_plus.js | 22 -
min_unit_tests/_test_files/js/condcomm.js | 14 -
.../_test_files/js/condcomm.min_plus.js | 13 -
min_unit_tests/_test_files/js/issue74.js | 4 -
min_unit_tests/_test_files/js/issue74.min.js | 1 -
.../_test_files/js/issue74.min_plus.js | 1 -
min_unit_tests/_test_files/js/jquery-1.2.3.js | 3408 -----------------
.../_test_files/minify/QueryString.js | 168 -
min_unit_tests/_test_files/minify/email.js | 24 -
.../_test_files/minify/issue73_1.js | 2 -
.../_test_files/minify/issue73_2.js | 3 -
.../_test_files/minify/issue89_1.css | 7 -
.../_test_files/minify/issue89_2.css | 7 -
.../_test_files/minify/issue89_out.min.css | 1 -
.../_test_files/minify/lines_bugs.js | 2 -
.../_test_files/minify/lines_output.js | 280 --
.../_test_files/minify/minified.css | 5 -
min_unit_tests/_test_files/minify/minified.js | 12 -
min_unit_tests/test_HTTP_ConditionalGet.php | 137 -
min_unit_tests/test_HTTP_Encoder.php | 260 --
min_unit_tests/test_JSMin.php | 63 -
min_unit_tests/test_JSMinPlus.php | 80 -
min_unit_tests/test_Minify.php | 213 --
min_unit_tests/test_Minify_Build.php | 36 -
min_unit_tests/test_Minify_CSS.php | 53 -
.../test_Minify_CSS_UriRewriter.php | 56 -
min_unit_tests/test_Minify_Cache_APC.php | 33 -
min_unit_tests/test_Minify_Cache_File.php | 54 -
min_unit_tests/test_Minify_Cache_Memcache.php | 38 -
.../test_Minify_CommentPreserver.php | 37 -
min_unit_tests/test_Minify_HTML.php | 59 -
.../test_Minify_ImportProcessor.php | 48 -
min_unit_tests/test_Minify_Lines.php | 36 -
min_unit_tests/test_all.php | 17 -
min_unit_tests/test_environment.php | 107 -
min_unit_tests/test_js_in_browser.html | 4 -
min_unit_tests/test_realpath.php | 64 -
min_unit_tests/test_simpletest.php | 20 -
mincache/.htaccess | 44 -
mincache/.htaccess-dev | 45 -
mincache/README.txt | 69 -
mincache/config.php | 15 -
mincache/gen.php | 103 -
mincache/src/test.css | 6 -
release_2.1.3/HISTORY.txt | 75 -
release_2.1.3/LICENSE.txt | 26 -
release_2.1.3/README.txt | 53 -
release_2.1.3/UPGRADING.txt | 35 -
release_2.1.3/min/.htaccess | 4 -
release_2.1.3/min/README.txt | 132 -
release_2.1.3/min/builder/_index.js | 242 --
release_2.1.3/min/builder/bm.js | 36 -
release_2.1.3/min/builder/index.php | 182 -
release_2.1.3/min/builder/ocCheck.php | 36 -
release_2.1.3/min/builder/rewriteTest.js | 1 -
release_2.1.3/min/config.php | 156 -
release_2.1.3/min/groupsConfig.php | 34 -
release_2.1.3/min/index.php | 66 -
release_2.1.3/min/lib/FirePHP.php | 1370 -------
release_2.1.3/min/lib/HTTP/ConditionalGet.php | 348 --
release_2.1.3/min/lib/HTTP/Encoder.php | 326 --
release_2.1.3/min/lib/JSMin.php | 314 --
release_2.1.3/min/lib/JSMinPlus.php | 1872 ---------
release_2.1.3/min/lib/Minify.php | 532 ---
release_2.1.3/min/lib/Minify/Build.php | 103 -
release_2.1.3/min/lib/Minify/CSS.php | 83 -
.../min/lib/Minify/CSS/Compressor.php | 250 --
.../min/lib/Minify/CSS/UriRewriter.php | 270 --
release_2.1.3/min/lib/Minify/Cache/APC.php | 130 -
release_2.1.3/min/lib/Minify/Cache/File.php | 125 -
.../min/lib/Minify/Cache/Memcache.php | 137 -
.../min/lib/Minify/CommentPreserver.php | 90 -
.../min/lib/Minify/Controller/Base.php | 202 -
.../min/lib/Minify/Controller/Files.php | 78 -
.../min/lib/Minify/Controller/Groups.php | 94 -
.../min/lib/Minify/Controller/MinApp.php | 132 -
.../min/lib/Minify/Controller/Page.php | 82 -
.../min/lib/Minify/Controller/Version1.php | 118 -
release_2.1.3/min/lib/Minify/HTML.php | 245 --
.../min/lib/Minify/ImportProcessor.php | 157 -
release_2.1.3/min/lib/Minify/Lines.php | 131 -
release_2.1.3/min/lib/Minify/Logger.php | 45 -
release_2.1.3/min/lib/Minify/Packer.php | 37 -
release_2.1.3/min/lib/Minify/Source.php | 187 -
.../min/lib/Minify/YUICompressor.php | 139 -
release_2.1.3/min/lib/Solar/Dir.php | 199 -
release_2.1.3/min/utils.php | 90 -
.../min_unit_tests/HTTP_ConditionalGet/2.php | 44 -
.../min_unit_tests/HTTP_ConditionalGet/3.php | 40 -
.../min_unit_tests/HTTP_ConditionalGet/4.php | 49 -
.../min_unit_tests/HTTP_ConditionalGet/5.php | 27 -
.../HTTP_ConditionalGet/_include.php | 64 -
.../HTTP_ConditionalGet/index.php | 36 -
.../min_unit_tests/HTTP_Encoder/green.png | Bin 202 -> 0 bytes
.../min_unit_tests/HTTP_Encoder/index.php | 60 -
release_2.1.3/min_unit_tests/_inc.php | 50 -
.../_test_files/css/comments.css | 9 -
.../_test_files/css/comments.min.css | 3 -
.../min_unit_tests/_test_files/css/hacks.css | 66 -
.../_test_files/css/hacks.min.css | 4 -
.../_test_files/css/issue62.css | 890 -----
.../_test_files/css/issue62.min.css | 25 -
.../_test_files/css/paths_prepend.css | 12 -
.../_test_files/css/paths_prepend.min.css | 1 -
.../_test_files/css/paths_rewrite.css | 14 -
.../_test_files/css/paths_rewrite.min.css | 1 -
.../min_unit_tests/_test_files/css/readme.txt | 1 -
.../_test_files/css/selectors.css | 42 -
.../_test_files/css/selectors.min.css | 37 -
.../min_unit_tests/_test_files/css/styles.css | 31 -
.../_test_files/css/styles.min.css | 3 -
.../_test_files/css/subsilver.css | 434 ---
.../_test_files/css/subsilver.min.css | 18 -
.../_test_files/css/unusual_strings.css | 10 -
.../_test_files/css/unusual_strings.min.css | 2 -
.../_test_files/css/vladmirated.css | 658 ----
.../_test_files/css/vladmirated.min.css | 79 -
.../_test_files/css_uriRewriter/exp.css | 14 -
.../_test_files/css_uriRewriter/in.css | 14 -
.../_test_files/html/before.html | 96 -
.../_test_files/html/before.min.html | 36 -
.../_test_files/html/before2.html | 95 -
.../_test_files/html/before2.min.html | 36 -
.../importProcessor/1/adjacent.css | 3 -
.../_test_files/importProcessor/1/tv.css | 4 -
.../_test_files/importProcessor/adjacent.css | 4 -
.../_test_files/importProcessor/input.css | 4 -
.../_test_files/importProcessor/output.css | 48 -
.../min_unit_tests/_test_files/js/before.js | 57 -
.../_test_files/js/before.min.js | 22 -
.../_test_files/js/before.min_plus.js | 22 -
.../min_unit_tests/_test_files/js/condcomm.js | 14 -
.../_test_files/js/condcomm.min_plus.js | 13 -
.../min_unit_tests/_test_files/js/issue74.js | 4 -
.../_test_files/js/issue74.min.js | 1 -
.../_test_files/js/issue74.min_plus.js | 1 -
.../_test_files/js/jquery-1.2.3.js | 3408 -----------------
.../_test_files/minify/QueryString.js | 168 -
.../_test_files/minify/email.js | 24 -
.../_test_files/minify/issue73_1.js | 2 -
.../_test_files/minify/issue73_2.js | 3 -
.../_test_files/minify/issue89_1.css | 7 -
.../_test_files/minify/issue89_2.css | 7 -
.../_test_files/minify/issue89_out.min.css | 1 -
.../_test_files/minify/lines_bugs.js | 2 -
.../_test_files/minify/lines_output.js | 280 --
.../_test_files/minify/minified.css | 5 -
.../_test_files/minify/minified.js | 12 -
.../test_HTTP_ConditionalGet.php | 137 -
.../min_unit_tests/test_HTTP_Encoder.php | 260 --
release_2.1.3/min_unit_tests/test_JSMin.php | 63 -
.../min_unit_tests/test_JSMinPlus.php | 80 -
release_2.1.3/min_unit_tests/test_Minify.php | 213 --
.../min_unit_tests/test_Minify_Build.php | 36 -
.../min_unit_tests/test_Minify_CSS.php | 53 -
.../test_Minify_CSS_UriRewriter.php | 56 -
.../min_unit_tests/test_Minify_Cache_APC.php | 33 -
.../min_unit_tests/test_Minify_Cache_File.php | 54 -
.../test_Minify_Cache_Memcache.php | 38 -
.../test_Minify_CommentPreserver.php | 37 -
.../min_unit_tests/test_Minify_HTML.php | 59 -
.../test_Minify_ImportProcessor.php | 48 -
.../min_unit_tests/test_Minify_Lines.php | 36 -
release_2.1.3/min_unit_tests/test_all.php | 17 -
.../min_unit_tests/test_environment.php | 100 -
.../min_unit_tests/test_js_in_browser.html | 4 -
294 files changed, 41468 deletions(-)
delete mode 100644 min/.htaccess
delete mode 100644 min/README.txt
delete mode 100644 min/builder/_index.js
delete mode 100644 min/builder/bm.js
delete mode 100644 min/builder/index.php
delete mode 100644 min/builder/ocCheck.php
delete mode 100644 min/builder/rewriteTest.js
delete mode 100644 min/config.php
delete mode 100644 min/groupsConfig.php
delete mode 100644 min/index.php
delete mode 100644 min/lib/FirePHP.php
delete mode 100644 min/lib/HTTP/ConditionalGet.php
delete mode 100644 min/lib/HTTP/Encoder.php
delete mode 100644 min/lib/JSMin.php
delete mode 100644 min/lib/JSMinPlus.php
delete mode 100644 min/lib/Minify.php
delete mode 100644 min/lib/Minify/Build.php
delete mode 100644 min/lib/Minify/CSS.php
delete mode 100644 min/lib/Minify/CSS/Compressor.php
delete mode 100644 min/lib/Minify/CSS/UriRewriter.php
delete mode 100644 min/lib/Minify/Cache/APC.php
delete mode 100644 min/lib/Minify/Cache/File.php
delete mode 100644 min/lib/Minify/Cache/Interface.php
delete mode 100644 min/lib/Minify/Cache/Memcache.php
delete mode 100644 min/lib/Minify/CommentPreserver.php
delete mode 100644 min/lib/Minify/Controller/Base.php
delete mode 100644 min/lib/Minify/Controller/Files.php
delete mode 100644 min/lib/Minify/Controller/Groups.php
delete mode 100644 min/lib/Minify/Controller/MinApp.php
delete mode 100644 min/lib/Minify/Controller/Page.php
delete mode 100644 min/lib/Minify/Controller/Version1.php
delete mode 100644 min/lib/Minify/HTML.php
delete mode 100644 min/lib/Minify/ImportProcessor.php
delete mode 100644 min/lib/Minify/Lines.php
delete mode 100644 min/lib/Minify/Logger.php
delete mode 100644 min/lib/Minify/Packer.php
delete mode 100644 min/lib/Minify/Source.php
delete mode 100644 min/lib/Minify/YUICompressor.php
delete mode 100644 min/lib/Solar/Dir.php
delete mode 100644 min/pageBuffer.php
delete mode 100644 min/pageConfig.php
delete mode 100644 min/test/_inc.php
delete mode 100644 min/test/index.php
delete mode 100644 min/test/pageBuffer.php
delete mode 100644 min/utils.php
delete mode 100644 min_extras/README.txt
delete mode 100644 min_extras/ab_tests/README.txt
delete mode 100644 min_extras/ab_tests/_delimiter
delete mode 100644 min_extras/ab_tests/ideal_php/before.php
delete mode 100644 min_extras/ab_tests/minify/before.js
delete mode 100644 min_extras/ab_tests/minify/test_Files.php
delete mode 100644 min_extras/ab_tests/minify/test_Files_Memcache.php
delete mode 100644 min_extras/ab_tests/minify/test_Groups.php
delete mode 100644 min_extras/ab_tests/minify/test_Version1.php
delete mode 100644 min_extras/ab_tests/minify/test_memcache.php
delete mode 100644 min_extras/ab_tests/mod_deflate/.htaccess-dev
delete mode 100644 min_extras/ab_tests/mod_deflate/before.js
delete mode 100644 min_extras/ab_tests/results_summary.txt
delete mode 100644 min_extras/ab_tests/test_all.bat
delete mode 100644 min_extras/ab_tests/test_memcache.bat
delete mode 100644 min_extras/ab_tests/type-map/.htaccess-dev
delete mode 100644 min_extras/ab_tests/type-map/before.js
delete mode 100644 min_extras/ab_tests/type-map/before.js.var
delete mode 100644 min_extras/ab_tests/type-map/before.js.zc
delete mode 100644 min_extras/ab_tests/type-map/before.js.zd
delete mode 100644 min_extras/ab_tests/type-map/before.js.zg
delete mode 100644 min_extras/ab_tests/v1.0/minify.php
delete mode 100644 min_extras/config.php
delete mode 100644 min_extras/examples/1/_groupsSources.php
delete mode 100644 min_extras/examples/1/index.php
delete mode 100644 min_extras/examples/1/m.php
delete mode 100644 min_extras/examples/2/_groupsSources.php
delete mode 100644 min_extras/examples/2/index.php
delete mode 100644 min_extras/examples/2/m.php
delete mode 100644 min_extras/examples/index.php
delete mode 100644 min_extras/examples/lib.js
delete mode 100644 min_extras/examples/test space.js
delete mode 100644 min_extras/examples/test.css
delete mode 100644 min_extras/hydrogen_logo.gif
delete mode 100644 min_extras/tools/encodeFile.php
delete mode 100644 min_extras/tools/minifyFile.php
delete mode 100644 min_extras/tools/minifyTextarea.php
delete mode 100644 min_extras/tools/minifyUrl.php
delete mode 100644 min_extras/tools/testRewriteUri.php
delete mode 100644 min_unit_tests/HTTP_ConditionalGet/2.php
delete mode 100644 min_unit_tests/HTTP_ConditionalGet/3.php
delete mode 100644 min_unit_tests/HTTP_ConditionalGet/4.php
delete mode 100644 min_unit_tests/HTTP_ConditionalGet/5.php
delete mode 100644 min_unit_tests/HTTP_ConditionalGet/_include.php
delete mode 100644 min_unit_tests/HTTP_ConditionalGet/index.php
delete mode 100644 min_unit_tests/HTTP_Encoder/green.png
delete mode 100644 min_unit_tests/HTTP_Encoder/index.php
delete mode 100644 min_unit_tests/README.txt
delete mode 100644 min_unit_tests/_inc.php
delete mode 100644 min_unit_tests/_test_files/css/comments.css
delete mode 100644 min_unit_tests/_test_files/css/comments.min.css
delete mode 100644 min_unit_tests/_test_files/css/hacks.css
delete mode 100644 min_unit_tests/_test_files/css/hacks.min.css
delete mode 100644 min_unit_tests/_test_files/css/issue62.css
delete mode 100644 min_unit_tests/_test_files/css/issue62.min.css
delete mode 100644 min_unit_tests/_test_files/css/paths_prepend.css
delete mode 100644 min_unit_tests/_test_files/css/paths_prepend.min.css
delete mode 100644 min_unit_tests/_test_files/css/paths_rewrite.css
delete mode 100644 min_unit_tests/_test_files/css/paths_rewrite.min.css
delete mode 100644 min_unit_tests/_test_files/css/readme.txt
delete mode 100644 min_unit_tests/_test_files/css/selectors.css
delete mode 100644 min_unit_tests/_test_files/css/selectors.min.css
delete mode 100644 min_unit_tests/_test_files/css/styles.css
delete mode 100644 min_unit_tests/_test_files/css/styles.min.css
delete mode 100644 min_unit_tests/_test_files/css/subsilver.css
delete mode 100644 min_unit_tests/_test_files/css/subsilver.min.css
delete mode 100644 min_unit_tests/_test_files/css/unusual_strings.css
delete mode 100644 min_unit_tests/_test_files/css/unusual_strings.min.css
delete mode 100644 min_unit_tests/_test_files/css/vladmirated.css
delete mode 100644 min_unit_tests/_test_files/css/vladmirated.min.css
delete mode 100644 min_unit_tests/_test_files/css_uriRewriter/exp.css
delete mode 100644 min_unit_tests/_test_files/css_uriRewriter/in.css
delete mode 100644 min_unit_tests/_test_files/html/before.html
delete mode 100644 min_unit_tests/_test_files/html/before.min.html
delete mode 100644 min_unit_tests/_test_files/html/before2.html
delete mode 100644 min_unit_tests/_test_files/html/before2.min.html
delete mode 100644 min_unit_tests/_test_files/importProcessor/1/adjacent.css
delete mode 100644 min_unit_tests/_test_files/importProcessor/1/tv.css
delete mode 100644 min_unit_tests/_test_files/importProcessor/adjacent.css
delete mode 100644 min_unit_tests/_test_files/importProcessor/input.css
delete mode 100644 min_unit_tests/_test_files/importProcessor/output.css
delete mode 100644 min_unit_tests/_test_files/js/before.js
delete mode 100644 min_unit_tests/_test_files/js/before.min.js
delete mode 100644 min_unit_tests/_test_files/js/before.min_plus.js
delete mode 100644 min_unit_tests/_test_files/js/condcomm.js
delete mode 100644 min_unit_tests/_test_files/js/condcomm.min_plus.js
delete mode 100644 min_unit_tests/_test_files/js/issue74.js
delete mode 100644 min_unit_tests/_test_files/js/issue74.min.js
delete mode 100644 min_unit_tests/_test_files/js/issue74.min_plus.js
delete mode 100644 min_unit_tests/_test_files/js/jquery-1.2.3.js
delete mode 100644 min_unit_tests/_test_files/minify/QueryString.js
delete mode 100644 min_unit_tests/_test_files/minify/email.js
delete mode 100644 min_unit_tests/_test_files/minify/issue73_1.js
delete mode 100644 min_unit_tests/_test_files/minify/issue73_2.js
delete mode 100644 min_unit_tests/_test_files/minify/issue89_1.css
delete mode 100644 min_unit_tests/_test_files/minify/issue89_2.css
delete mode 100644 min_unit_tests/_test_files/minify/issue89_out.min.css
delete mode 100644 min_unit_tests/_test_files/minify/lines_bugs.js
delete mode 100644 min_unit_tests/_test_files/minify/lines_output.js
delete mode 100644 min_unit_tests/_test_files/minify/minified.css
delete mode 100644 min_unit_tests/_test_files/minify/minified.js
delete mode 100644 min_unit_tests/test_HTTP_ConditionalGet.php
delete mode 100644 min_unit_tests/test_HTTP_Encoder.php
delete mode 100644 min_unit_tests/test_JSMin.php
delete mode 100644 min_unit_tests/test_JSMinPlus.php
delete mode 100644 min_unit_tests/test_Minify.php
delete mode 100644 min_unit_tests/test_Minify_Build.php
delete mode 100644 min_unit_tests/test_Minify_CSS.php
delete mode 100644 min_unit_tests/test_Minify_CSS_UriRewriter.php
delete mode 100644 min_unit_tests/test_Minify_Cache_APC.php
delete mode 100644 min_unit_tests/test_Minify_Cache_File.php
delete mode 100644 min_unit_tests/test_Minify_Cache_Memcache.php
delete mode 100644 min_unit_tests/test_Minify_CommentPreserver.php
delete mode 100644 min_unit_tests/test_Minify_HTML.php
delete mode 100644 min_unit_tests/test_Minify_ImportProcessor.php
delete mode 100644 min_unit_tests/test_Minify_Lines.php
delete mode 100644 min_unit_tests/test_all.php
delete mode 100644 min_unit_tests/test_environment.php
delete mode 100644 min_unit_tests/test_js_in_browser.html
delete mode 100644 min_unit_tests/test_realpath.php
delete mode 100644 min_unit_tests/test_simpletest.php
delete mode 100644 mincache/.htaccess
delete mode 100644 mincache/.htaccess-dev
delete mode 100644 mincache/README.txt
delete mode 100644 mincache/config.php
delete mode 100644 mincache/gen.php
delete mode 100644 mincache/src/test.css
delete mode 100644 release_2.1.3/HISTORY.txt
delete mode 100644 release_2.1.3/LICENSE.txt
delete mode 100644 release_2.1.3/README.txt
delete mode 100644 release_2.1.3/UPGRADING.txt
delete mode 100644 release_2.1.3/min/.htaccess
delete mode 100644 release_2.1.3/min/README.txt
delete mode 100644 release_2.1.3/min/builder/_index.js
delete mode 100644 release_2.1.3/min/builder/bm.js
delete mode 100644 release_2.1.3/min/builder/index.php
delete mode 100644 release_2.1.3/min/builder/ocCheck.php
delete mode 100644 release_2.1.3/min/builder/rewriteTest.js
delete mode 100644 release_2.1.3/min/config.php
delete mode 100644 release_2.1.3/min/groupsConfig.php
delete mode 100644 release_2.1.3/min/index.php
delete mode 100644 release_2.1.3/min/lib/FirePHP.php
delete mode 100644 release_2.1.3/min/lib/HTTP/ConditionalGet.php
delete mode 100644 release_2.1.3/min/lib/HTTP/Encoder.php
delete mode 100644 release_2.1.3/min/lib/JSMin.php
delete mode 100644 release_2.1.3/min/lib/JSMinPlus.php
delete mode 100644 release_2.1.3/min/lib/Minify.php
delete mode 100644 release_2.1.3/min/lib/Minify/Build.php
delete mode 100644 release_2.1.3/min/lib/Minify/CSS.php
delete mode 100644 release_2.1.3/min/lib/Minify/CSS/Compressor.php
delete mode 100644 release_2.1.3/min/lib/Minify/CSS/UriRewriter.php
delete mode 100644 release_2.1.3/min/lib/Minify/Cache/APC.php
delete mode 100644 release_2.1.3/min/lib/Minify/Cache/File.php
delete mode 100644 release_2.1.3/min/lib/Minify/Cache/Memcache.php
delete mode 100644 release_2.1.3/min/lib/Minify/CommentPreserver.php
delete mode 100644 release_2.1.3/min/lib/Minify/Controller/Base.php
delete mode 100644 release_2.1.3/min/lib/Minify/Controller/Files.php
delete mode 100644 release_2.1.3/min/lib/Minify/Controller/Groups.php
delete mode 100644 release_2.1.3/min/lib/Minify/Controller/MinApp.php
delete mode 100644 release_2.1.3/min/lib/Minify/Controller/Page.php
delete mode 100644 release_2.1.3/min/lib/Minify/Controller/Version1.php
delete mode 100644 release_2.1.3/min/lib/Minify/HTML.php
delete mode 100644 release_2.1.3/min/lib/Minify/ImportProcessor.php
delete mode 100644 release_2.1.3/min/lib/Minify/Lines.php
delete mode 100644 release_2.1.3/min/lib/Minify/Logger.php
delete mode 100644 release_2.1.3/min/lib/Minify/Packer.php
delete mode 100644 release_2.1.3/min/lib/Minify/Source.php
delete mode 100644 release_2.1.3/min/lib/Minify/YUICompressor.php
delete mode 100644 release_2.1.3/min/lib/Solar/Dir.php
delete mode 100644 release_2.1.3/min/utils.php
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_ConditionalGet/2.php
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_ConditionalGet/3.php
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_ConditionalGet/4.php
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_ConditionalGet/5.php
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_ConditionalGet/_include.php
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_ConditionalGet/index.php
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_Encoder/green.png
delete mode 100644 release_2.1.3/min_unit_tests/HTTP_Encoder/index.php
delete mode 100644 release_2.1.3/min_unit_tests/_inc.php
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/comments.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/comments.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/hacks.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/hacks.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/issue62.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/issue62.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/readme.txt
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/selectors.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/selectors.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/styles.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/styles.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/subsilver.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/subsilver.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/vladmirated.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css/vladmirated.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/exp.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/in.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/html/before.html
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/html/before.min.html
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/html/before2.html
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/html/before2.min.html
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/importProcessor/1/adjacent.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/importProcessor/1/tv.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/importProcessor/adjacent.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/importProcessor/input.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/importProcessor/output.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/before.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/before.min.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/before.min_plus.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/condcomm.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/condcomm.min_plus.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/issue74.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/issue74.min.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/issue74.min_plus.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/js/jquery-1.2.3.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/QueryString.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/email.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/issue73_1.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/issue73_2.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/issue89_1.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/issue89_2.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/issue89_out.min.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/lines_bugs.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/lines_output.js
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/minified.css
delete mode 100644 release_2.1.3/min_unit_tests/_test_files/minify/minified.js
delete mode 100644 release_2.1.3/min_unit_tests/test_HTTP_ConditionalGet.php
delete mode 100644 release_2.1.3/min_unit_tests/test_HTTP_Encoder.php
delete mode 100644 release_2.1.3/min_unit_tests/test_JSMin.php
delete mode 100644 release_2.1.3/min_unit_tests/test_JSMinPlus.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_Build.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_CSS.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_CSS_UriRewriter.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_Cache_APC.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_Cache_File.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_Cache_Memcache.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_CommentPreserver.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_HTML.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_ImportProcessor.php
delete mode 100644 release_2.1.3/min_unit_tests/test_Minify_Lines.php
delete mode 100644 release_2.1.3/min_unit_tests/test_all.php
delete mode 100644 release_2.1.3/min_unit_tests/test_environment.php
delete mode 100644 release_2.1.3/min_unit_tests/test_js_in_browser.html
diff --git a/min/.htaccess b/min/.htaccess
deleted file mode 100644
index 42f13eb..0000000
--- a/min/.htaccess
+++ /dev/null
@@ -1,4 +0,0 @@
-
-RewriteEngine on
-RewriteRule ^([a-z]=.*) index.php?$1 [L,NE]
-
\ No newline at end of file
diff --git a/min/README.txt b/min/README.txt
deleted file mode 100644
index ff1a7f1..0000000
--- a/min/README.txt
+++ /dev/null
@@ -1,152 +0,0 @@
-The files in this directory represent the default Minify setup designed to ease
-integration with your site. This app will combine and minify your Javascript or
-CSS files and serve them with HTTP compression and cache headers.
-
-
-RECOMMENDED
-
-It's recommended to edit config.php to set $min_cachePath to a writeable
-(by PHP) directory on your system. This will improve performance.
-
-
-GETTING STARTED
-
-The quickest way to get started is to use the Minify URI Builder application
-on your website: http://example.com/min/builder/
-
-
-MINIFYING A SINGLE FILE
-
-Let's say you want to serve this file:
- http://example.com/wp-content/themes/default/default.css
-
-Here's the "Minify URL" for this file:
- http://example.com/min/?f=wp-content/themes/default/default.css
-
-In other words, the "f" argument is set to the file path from root without the
-initial "/". As CSS files may contain relative URIs, Minify will automatically
-"fix" these by rewriting them as root relative.
-
-
-COMBINING MULTIPLE FILES IN ONE DOWNLOAD
-
-Separate the paths given to "f" with commas.
-
-Let's say you have CSS files at these URLs:
- http://example.com/scripts/jquery-1.2.6.js
- http://example.com/scripts/site.js
-
-You can combine these files through Minify by requesting this URL:
- http://example.com/min/?f=scripts/jquery-1.2.6.js,scripts/site.js
-
-
-SIMPLIFYING URLS WITH A BASE PATH
-
-If you're combining files that share the same ancestor directory, you can use
-the "b" argument to set the base directory for the "f" argument. Do not include
-the leading or trailing "/" characters.
-
-E.g., the following URLs will serve the exact same content:
- http://example.com/min/?f=scripts/jquery-1.2.6.js,scripts/site.js,scripts/home.js
- http://example.com/min/?b=scripts&f=jquery-1.2.6.js,site.js,home.js
-
-
-MINIFY URLS IN HTML
-
-In (X)HTML files, don't forget to replace any "&" characters with "&".
-
-
-SPECIFYING ALLOWED DIRECTORIES
-
-By default, Minify will serve any *.css/*.js files within the DOCUMENT_ROOT. If
-you'd prefer to limit Minify's access to certain directories, set the
-$min_serveOptions['minApp']['allowDirs'] array in config.php. E.g. to limit
-to the /js and /themes/default directories, use:
-
-$min_serveOptions['minApp']['allowDirs'] = array('//js', '//themes/default');
-
-
-GROUPS: SHORTER URLS
-
-For the best performance, edit groupsConfig.php to pre-specify groups of files
-to be combined under preset keys (note: keys should not contain commas). E.g.,
-here's an example configuration in groupsConfig.php:
-
-return array(
- 'js' => array('//js/Class.js', '//js/email.js')
-);
-
-This pre-selects the following files to be combined under the key "js":
- http://example.com/js/Class.js
- http://example.com/js/email.js
-
-You can now serve these files with this simple URL:
- http://example.com/min/?g=js
-
-
-GROUPS: SPECIFYING FILES OUTSIDE THE DOC_ROOT
-
-In the groupsConfig.php array, the "//" in the file paths is a shortcut for
-the DOCUMENT_ROOT, but you can also specify paths from the root of the filesystem
-or relative to the DOC_ROOT:
-
-return array(
- 'js' => array(
- '//js/file.js' // file within DOC_ROOT
- ,'//../file.js' // file in parent directory of DOC_ROOT
- ,'C:/Users/Steve/file.js' // file anywhere on filesystem
- )
-);
-
-
-COMBINING GROUPS AND FILES
-
-In a single URL you can combine multiple groups and files:
- http://example.com/min/?g=js1,js2&f=page1.js
-
-Caveats:
- * Groups always come before files in the output
- E.g. /g=js1&f=page.js == /f=page.js&g=js1
- * Groups will be combined in the order specified.
- E.g. /g=js1,js2 != /g=js2,js1
- * Minify will NOT keep you from trying to combine Javascript and CSS.
- Combining the wrong files will cause an exception in JSMin or break CSS.
-
-
-FAR-FUTURE EXPIRES HEADERS
-
-Minify can send far-future (one year) Expires headers. To enable this you must
-add a number to the querystring (e.g. /min/?g=js&1234 or /min/f=file.js&1234)
-and alter it whenever a source file is changed. If you have a build process you
-can use a build/source control revision number.
-
-If you serve files as groups, you can use the utility function
-Minify_groupUri() to get a "versioned" Minify URI for use in your HTML. E.g.:
-
-";
-
-
-DEBUG MODE
-
-In debug mode, instead of compressing files, Minify sends combined files with
-comments prepended to each line to show the line number in the original source
-file. To enable this, set $min_allowDebugFlag to true in config.php and append
-"&debug=1" to your URIs. E.g. /min/?f=script1.js,script2.js&debug
-
-Known issue: files with comment-like strings/regexps can cause problems in this mode.
-
-
-SEE ALSO
-
-http://code.google.com/p/minify/wiki/CookBook
-
-
-QUESTIONS?
-
-http://code.google.com/p/minify/wiki/CommonProblems
-http://groups.google.com/group/minify
\ No newline at end of file
diff --git a/min/builder/_index.js b/min/builder/_index.js
deleted file mode 100644
index 8e5313a..0000000
--- a/min/builder/_index.js
+++ /dev/null
@@ -1,242 +0,0 @@
-var MUB = {
- _uid : 0
- ,_minRoot : '/min/?'
- ,checkRewrite : function () {
- var testUri = location.pathname.replace(/\/[^\/]*$/, '/rewriteTest.js').substr(1);
- function fail() {
- $('#minRewriteFailed')[0].className = 'topNote';
- };
- $.ajax({
- url : '../f=' + testUri + '&' + (new Date()).getTime()
- ,success : function (data) {
- if (data === '1') {
- MUB._minRoot = '/min/';
- $('span.minRoot').html('/min/');
- } else
- fail();
- }
- ,error : fail
- });
- }
- /**
- * Get markup for new source LI element
- */
- ,newLi : function () {
- return 'http://' + location.host + '/ '
- + ' x ↑ '
- + ' ↓ ';
- }
- /**
- * Add new empty source LI and attach handlers to buttons
- */
- ,addLi : function () {
- $('#sources').append(MUB.newLi());
- var li = $('#li' + MUB._uid)[0];
- $('button[title=Remove]', li).click(function () {
- $('#results').hide();
- var hadValue = !!$('input', li)[0].value;
- $(li).remove();
- });
- $('button[title$=Earlier]', li).click(function () {
- $(li).prev('li').find('input').each(function () {
- $('#results').hide();
- // this = previous li input
- var tmp = this.value;
- this.value = $('input', li).val();
- $('input', li).val(tmp);
- MUB.updateAllTestLinks();
- });
- });
- $('button[title$=Later]', li).click(function () {
- $(li).next('li').find('input').each(function () {
- $('#results').hide();
- // this = next li input
- var tmp = this.value;
- this.value = $('input', li).val();
- $('input', li).val(tmp);
- MUB.updateAllTestLinks();
- });
- });
- ++MUB._uid;
- }
- /**
- * In the context of a source LI element, this will analyze the URI in
- * the INPUT and check the URL on the site.
- */
- ,liUpdateTestLink : function () { // call in context of li element
- if (! $('input', this)[0].value)
- return;
- var li = this;
- $('span', this).html('');
- var url = 'http://' + location.host + '/'
- + $('input', this)[0].value.replace(/^\//, '');
- $.ajax({
- url : url
- ,complete : function (xhr, stat) {
- if ('success' == stat)
- $('span', li).html('✓');
- else {
- $('span', li).html('404! recheck ')
- .find('button').click(function () {
- MUB.liUpdateTestLink.call(li);
- });
- }
- }
- ,dataType : 'text'
- });
- }
- /**
- * Check all source URLs
- */
- ,updateAllTestLinks : function () {
- $('#sources li').each(MUB.liUpdateTestLink);
- }
- /**
- * In a given array of strings, find the character they all have at
- * a particular index
- * @param Array arr array of strings
- * @param Number pos index to check
- * @return mixed a common char or '' if any do not match
- */
- ,getCommonCharAtPos : function (arr, pos) {
- var i
- ,l = arr.length
- ,c = arr[0].charAt(pos);
- if (c === '' || l === 1)
- return c;
- for (i = 1; i < l; ++i)
- if (arr[i].charAt(pos) !== c)
- return '';
- return c;
- }
- /**
- * Get the shortest URI to minify the set of source files
- * @param Array sources URIs
- */
- ,getBestUri : function (sources) {
- var pos = 0
- ,base = ''
- ,c;
- while (true) {
- c = MUB.getCommonCharAtPos(sources, pos);
- if (c === '')
- break;
- else
- base += c;
- ++pos;
- }
- base = base.replace(/[^\/]+$/, '');
- var uri = MUB._minRoot + 'f=' + sources.join(',');
- if (base.charAt(base.length - 1) === '/') {
- // we have a base dir!
- var basedSources = sources
- ,i
- ,l = sources.length;
- for (i = 0; i < l; ++i) {
- basedSources[i] = sources[i].substr(base.length);
- }
- base = base.substr(0, base.length - 1);
- var bUri = MUB._minRoot + 'b=' + base + '&f=' + basedSources.join(',');
- //window.console && console.log([uri, bUri]);
- uri = uri.length < bUri.length
- ? uri
- : bUri;
- }
- return uri;
- }
- /**
- * Create the Minify URI for the sources
- */
- ,update : function () {
- MUB.updateAllTestLinks();
- var sources = []
- ,ext = false
- ,fail = false;
- $('#sources input').each(function () {
- var m, val;
- if (! fail && this.value && (m = this.value.match(/\.(css|js)$/))) {
- var thisExt = m[1];
- if (ext === false)
- ext = thisExt;
- else if (thisExt !== ext) {
- fail = true;
- return alert('extensions must match!');
- }
- this.value = this.value.replace(/^\//, '');
- if (-1 != $.inArray(this.value, sources)) {
- fail = true;
- return alert('duplicate file!');
- }
- sources.push(this.value);
- }
- });
- if (fail || ! sources.length)
- return;
- $('#groupConfig').val(" 'keyName' => array('//" + sources.join("', '//") + "'),");
- var uri = MUB.getBestUri(sources)
- ,uriH = uri.replace(/, '<').replace(/>/, '>').replace(/&/, '&');
- $('#uriA').html(uriH)[0].href = uri;
- $('#uriHtml').val(
- ext === 'js'
- ? ''
- : ' '
- );
- $('#results').show();
- }
- /**
- * Handler for the "Add file +" button
- */
- ,addButtonClick : function () {
- $('#results').hide();
- MUB.addLi();
- MUB.updateAllTestLinks();
- $('#update').show().click(MUB.update);
- $('#sources li:last input')[0].focus();
- }
- /**
- * Runs on DOMready
- */
- ,init : function () {
- $('#app').show();
- $('#sources').html('');
- $('#add button').click(MUB.addButtonClick);
- // make easier to copy text out of
- $('#uriHtml, #groupConfig').click(function () {
- this.select();
- }).focus(function () {
- this.select();
- });
- $('a.ext').attr({target:'_blank'});
- if (location.hash) {
- // make links out of URIs from bookmarklet
- $('#getBm').hide();
- $('#bmUris').html('Found by bookmarklet: /'
- + location.hash.substr(1).split(',').join(' | /')
- + '
'
- );
- $('#bmUris a').click(function () {
- MUB.addButtonClick();
- $('#sources li:last input').val(this.innerHTML)
- MUB.liUpdateTestLink.call($('#sources li:last')[0]);
- $('#results').hide();
- return false;
- }).attr({title:'Add file +'});
- } else {
- // copy bookmarklet code into href
- var bmUri = location.pathname.replace(/\/[^\/]*$/, '/bm.js').substr(1);
- $.ajax({
- url : '../?f=' + bmUri
- ,success : function (code) {
- $('#bm')[0].href = code
- .replace('%BUILDER_URL%', location.href)
- .replace(/\n/g, ' ');
- }
- ,dataType : 'text'
- });
- $.browser.msie && $('#getBm p:last').append(' Sorry, not supported in MSIE!');
- MUB.addButtonClick();
- }
- MUB.checkRewrite();
- }
-};
-window.onload = MUB.init;
\ No newline at end of file
diff --git a/min/builder/bm.js b/min/builder/bm.js
deleted file mode 100644
index 10d1943..0000000
--- a/min/builder/bm.js
+++ /dev/null
@@ -1,36 +0,0 @@
-javascript:(function() {
- var d = document
- ,uris = []
- ,i = 0
- ,o
- ,home = (location + '').split('/').splice(0, 3).join('/') + '/';
- function add(uri) {
- return (0 === uri.indexOf(home))
- && (!/[\?&]/.test(uri))
- && uris.push(escape(uri.substr(home.length)));
- };
- function sheet(ss) {
- // we must check the domain with add() before accessing ss.cssRules
- // otherwise a security exception will be thrown
- if (ss.href && add(ss.href) && ss.cssRules) {
- var i = 0, r;
- while (r = ss.cssRules[i++])
- r.styleSheet && sheet(r.styleSheet);
- }
- };
- while (o = d.getElementsByTagName('script')[i++])
- o.src && !(o.type && /vbs/i.test(o.type)) && add(o.src);
- i = 0;
- while (o = d.styleSheets[i++])
- /* http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html#StyleSheets-DocumentStyle-styleSheets
- document.styleSheet is a list property where [0] accesses the 1st element and
- [outOfRange] returns null. In IE, styleSheets is a function, and also throws an
- exception when you check the out of bounds index. (sigh) */
- sheet(o);
- if (uris.length)
- window.open('%BUILDER_URL%#' + uris.join(','));
- else
- alert('No js/css files found with URLs within "'
- + home.split('/')[2]
- + '".\n(This tool is limited to URLs with the same domain.)');
-})();
\ No newline at end of file
diff --git a/min/builder/index.php b/min/builder/index.php
deleted file mode 100644
index bace9db..0000000
--- a/min/builder/index.php
+++ /dev/null
@@ -1,186 +0,0 @@
-
-
-
-
- Minify URI Builder
-
-
-
-
-Note: Please set $min_cachePath
-in /min/config.php to improve performance.
-
-
-Note: Your webserver does not seem to
- support mod_rewrite (used in /min/.htaccess). Your Minify URIs will contain "?", which
-may reduce the benefit of proxy cache servers .
-
-Minify URI Builder
-
-Javascript and a browser supported by jQuery 1.2.6 is required
-for this application.
-
-
-
-
Create a list of Javascript or CSS files (or 1 is fine) you'd like to combine
-and click [Update].
-
-
-
Add file +
-
-
-
-
Update
-
-
-
-
Minify URI
-
Place this URI in your HTML to serve the files above combined, minified, compressed and
-with cache headers.
-
-
-
How to serve these files as a group
-
For the best performance you can serve these files as a pre-defined group with a URI
-like: /min/? g=keyName
-
To do this, add a line like this to /min/groupsConfig.php:
-
-
return array(
- ... your existing groups here ...
-
-);
-
-
Make sure to replace keyName
with a unique key for this group.
-
-
-
-
Find URIs on a Page
-
You can use the bookmarklet below to fetch all CSS & Javascript URIs from a page
-on your site. When you active it, this page will open in a new window with a list of
-available URIs to add.
-
-
Create Minify URIs (right-click, add to bookmarks)
-
-
-
Combining CSS files that contain @import
-
If your CSS files contain @import
declarations, Minify will not
-remove them. Therefore, you will want to remove those that point to files already
-in your list, and move any others to the top of the first file in your list
-(imports below any styles will be ignored by browsers as invalid).
-
If you desire, you can use Minify URIs in imports and they will not be touched
-by Minify. E.g. @import "/min/? g=css2";
-
-
-
-
-Need help? Search or post to the Minify discussion list .
-This app is minified :) view
-source
-
-
-
-
-
-
- ob_get_contents()
- ,'id' => __FILE__
- ,'lastModifiedTime' => max(
- // regenerate cache if either of these change
- filemtime(__FILE__)
- ,filemtime(dirname(__FILE__) . '/../config.php')
- )
- ,'minifyAll' => true
- ,'encodeOutput' => $encodeOutput
-);
-ob_end_clean();
-
-set_include_path(dirname(__FILE__) . '/../lib' . PATH_SEPARATOR . get_include_path());
-function min_autoload($name) {
- require str_replace('_', DIRECTORY_SEPARATOR, $name) . '.php';
-}
-spl_autoload_register('min_autoload');
-
-//require 'Minify.php';
-
-if (0 === stripos(PHP_OS, 'win')) {
- Minify::setDocRoot(); // we may be on IIS
-}
-Minify::setCache(isset($min_cachePath) ? $min_cachePath : null);
-Minify::$uploaderHoursBehind = $min_uploaderHoursBehind;
-
-Minify::serve('Page', $serveOpts);
diff --git a/min/builder/ocCheck.php b/min/builder/ocCheck.php
deleted file mode 100644
index c47baa3..0000000
--- a/min/builder/ocCheck.php
+++ /dev/null
@@ -1,36 +0,0 @@
- 'World!'
- ,'method' => 'deflate'
- ));
- $he->encode();
- $he->sendAll();
-
-} else {
- // echo status "0" or "1"
- header('Content-Type: text/plain');
- echo (int)$_oc;
-}
diff --git a/min/builder/rewriteTest.js b/min/builder/rewriteTest.js
deleted file mode 100644
index 56a6051..0000000
--- a/min/builder/rewriteTest.js
+++ /dev/null
@@ -1 +0,0 @@
-1
\ No newline at end of file
diff --git a/min/config.php b/min/config.php
deleted file mode 100644
index b8c2592..0000000
--- a/min/config.php
+++ /dev/null
@@ -1,157 +0,0 @@
-
- * array('//symlink' => '/real/target/path') // unix
- * array('//static' => 'D:\\staticStorage') // Windows
- *
- */
-$min_symlinks = array();
-
-
-/**
- * If you upload files from Windows to a non-Windows server, Windows may report
- * incorrect mtimes for the files. This may cause Minify to keep serving stale
- * cache files when source file changes are made too frequently (e.g. more than
- * once an hour).
- *
- * Immediately after modifying and uploading a file, use the touch command to
- * update the mtime on the server. If the mtime jumps ahead by a number of hours,
- * set this variable to that number. If the mtime moves back, this should not be
- * needed.
- *
- * In the Windows SFTP client WinSCP, there's an option that may fix this
- * issue without changing the variable below. Under login > environment,
- * select the option "Adjust remote timestamp with DST".
- * @link http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time
- */
-$min_uploaderHoursBehind = 0;
-
-
-/**
- * Path to Minify's lib folder. If you happen to move it, change
- * this accordingly.
- */
-$min_libPath = dirname(__FILE__) . '/lib';
-
-
-// try to disable output_compression (may not have an effect)
-ini_set('zlib.output_compression', '0');
-ini_set('output_handler', '');
diff --git a/min/groupsConfig.php b/min/groupsConfig.php
deleted file mode 100644
index d85cc23..0000000
--- a/min/groupsConfig.php
+++ /dev/null
@@ -1,38 +0,0 @@
- array('//js/file1.js', '//js/file2.js'),
- // 'css' => array('//css/file1.css', '//css/file2.css'),
-
- // custom source example
- // see http://code.google.com/p/minify/wiki/CustomSource
- /*'js2' => array(
- dirname(__FILE__) . '/../min_unit_tests/_test_files/js/before.js',
- // do NOT process this file
- new Minify_Source(array(
- 'filepath' => dirname(__FILE__) . '/../min_unit_tests/_test_files/js/before.js',
- 'minifier' => ''
- ))
- ),//*/
-
- /*'js3' => array(
- dirname(__FILE__) . '/../min_unit_tests/_test_files/js/before.js',
- // do NOT process this file
- new Minify_Source(array(
- 'filepath' => dirname(__FILE__) . '/../min_unit_tests/_test_files/js/before.js',
- 'minifier' => array('Minify_Packer', 'minify')
- ))
- ),//*/
-
- // testing
- //'js' => array(dirname(__FILE__) . '/builder/_index.js'),
-);
\ No newline at end of file
diff --git a/min/index.php b/min/index.php
deleted file mode 100644
index 331f037..0000000
--- a/min/index.php
+++ /dev/null
@@ -1,71 +0,0 @@
-
- * @license http://www.opensource.org/licenses/bsd-license.php
- * @package FirePHP
- */
-
-
-/**
- * Sends the given data to the FirePHP Firefox Extension.
- * The data can be displayed in the Firebug Console or in the
- * "Server" request tab.
- *
- * For more information see: http://www.firephp.org/
- *
- * @copyright Copyright (C) 2007-2008 Christoph Dorn
- * @author Christoph Dorn
- * @license http://www.opensource.org/licenses/bsd-license.php
- * @package FirePHP
- */
-class FirePHP {
-
- /**
- * FirePHP version
- *
- * @var string
- */
- const VERSION = '0.2.0';
-
- /**
- * Firebug LOG level
- *
- * Logs a message to firebug console.
- *
- * @var string
- */
- const LOG = 'LOG';
-
- /**
- * Firebug INFO level
- *
- * Logs a message to firebug console and displays an info icon before the message.
- *
- * @var string
- */
- const INFO = 'INFO';
-
- /**
- * Firebug WARN level
- *
- * Logs a message to firebug console, displays an warning icon before the message and colors the line turquoise.
- *
- * @var string
- */
- const WARN = 'WARN';
-
- /**
- * Firebug ERROR level
- *
- * Logs a message to firebug console, displays an error icon before the message and colors the line yellow. Also increments the firebug error count.
- *
- * @var string
- */
- const ERROR = 'ERROR';
-
- /**
- * Dumps a variable to firebug's server panel
- *
- * @var string
- */
- const DUMP = 'DUMP';
-
- /**
- * Displays a stack trace in firebug console
- *
- * @var string
- */
- const TRACE = 'TRACE';
-
- /**
- * Displays an exception in firebug console
- *
- * Increments the firebug error count.
- *
- * @var string
- */
- const EXCEPTION = 'EXCEPTION';
-
- /**
- * Displays an table in firebug console
- *
- * @var string
- */
- const TABLE = 'TABLE';
-
- /**
- * Starts a group in firebug console
- *
- * @var string
- */
- const GROUP_START = 'GROUP_START';
-
- /**
- * Ends a group in firebug console
- *
- * @var string
- */
- const GROUP_END = 'GROUP_END';
-
- /**
- * Singleton instance of FirePHP
- *
- * @var FirePHP
- */
- protected static $instance = null;
-
- /**
- * Wildfire protocol message index
- *
- * @var int
- */
- protected $messageIndex = 1;
-
- /**
- * Options for the library
- *
- * @var array
- */
- protected $options = array();
-
- /**
- * Filters used to exclude object members when encoding
- *
- * @var array
- */
- protected $objectFilters = array();
-
- /**
- * A stack of objects used to detect recursion during object encoding
- *
- * @var object
- */
- protected $objectStack = array();
-
- /**
- * Flag to enable/disable logging
- *
- * @var boolean
- */
- protected $enabled = true;
-
- /**
- * The object constructor
- */
- function __construct() {
- $this->options['maxObjectDepth'] = 10;
- $this->options['maxArrayDepth'] = 20;
- $this->options['useNativeJsonEncode'] = true;
- $this->options['includeLineNumbers'] = true;
- }
-
- /**
- * When the object gets serialized only include specific object members.
- *
- * @return array
- */
- public function __sleep() {
- return array('options','objectFilters','enabled');
- }
-
- /**
- * Gets singleton instance of FirePHP
- *
- * @param boolean $AutoCreate
- * @return FirePHP
- */
- public static function getInstance($AutoCreate=false) {
- if($AutoCreate===true && !self::$instance) {
- self::init();
- }
- return self::$instance;
- }
-
- /**
- * Creates FirePHP object and stores it for singleton access
- *
- * @return FirePHP
- */
- public static function init() {
- return self::$instance = new self();
- }
-
- /**
- * Enable and disable logging to Firebug
- *
- * @param boolean $Enabled TRUE to enable, FALSE to disable
- * @return void
- */
- public function setEnabled($Enabled) {
- $this->enabled = $Enabled;
- }
-
- /**
- * Check if logging is enabled
- *
- * @return boolean TRUE if enabled
- */
- public function getEnabled() {
- return $this->enabled;
- }
-
- /**
- * Specify a filter to be used when encoding an object
- *
- * Filters are used to exclude object members.
- *
- * @param string $Class The class name of the object
- * @param array $Filter An array or members to exclude
- * @return void
- */
- public function setObjectFilter($Class, $Filter) {
- $this->objectFilters[$Class] = $Filter;
- }
-
- /**
- * Set some options for the library
- *
- * Options:
- * - maxObjectDepth: The maximum depth to traverse objects (default: 10)
- * - maxArrayDepth: The maximum depth to traverse arrays (default: 20)
- * - useNativeJsonEncode: If true will use json_encode() (default: true)
- * - includeLineNumbers: If true will include line numbers and filenames (default: true)
- *
- * @param array $Options The options to be set
- * @return void
- */
- public function setOptions($Options) {
- $this->options = array_merge($this->options,$Options);
- }
-
- /**
- * Register FirePHP as your error handler
- *
- * Will throw exceptions for each php error.
- */
- public function registerErrorHandler()
- {
- //NOTE: The following errors will not be caught by this error handler:
- // E_ERROR, E_PARSE, E_CORE_ERROR,
- // E_CORE_WARNING, E_COMPILE_ERROR,
- // E_COMPILE_WARNING, E_STRICT
-
- set_error_handler(array($this,'errorHandler'));
- }
-
- /**
- * FirePHP's error handler
- *
- * Throws exception for each php error that will occur.
- *
- * @param int $errno
- * @param string $errstr
- * @param string $errfile
- * @param int $errline
- * @param array $errcontext
- */
- public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext)
- {
- // Don't throw exception if error reporting is switched off
- if (error_reporting() == 0) {
- return;
- }
- // Only throw exceptions for errors we are asking for
- if (error_reporting() & $errno) {
- throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
- }
- }
-
- /**
- * Register FirePHP as your exception handler
- */
- public function registerExceptionHandler()
- {
- set_exception_handler(array($this,'exceptionHandler'));
- }
-
- /**
- * FirePHP's exception handler
- *
- * Logs all exceptions to your firebug console and then stops the script.
- *
- * @param Exception $Exception
- * @throws Exception
- */
- function exceptionHandler($Exception) {
- $this->fb($Exception);
- }
-
- /**
- * Set custom processor url for FirePHP
- *
- * @param string $URL
- */
- public function setProcessorUrl($URL)
- {
- $this->setHeader('X-FirePHP-ProcessorURL', $URL);
- }
-
- /**
- * Set custom renderer url for FirePHP
- *
- * @param string $URL
- */
- public function setRendererUrl($URL)
- {
- $this->setHeader('X-FirePHP-RendererURL', $URL);
- }
-
- /**
- * Start a group for following messages
- *
- * @param string $Name
- * @return true
- * @throws Exception
- */
- public function group($Name) {
- return $this->fb(null, $Name, FirePHP::GROUP_START);
- }
-
- /**
- * Ends a group you have started before
- *
- * @return true
- * @throws Exception
- */
- public function groupEnd() {
- return $this->fb(null, null, FirePHP::GROUP_END);
- }
-
- /**
- * Log object with label to firebug console
- *
- * @see FirePHP::LOG
- * @param mixes $Object
- * @param string $Label
- * @return true
- * @throws Exception
- */
- public function log($Object, $Label=null) {
- return $this->fb($Object, $Label, FirePHP::LOG);
- }
-
- /**
- * Log object with label to firebug console
- *
- * @see FirePHP::INFO
- * @param mixes $Object
- * @param string $Label
- * @return true
- * @throws Exception
- */
- public function info($Object, $Label=null) {
- return $this->fb($Object, $Label, FirePHP::INFO);
- }
-
- /**
- * Log object with label to firebug console
- *
- * @see FirePHP::WARN
- * @param mixes $Object
- * @param string $Label
- * @return true
- * @throws Exception
- */
- public function warn($Object, $Label=null) {
- return $this->fb($Object, $Label, FirePHP::WARN);
- }
-
- /**
- * Log object with label to firebug console
- *
- * @see FirePHP::ERROR
- * @param mixes $Object
- * @param string $Label
- * @return true
- * @throws Exception
- */
- public function error($Object, $Label=null) {
- return $this->fb($Object, $Label, FirePHP::ERROR);
- }
-
- /**
- * Dumps key and variable to firebug server panel
- *
- * @see FirePHP::DUMP
- * @param string $Key
- * @param mixed $Variable
- * @return true
- * @throws Exception
- */
- public function dump($Key, $Variable) {
- return $this->fb($Variable, $Key, FirePHP::DUMP);
- }
-
- /**
- * Log a trace in the firebug console
- *
- * @see FirePHP::TRACE
- * @param string $Label
- * @return true
- * @throws Exception
- */
- public function trace($Label) {
- return $this->fb($Label, FirePHP::TRACE);
- }
-
- /**
- * Log a table in the firebug console
- *
- * @see FirePHP::TABLE
- * @param string $Label
- * @param string $Table
- * @return true
- * @throws Exception
- */
- public function table($Label, $Table) {
- return $this->fb($Table, $Label, FirePHP::TABLE);
- }
-
- /**
- * Check if FirePHP is installed on client
- *
- * @return boolean
- */
- public function detectClientExtension() {
- /* Check if FirePHP is installed on client */
- if(!@preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si',$this->getUserAgent(),$m) ||
- !version_compare($m[1][0],'0.0.6','>=')) {
- return false;
- }
- return true;
- }
-
- /**
- * Log varible to Firebug
- *
- * @see http://www.firephp.org/Wiki/Reference/Fb
- * @param mixed $Object The variable to be logged
- * @return true Return TRUE if message was added to headers, FALSE otherwise
- * @throws Exception
- */
- public function fb($Object) {
-
- if(!$this->enabled) {
- return false;
- }
-
- if (headers_sent($filename, $linenum)) {
- throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
- }
-
- $Type = null;
- $Label = null;
-
- if(func_num_args()==1) {
- } else
- if(func_num_args()==2) {
- switch(func_get_arg(1)) {
- case self::LOG:
- case self::INFO:
- case self::WARN:
- case self::ERROR:
- case self::DUMP:
- case self::TRACE:
- case self::EXCEPTION:
- case self::TABLE:
- case self::GROUP_START:
- case self::GROUP_END:
- $Type = func_get_arg(1);
- break;
- default:
- $Label = func_get_arg(1);
- break;
- }
- } else
- if(func_num_args()==3) {
- $Type = func_get_arg(2);
- $Label = func_get_arg(1);
- } else {
- throw $this->newException('Wrong number of arguments to fb() function!');
- }
-
-
- if(!$this->detectClientExtension()) {
- return false;
- }
-
- $meta = array();
- $skipFinalObjectEncode = false;
-
- if($Object instanceof Exception) {
-
- $meta['file'] = $this->_escapeTraceFile($Object->getFile());
- $meta['line'] = $Object->getLine();
-
- $trace = $Object->getTrace();
- if($Object instanceof ErrorException
- && isset($trace[0]['function'])
- && $trace[0]['function']=='errorHandler'
- && isset($trace[0]['class'])
- && $trace[0]['class']=='FirePHP') {
-
- $severity = false;
- switch($Object->getSeverity()) {
- case E_WARNING: $severity = 'E_WARNING'; break;
- case E_NOTICE: $severity = 'E_NOTICE'; break;
- case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
- case E_USER_WARNING: $severity = 'E_USER_WARNING'; break;
- case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break;
- case E_STRICT: $severity = 'E_STRICT'; break;
- case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break;
- case E_DEPRECATED: $severity = 'E_DEPRECATED'; break;
- case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break;
- }
-
- $Object = array('Class'=>get_class($Object),
- 'Message'=>$severity.': '.$Object->getMessage(),
- 'File'=>$this->_escapeTraceFile($Object->getFile()),
- 'Line'=>$Object->getLine(),
- 'Type'=>'trigger',
- 'Trace'=>$this->_escapeTrace(array_splice($trace,2)));
- $skipFinalObjectEncode = true;
- } else {
- $Object = array('Class'=>get_class($Object),
- 'Message'=>$Object->getMessage(),
- 'File'=>$this->_escapeTraceFile($Object->getFile()),
- 'Line'=>$Object->getLine(),
- 'Type'=>'throw',
- 'Trace'=>$this->_escapeTrace($trace));
- $skipFinalObjectEncode = true;
- }
- $Type = self::EXCEPTION;
-
- } else
- if($Type==self::TRACE) {
-
- $trace = debug_backtrace();
- if(!$trace) return false;
- for( $i=0 ; $i_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
- || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
- /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
- } else
- if(isset($trace[$i]['class'])
- && isset($trace[$i+1]['file'])
- && $trace[$i]['class']=='FirePHP'
- && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
- /* Skip fb() */
- } else
- if($trace[$i]['function']=='fb'
- || $trace[$i]['function']=='trace'
- || $trace[$i]['function']=='send') {
- $Object = array('Class'=>isset($trace[$i]['class'])?$trace[$i]['class']:'',
- 'Type'=>isset($trace[$i]['type'])?$trace[$i]['type']:'',
- 'Function'=>isset($trace[$i]['function'])?$trace[$i]['function']:'',
- 'Message'=>$trace[$i]['args'][0],
- 'File'=>isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'',
- 'Line'=>isset($trace[$i]['line'])?$trace[$i]['line']:'',
- 'Args'=>isset($trace[$i]['args'])?$this->encodeObject($trace[$i]['args']):'',
- 'Trace'=>$this->_escapeTrace(array_splice($trace,$i+1)));
-
- $skipFinalObjectEncode = true;
- $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
- $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
- break;
- }
- }
-
- } else
- if($Type==self::TABLE) {
-
- if(isset($Object[0]) && is_string($Object[0])) {
- $Object[1] = $this->encodeTable($Object[1]);
- } else {
- $Object = $this->encodeTable($Object);
- }
-
- $skipFinalObjectEncode = true;
-
- } else {
- if($Type===null) {
- $Type = self::LOG;
- }
- }
-
- if($this->options['includeLineNumbers']) {
- if(!isset($meta['file']) || !isset($meta['line'])) {
-
- $trace = debug_backtrace();
- for( $i=0 ; $trace && $i_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
- || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
- /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
- } else
- if(isset($trace[$i]['class'])
- && isset($trace[$i+1]['file'])
- && $trace[$i]['class']=='FirePHP'
- && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
- /* Skip fb() */
- } else
- if(isset($trace[$i]['file'])
- && substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php') {
- /* Skip FB::fb() */
- } else {
- $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
- $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
- break;
- }
- }
-
- }
- } else {
- unset($meta['file']);
- unset($meta['line']);
- }
-
- $this->setHeader('X-Wf-Protocol-1','http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
- $this->setHeader('X-Wf-1-Plugin-1','http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/'.self::VERSION);
-
- $structure_index = 1;
- if($Type==self::DUMP) {
- $structure_index = 2;
- $this->setHeader('X-Wf-1-Structure-2','http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1');
- } else {
- $this->setHeader('X-Wf-1-Structure-1','http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
- }
-
- if($Type==self::DUMP) {
- $msg = '{"'.$Label.'":'.$this->jsonEncode($Object, $skipFinalObjectEncode).'}';
- } else {
- $msg_meta = array('Type'=>$Type);
- if($Label!==null) {
- $msg_meta['Label'] = $Label;
- }
- if(isset($meta['file'])) {
- $msg_meta['File'] = $meta['file'];
- }
- if(isset($meta['line'])) {
- $msg_meta['Line'] = $meta['line'];
- }
- $msg = '['.$this->jsonEncode($msg_meta).','.$this->jsonEncode($Object, $skipFinalObjectEncode).']';
- }
-
- $parts = explode("\n",chunk_split($msg, 5000, "\n"));
-
- for( $i=0 ; $i2) {
- // Message needs to be split into multiple parts
- $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
- (($i==0)?strlen($msg):'')
- . '|' . $part . '|'
- . (($isetHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
- strlen($part) . '|' . $part . '|');
- }
-
- $this->messageIndex++;
-
- if ($this->messageIndex > 99999) {
- throw new Exception('Maximum number (99,999) of messages reached!');
- }
- }
- }
-
- $this->setHeader('X-Wf-1-Index',$this->messageIndex-1);
-
- return true;
- }
-
- /**
- * Standardizes path for windows systems.
- *
- * @param string $Path
- * @return string
- */
- protected function _standardizePath($Path) {
- return preg_replace('/\\\\+/','/',$Path);
- }
-
- /**
- * Escape trace path for windows systems
- *
- * @param array $Trace
- * @return array
- */
- protected function _escapeTrace($Trace) {
- if(!$Trace) return $Trace;
- for( $i=0 ; $i_escapeTraceFile($Trace[$i]['file']);
- }
- if(isset($Trace[$i]['args'])) {
- $Trace[$i]['args'] = $this->encodeObject($Trace[$i]['args']);
- }
- }
- return $Trace;
- }
-
- /**
- * Escape file information of trace for windows systems
- *
- * @param string $File
- * @return string
- */
- protected function _escapeTraceFile($File) {
- /* Check if we have a windows filepath */
- if(strpos($File,'\\')) {
- /* First strip down to single \ */
-
- $file = preg_replace('/\\\\+/','\\',$File);
-
- return $file;
- }
- return $File;
- }
-
- /**
- * Send header
- *
- * @param string $Name
- * @param string_type $Value
- */
- protected function setHeader($Name, $Value) {
- return header($Name.': '.$Value);
- }
-
- /**
- * Get user agent
- *
- * @return string|false
- */
- protected function getUserAgent() {
- if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
- return $_SERVER['HTTP_USER_AGENT'];
- }
-
- /**
- * Returns a new exception
- *
- * @param string $Message
- * @return Exception
- */
- protected function newException($Message) {
- return new Exception($Message);
- }
-
- /**
- * Encode an object into a JSON string
- *
- * Uses PHP's jeson_encode() if available
- *
- * @param object $Object The object to be encoded
- * @return string The JSON string
- */
- protected function jsonEncode($Object, $skipObjectEncode=false)
- {
- if(!$skipObjectEncode) {
- $Object = $this->encodeObject($Object);
- }
-
- if(function_exists('json_encode')
- && $this->options['useNativeJsonEncode']!=false) {
-
- return json_encode($Object);
- } else {
- return $this->json_encode($Object);
- }
- }
-
- /**
- * Encodes a table by encoding each row and column with encodeObject()
- *
- * @param array $Table The table to be encoded
- * @return array
- */
- protected function encodeTable($Table) {
- if(!$Table) return $Table;
- for( $i=0 ; $iencodeObject($Table[$i][$j]);
- }
- }
- }
- return $Table;
- }
-
- /**
- * Encodes an object including members with
- * protected and private visibility
- *
- * @param Object $Object The object to be encoded
- * @param int $Depth The current traversal depth
- * @return array All members of the object
- */
- protected function encodeObject($Object, $ObjectDepth = 1, $ArrayDepth = 1)
- {
- $return = array();
-
- if (is_object($Object)) {
-
- if ($ObjectDepth > $this->options['maxObjectDepth']) {
- return '** Max Object Depth ('.$this->options['maxObjectDepth'].') **';
- }
-
- foreach ($this->objectStack as $refVal) {
- if ($refVal === $Object) {
- return '** Recursion ('.get_class($Object).') **';
- }
- }
- array_push($this->objectStack, $Object);
-
- $return['__className'] = $class = get_class($Object);
-
- $reflectionClass = new ReflectionClass($class);
- $properties = array();
- foreach( $reflectionClass->getProperties() as $property) {
- $properties[$property->getName()] = $property;
- }
-
- $members = (array)$Object;
-
- foreach( $properties as $raw_name => $property ) {
-
- $name = $raw_name;
- if($property->isStatic()) {
- $name = 'static:'.$name;
- }
- if($property->isPublic()) {
- $name = 'public:'.$name;
- } else
- if($property->isPrivate()) {
- $name = 'private:'.$name;
- $raw_name = "\0".$class."\0".$raw_name;
- } else
- if($property->isProtected()) {
- $name = 'protected:'.$name;
- $raw_name = "\0".'*'."\0".$raw_name;
- }
-
- if(!(isset($this->objectFilters[$class])
- && is_array($this->objectFilters[$class])
- && in_array($raw_name,$this->objectFilters[$class]))) {
-
- if(array_key_exists($raw_name,$members)
- && !$property->isStatic()) {
-
- $return[$name] = $this->encodeObject($members[$raw_name], $ObjectDepth + 1, 1);
-
- } else {
- if(method_exists($property,'setAccessible')) {
- $property->setAccessible(true);
- $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
- } else
- if($property->isPublic()) {
- $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
- } else {
- $return[$name] = '** Need PHP 5.3 to get value **';
- }
- }
- } else {
- $return[$name] = '** Excluded by Filter **';
- }
- }
-
- // Include all members that are not defined in the class
- // but exist in the object
- foreach( $members as $raw_name => $value ) {
-
- $name = $raw_name;
-
- if ($name{0} == "\0") {
- $parts = explode("\0", $name);
- $name = $parts[2];
- }
-
- if(!isset($properties[$name])) {
- $name = 'undeclared:'.$name;
-
- if(!(isset($this->objectFilters[$class])
- && is_array($this->objectFilters[$class])
- && in_array($raw_name,$this->objectFilters[$class]))) {
-
- $return[$name] = $this->encodeObject($value, $ObjectDepth + 1, 1);
- } else {
- $return[$name] = '** Excluded by Filter **';
- }
- }
- }
-
- array_pop($this->objectStack);
-
- } elseif (is_array($Object)) {
-
- if ($ArrayDepth > $this->options['maxArrayDepth']) {
- return '** Max Array Depth ('.$this->options['maxArrayDepth'].') **';
- }
-
- foreach ($Object as $key => $val) {
-
- // Encoding the $GLOBALS PHP array causes an infinite loop
- // if the recursion is not reset here as it contains
- // a reference to itself. This is the only way I have come up
- // with to stop infinite recursion in this case.
- if($key=='GLOBALS'
- && is_array($val)
- && array_key_exists('GLOBALS',$val)) {
- $val['GLOBALS'] = '** Recursion (GLOBALS) **';
- }
-
- $return[$key] = $this->encodeObject($val, 1, $ArrayDepth + 1);
- }
- } else {
- if(self::is_utf8($Object)) {
- return $Object;
- } else {
- return utf8_encode($Object);
- }
- }
- return $return;
- }
-
- /**
- * Returns true if $string is valid UTF-8 and false otherwise.
- *
- * @param mixed $str String to be tested
- * @return boolean
- */
- protected static function is_utf8($str) {
- $c=0; $b=0;
- $bits=0;
- $len=strlen($str);
- for($i=0; $i<$len; $i++){
- $c=ord($str[$i]);
- if($c > 128){
- if(($c >= 254)) return false;
- elseif($c >= 252) $bits=6;
- elseif($c >= 248) $bits=5;
- elseif($c >= 240) $bits=4;
- elseif($c >= 224) $bits=3;
- elseif($c >= 192) $bits=2;
- else return false;
- if(($i+$bits) > $len) return false;
- while($bits > 1){
- $i++;
- $b=ord($str[$i]);
- if($b < 128 || $b > 191) return false;
- $bits--;
- }
- }
- }
- return true;
- }
-
- /**
- * Converts to and from JSON format.
- *
- * JSON (JavaScript Object Notation) is a lightweight data-interchange
- * format. It is easy for humans to read and write. It is easy for machines
- * to parse and generate. It is based on a subset of the JavaScript
- * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
- * This feature can also be found in Python. JSON is a text format that is
- * completely language independent but uses conventions that are familiar
- * to programmers of the C-family of languages, including C, C++, C#, Java,
- * JavaScript, Perl, TCL, and many others. These properties make JSON an
- * ideal data-interchange language.
- *
- * This package provides a simple encoder and decoder for JSON notation. It
- * is intended for use with client-side Javascript applications that make
- * use of HTTPRequest to perform server communication functions - data can
- * be encoded into JSON notation for use in a client-side javascript, or
- * decoded from incoming Javascript requests. JSON format is native to
- * Javascript, and can be directly eval()'ed with no further parsing
- * overhead
- *
- * All strings should be in ASCII or UTF-8 format!
- *
- * LICENSE: Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met: Redistributions of source code must retain the
- * above copyright notice, this list of conditions and the following
- * disclaimer. Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
- * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * @category
- * @package Services_JSON
- * @author Michal Migurski
- * @author Matt Knapp
- * @author Brett Stimmerman
- * @author Christoph Dorn
- * @copyright 2005 Michal Migurski
- * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
- * @license http://www.opensource.org/licenses/bsd-license.php
- * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
- */
-
-
- /**
- * Keep a list of objects as we descend into the array so we can detect recursion.
- */
- private $json_objectStack = array();
-
-
- /**
- * convert a string from one UTF-8 char to one UTF-16 char
- *
- * Normally should be handled by mb_convert_encoding, but
- * provides a slower PHP-only method for installations
- * that lack the multibye string extension.
- *
- * @param string $utf8 UTF-8 character
- * @return string UTF-16 character
- * @access private
- */
- private function json_utf82utf16($utf8)
- {
- // oh please oh please oh please oh please oh please
- if(function_exists('mb_convert_encoding')) {
- return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
- }
-
- switch(strlen($utf8)) {
- case 1:
- // this case should never be reached, because we are in ASCII range
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return $utf8;
-
- case 2:
- // return a UTF-16 character from a 2-byte UTF-8 char
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return chr(0x07 & (ord($utf8{0}) >> 2))
- . chr((0xC0 & (ord($utf8{0}) << 6))
- | (0x3F & ord($utf8{1})));
-
- case 3:
- // return a UTF-16 character from a 3-byte UTF-8 char
- // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- return chr((0xF0 & (ord($utf8{0}) << 4))
- | (0x0F & (ord($utf8{1}) >> 2)))
- . chr((0xC0 & (ord($utf8{1}) << 6))
- | (0x7F & ord($utf8{2})));
- }
-
- // ignoring UTF-32 for now, sorry
- return '';
- }
-
- /**
- * encodes an arbitrary variable into JSON format
- *
- * @param mixed $var any number, boolean, string, array, or object to be encoded.
- * see argument 1 to Services_JSON() above for array-parsing behavior.
- * if var is a strng, note that encode() always expects it
- * to be in ASCII or UTF-8 format!
- *
- * @return mixed JSON string representation of input var or an error if a problem occurs
- * @access public
- */
- private function json_encode($var)
- {
-
- if(is_object($var)) {
- if(in_array($var,$this->json_objectStack)) {
- return '"** Recursion **"';
- }
- }
-
- switch (gettype($var)) {
- case 'boolean':
- return $var ? 'true' : 'false';
-
- case 'NULL':
- return 'null';
-
- case 'integer':
- return (int) $var;
-
- case 'double':
- case 'float':
- return (float) $var;
-
- case 'string':
- // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
- $ascii = '';
- $strlen_var = strlen($var);
-
- /*
- * Iterate over every character in the string,
- * escaping with a slash or encoding to UTF-8 where necessary
- */
- for ($c = 0; $c < $strlen_var; ++$c) {
-
- $ord_var_c = ord($var{$c});
-
- switch (true) {
- case $ord_var_c == 0x08:
- $ascii .= '\b';
- break;
- case $ord_var_c == 0x09:
- $ascii .= '\t';
- break;
- case $ord_var_c == 0x0A:
- $ascii .= '\n';
- break;
- case $ord_var_c == 0x0C:
- $ascii .= '\f';
- break;
- case $ord_var_c == 0x0D:
- $ascii .= '\r';
- break;
-
- case $ord_var_c == 0x22:
- case $ord_var_c == 0x2F:
- case $ord_var_c == 0x5C:
- // double quote, slash, slosh
- $ascii .= '\\'.$var{$c};
- break;
-
- case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
- // characters U-00000000 - U-0000007F (same as ASCII)
- $ascii .= $var{$c};
- break;
-
- case (($ord_var_c & 0xE0) == 0xC0):
- // characters U-00000080 - U-000007FF, mask 110XXXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
- $c += 1;
- $utf16 = $this->json_utf82utf16($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xF0) == 0xE0):
- // characters U-00000800 - U-0000FFFF, mask 1110XXXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}));
- $c += 2;
- $utf16 = $this->json_utf82utf16($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xF8) == 0xF0):
- // characters U-00010000 - U-001FFFFF, mask 11110XXX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}),
- ord($var{$c + 3}));
- $c += 3;
- $utf16 = $this->json_utf82utf16($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xFC) == 0xF8):
- // characters U-00200000 - U-03FFFFFF, mask 111110XX
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}),
- ord($var{$c + 3}),
- ord($var{$c + 4}));
- $c += 4;
- $utf16 = $this->json_utf82utf16($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
-
- case (($ord_var_c & 0xFE) == 0xFC):
- // characters U-04000000 - U-7FFFFFFF, mask 1111110X
- // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
- $char = pack('C*', $ord_var_c,
- ord($var{$c + 1}),
- ord($var{$c + 2}),
- ord($var{$c + 3}),
- ord($var{$c + 4}),
- ord($var{$c + 5}));
- $c += 5;
- $utf16 = $this->json_utf82utf16($char);
- $ascii .= sprintf('\u%04s', bin2hex($utf16));
- break;
- }
- }
-
- return '"'.$ascii.'"';
-
- case 'array':
- /*
- * As per JSON spec if any array key is not an integer
- * we must treat the the whole array as an object. We
- * also try to catch a sparsely populated associative
- * array with numeric keys here because some JS engines
- * will create an array with empty indexes up to
- * max_index which can cause memory issues and because
- * the keys, which may be relevant, will be remapped
- * otherwise.
- *
- * As per the ECMA and JSON specification an object may
- * have any string as a property. Unfortunately due to
- * a hole in the ECMA specification if the key is a
- * ECMA reserved word or starts with a digit the
- * parameter is only accessible using ECMAScript's
- * bracket notation.
- */
-
- // treat as a JSON object
- if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
-
- $this->json_objectStack[] = $var;
-
- $properties = array_map(array($this, 'json_name_value'),
- array_keys($var),
- array_values($var));
-
- array_pop($this->json_objectStack);
-
- foreach($properties as $property) {
- if($property instanceof Exception) {
- return $property;
- }
- }
-
- return '{' . join(',', $properties) . '}';
- }
-
- $this->json_objectStack[] = $var;
-
- // treat it like a regular array
- $elements = array_map(array($this, 'json_encode'), $var);
-
- array_pop($this->json_objectStack);
-
- foreach($elements as $element) {
- if($element instanceof Exception) {
- return $element;
- }
- }
-
- return '[' . join(',', $elements) . ']';
-
- case 'object':
- $vars = self::encodeObject($var);
-
- $this->json_objectStack[] = $var;
-
- $properties = array_map(array($this, 'json_name_value'),
- array_keys($vars),
- array_values($vars));
-
- array_pop($this->json_objectStack);
-
- foreach($properties as $property) {
- if($property instanceof Exception) {
- return $property;
- }
- }
-
- return '{' . join(',', $properties) . '}';
-
- default:
- return null;
- }
- }
-
- /**
- * array-walking function for use in generating JSON-formatted name-value pairs
- *
- * @param string $name name of key to use
- * @param mixed $value reference to an array element to be encoded
- *
- * @return string JSON-formatted name-value pair, like '"name":value'
- * @access private
- */
- private function json_name_value($name, $value)
- {
- // Encoding the $GLOBALS PHP array causes an infinite loop
- // if the recursion is not reset here as it contains
- // a reference to itself. This is the only way I have come up
- // with to stop infinite recursion in this case.
- if($name=='GLOBALS'
- && is_array($value)
- && array_key_exists('GLOBALS',$value)) {
- $value['GLOBALS'] = '** Recursion **';
- }
-
- $encoded_value = $this->json_encode($value);
-
- if($encoded_value instanceof Exception) {
- return $encoded_value;
- }
-
- return $this->json_encode(strval($name)) . ':' . $encoded_value;
- }
-}
diff --git a/min/lib/HTTP/ConditionalGet.php b/min/lib/HTTP/ConditionalGet.php
deleted file mode 100644
index 823db05..0000000
--- a/min/lib/HTTP/ConditionalGet.php
+++ /dev/null
@@ -1,348 +0,0 @@
-
- * list($updateTime, $content) = getDbUpdateAndContent();
- * $cg = new HTTP_ConditionalGet(array(
- * 'lastModifiedTime' => $updateTime
- * ,'isPublic' => true
- * ));
- * $cg->sendHeaders();
- * if ($cg->cacheIsValid) {
- * exit();
- * }
- * echo $content;
- *
- *
- * E.g. Shortcut for the above
- *
- * HTTP_ConditionalGet::check($updateTime, true); // exits if client has cache
- * echo $content;
- *
- *
- * E.g. Content from DB with no update time:
- *
- * $content = getContentFromDB();
- * $cg = new HTTP_ConditionalGet(array(
- * 'contentHash' => md5($content)
- * ));
- * $cg->sendHeaders();
- * if ($cg->cacheIsValid) {
- * exit();
- * }
- * echo $content;
- *
- *
- * E.g. Static content with some static includes:
- *
- * // before content
- * $cg = new HTTP_ConditionalGet(array(
- * 'lastUpdateTime' => max(
- * filemtime(__FILE__)
- * ,filemtime('/path/to/header.inc')
- * ,filemtime('/path/to/footer.inc')
- * )
- * ));
- * $cg->sendHeaders();
- * if ($cg->cacheIsValid) {
- * exit();
- * }
- *
- * @package Minify
- * @subpackage HTTP
- * @author Stephen Clay
- */
-class HTTP_ConditionalGet {
-
- /**
- * Does the client have a valid copy of the requested resource?
- *
- * You'll want to check this after instantiating the object. If true, do
- * not send content, just call sendHeaders() if you haven't already.
- *
- * @var bool
- */
- public $cacheIsValid = null;
-
- /**
- * @param array $spec options
- *
- * 'isPublic': (bool) if true, the Cache-Control header will contain
- * "public", allowing proxies to cache the content. Otherwise "private" will
- * be sent, allowing only browser caching. (default false)
- *
- * 'lastModifiedTime': (int) if given, both ETag AND Last-Modified headers
- * will be sent with content. This is recommended.
- *
- * 'encoding': (string) if set, the header "Vary: Accept-Encoding" will
- * always be sent and a truncated version of the encoding will be appended
- * to the ETag. E.g. "pub123456;gz". This will also trigger a more lenient
- * checking of the client's If-None-Match header, as the encoding portion of
- * the ETag will be stripped before comparison.
- *
- * 'contentHash': (string) if given, only the ETag header can be sent with
- * content (only HTTP1.1 clients can conditionally GET). The given string
- * should be short with no quote characters and always change when the
- * resource changes (recommend md5()). This is not needed/used if
- * lastModifiedTime is given.
- *
- * 'eTag': (string) if given, this will be used as the ETag header rather
- * than values based on lastModifiedTime or contentHash. Also the encoding
- * string will not be appended to the given value as described above.
- *
- * 'invalidate': (bool) if true, the client cache will be considered invalid
- * without testing. Effectively this disables conditional GET.
- * (default false)
- *
- * 'maxAge': (int) if given, this will set the Cache-Control max-age in
- * seconds, and also set the Expires header to the equivalent GMT date.
- * After the max-age period has passed, the browser will again send a
- * conditional GET to revalidate its cache.
- *
- * @return null
- */
- public function __construct($spec)
- {
- $scope = (isset($spec['isPublic']) && $spec['isPublic'])
- ? 'public'
- : 'private';
- $maxAge = 0;
- // backwards compatibility (can be removed later)
- if (isset($spec['setExpires'])
- && is_numeric($spec['setExpires'])
- && ! isset($spec['maxAge'])) {
- $spec['maxAge'] = $spec['setExpires'] - $_SERVER['REQUEST_TIME'];
- }
- if (isset($spec['maxAge'])) {
- $maxAge = $spec['maxAge'];
- $this->_headers['Expires'] = self::gmtDate(
- $_SERVER['REQUEST_TIME'] + $spec['maxAge']
- );
- }
- $etagAppend = '';
- if (isset($spec['encoding'])) {
- $this->_stripEtag = true;
- $this->_headers['Vary'] = 'Accept-Encoding';
- if ('' !== $spec['encoding']) {
- if (0 === strpos($spec['encoding'], 'x-')) {
- $spec['encoding'] = substr($spec['encoding'], 2);
- }
- $etagAppend = ';' . substr($spec['encoding'], 0, 2);
- }
- }
- if (isset($spec['lastModifiedTime'])) {
- $this->_setLastModified($spec['lastModifiedTime']);
- if (isset($spec['eTag'])) { // Use it
- $this->_setEtag($spec['eTag'], $scope);
- } else { // base both headers on time
- $this->_setEtag($spec['lastModifiedTime'] . $etagAppend, $scope);
- }
- } elseif (isset($spec['eTag'])) { // Use it
- $this->_setEtag($spec['eTag'], $scope);
- } elseif (isset($spec['contentHash'])) { // Use the hash as the ETag
- $this->_setEtag($spec['contentHash'] . $etagAppend, $scope);
- }
- $this->_headers['Cache-Control'] = "max-age={$maxAge}, {$scope}";
- // invalidate cache if disabled, otherwise check
- $this->cacheIsValid = (isset($spec['invalidate']) && $spec['invalidate'])
- ? false
- : $this->_isCacheValid();
- }
-
- /**
- * Get array of output headers to be sent
- *
- * In the case of 304 responses, this array will only contain the response
- * code header: array('_responseCode' => 'HTTP/1.0 304 Not Modified')
- *
- * Otherwise something like:
- *
- * array(
- * 'Cache-Control' => 'max-age=0, public'
- * ,'ETag' => '"foobar"'
- * )
- *
- *
- * @return array
- */
- public function getHeaders()
- {
- return $this->_headers;
- }
-
- /**
- * Set the Content-Length header in bytes
- *
- * With most PHP configs, as long as you don't flush() output, this method
- * is not needed and PHP will buffer all output and set Content-Length for
- * you. Otherwise you'll want to call this to let the client know up front.
- *
- * @param int $bytes
- *
- * @return int copy of input $bytes
- */
- public function setContentLength($bytes)
- {
- return $this->_headers['Content-Length'] = $bytes;
- }
-
- /**
- * Send headers
- *
- * @see getHeaders()
- *
- * Note this doesn't "clear" the headers. Calling sendHeaders() will
- * call header() again (but probably have not effect) and getHeaders() will
- * still return the headers.
- *
- * @return null
- */
- public function sendHeaders()
- {
- $headers = $this->_headers;
- if (array_key_exists('_responseCode', $headers)) {
- header($headers['_responseCode']);
- unset($headers['_responseCode']);
- }
- foreach ($headers as $name => $val) {
- header($name . ': ' . $val);
- }
- }
-
- /**
- * Exit if the client's cache is valid for this resource
- *
- * This is a convenience method for common use of the class
- *
- * @param int $lastModifiedTime if given, both ETag AND Last-Modified headers
- * will be sent with content. This is recommended.
- *
- * @param bool $isPublic (default false) if true, the Cache-Control header
- * will contain "public", allowing proxies to cache the content. Otherwise
- * "private" will be sent, allowing only browser caching.
- *
- * @param array $options (default empty) additional options for constructor
- *
- * @return null
- */
- public static function check($lastModifiedTime = null, $isPublic = false, $options = array())
- {
- if (null !== $lastModifiedTime) {
- $options['lastModifiedTime'] = (int)$lastModifiedTime;
- }
- $options['isPublic'] = (bool)$isPublic;
- $cg = new HTTP_ConditionalGet($options);
- $cg->sendHeaders();
- if ($cg->cacheIsValid) {
- exit();
- }
- }
-
-
- /**
- * Get a GMT formatted date for use in HTTP headers
- *
- *
- * header('Expires: ' . HTTP_ConditionalGet::gmtdate($time));
- *
- *
- * @param int $time unix timestamp
- *
- * @return string
- */
- public static function gmtDate($time)
- {
- return gmdate('D, d M Y H:i:s \G\M\T', $time);
- }
-
- protected $_headers = array();
- protected $_lmTime = null;
- protected $_etag = null;
- protected $_stripEtag = false;
-
- protected function _setEtag($hash, $scope)
- {
- $this->_etag = '"' . substr($scope, 0, 3) . $hash . '"';
- $this->_headers['ETag'] = $this->_etag;
- }
-
- protected function _setLastModified($time)
- {
- $this->_lmTime = (int)$time;
- $this->_headers['Last-Modified'] = self::gmtDate($time);
- }
-
- /**
- * Determine validity of client cache and queue 304 header if valid
- */
- protected function _isCacheValid()
- {
- if (null === $this->_etag) {
- // lmTime is copied to ETag, so this condition implies that the
- // server sent neither ETag nor Last-Modified, so the client can't
- // possibly has a valid cache.
- return false;
- }
- $isValid = ($this->resourceMatchedEtag() || $this->resourceNotModified());
- if ($isValid) {
- $this->_headers['_responseCode'] = 'HTTP/1.0 304 Not Modified';
- }
- return $isValid;
- }
-
- protected function resourceMatchedEtag()
- {
- if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
- return false;
- }
- $clientEtagList = get_magic_quotes_gpc()
- ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])
- : $_SERVER['HTTP_IF_NONE_MATCH'];
- $clientEtags = explode(',', $clientEtagList);
-
- $compareTo = $this->normalizeEtag($this->_etag);
- foreach ($clientEtags as $clientEtag) {
- if ($this->normalizeEtag($clientEtag) === $compareTo) {
- // respond with the client's matched ETag, even if it's not what
- // we would've sent by default
- $this->_headers['ETag'] = trim($clientEtag);
- return true;
- }
- }
- return false;
- }
-
- protected function normalizeEtag($etag) {
- $etag = trim($etag);
- return $this->_stripEtag
- ? preg_replace('/;\\w\\w"$/', '"', $etag)
- : $etag;
- }
-
- protected function resourceNotModified()
- {
- if (!isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
- return false;
- }
- $ifModifiedSince = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
- if (false !== ($semicolon = strrpos($ifModifiedSince, ';'))) {
- // IE has tacked on extra data to this header, strip it
- $ifModifiedSince = substr($ifModifiedSince, 0, $semicolon);
- }
- if ($ifModifiedSince == self::gmtDate($this->_lmTime)) {
- // Apache 2.2's behavior. If there was no ETag match, send the
- // non-encoded version of the ETag value.
- $this->_headers['ETag'] = $this->normalizeEtag($this->_etag);
- return true;
- }
- return false;
- }
-}
diff --git a/min/lib/HTTP/Encoder.php b/min/lib/HTTP/Encoder.php
deleted file mode 100644
index 66c2678..0000000
--- a/min/lib/HTTP/Encoder.php
+++ /dev/null
@@ -1,326 +0,0 @@
-
- * // Send a CSS file, compressed if possible
- * $he = new HTTP_Encoder(array(
- * 'content' => file_get_contents($cssFile)
- * ,'type' => 'text/css'
- * ));
- * $he->encode();
- * $he->sendAll();
- *
- *
- *
- * // Shortcut to encoding output
- * header('Content-Type: text/css'); // needed if not HTML
- * HTTP_Encoder::output($css);
- *
- *
- *
- * // Just sniff for the accepted encoding
- * $encoding = HTTP_Encoder::getAcceptedEncoding();
- *
- *
- * For more control over headers, use getHeaders() and getData() and send your
- * own output.
- *
- * Note: If you don't need header mgmt, use PHP's native gzencode, gzdeflate,
- * and gzcompress functions for gzip, deflate, and compress-encoding
- * respectively.
- *
- * @package Minify
- * @subpackage HTTP
- * @author Stephen Clay
- */
-class HTTP_Encoder {
-
- /**
- * Should the encoder allow HTTP encoding to IE6?
- *
- * If you have many IE6 users and the bandwidth savings is worth troubling
- * some of them, set this to true.
- *
- * By default, encoding is only offered to IE7+. When this is true,
- * getAcceptedEncoding() will return an encoding for IE6 if its user agent
- * string contains "SV1". This has been documented in many places as "safe",
- * but there seem to be remaining, intermittent encoding bugs in patched
- * IE6 on the wild web.
- *
- * @var bool
- */
- public static $encodeToIe6 = false;
-
-
- /**
- * Default compression level for zlib operations
- *
- * This level is used if encode() is not given a $compressionLevel
- *
- * @var int
- */
- public static $compressionLevel = 6;
-
-
- /**
- * Get an HTTP Encoder object
- *
- * @param array $spec options
- *
- * 'content': (string required) content to be encoded
- *
- * 'type': (string) if set, the Content-Type header will have this value.
- *
- * 'method: (string) only set this if you are forcing a particular encoding
- * method. If not set, the best method will be chosen by getAcceptedEncoding()
- * The available methods are 'gzip', 'deflate', 'compress', and '' (no
- * encoding)
- *
- * @return null
- */
- public function __construct($spec)
- {
- $this->_content = $spec['content'];
- $this->_headers['Content-Length'] = (string)strlen($this->_content);
- if (isset($spec['type'])) {
- $this->_headers['Content-Type'] = $spec['type'];
- }
- if (isset($spec['method'])
- && in_array($spec['method'], array('gzip', 'deflate', 'compress', '')))
- {
- $this->_encodeMethod = array($spec['method'], $spec['method']);
- } else {
- $this->_encodeMethod = self::getAcceptedEncoding();
- }
- }
-
- /**
- * Get content in current form
- *
- * Call after encode() for encoded content.
- *
- * return string
- */
- public function getContent()
- {
- return $this->_content;
- }
-
- /**
- * Get array of output headers to be sent
- *
- * E.g.
- *
- * array(
- * 'Content-Length' => '615'
- * ,'Content-Encoding' => 'x-gzip'
- * ,'Vary' => 'Accept-Encoding'
- * )
- *
- *
- * @return array
- */
- public function getHeaders()
- {
- return $this->_headers;
- }
-
- /**
- * Send output headers
- *
- * You must call this before headers are sent and it probably cannot be
- * used in conjunction with zlib output buffering / mod_gzip. Errors are
- * not handled purposefully.
- *
- * @see getHeaders()
- *
- * @return null
- */
- public function sendHeaders()
- {
- foreach ($this->_headers as $name => $val) {
- header($name . ': ' . $val);
- }
- }
-
- /**
- * Send output headers and content
- *
- * A shortcut for sendHeaders() and echo getContent()
- *
- * You must call this before headers are sent and it probably cannot be
- * used in conjunction with zlib output buffering / mod_gzip. Errors are
- * not handled purposefully.
- *
- * @return null
- */
- public function sendAll()
- {
- $this->sendHeaders();
- echo $this->_content;
- }
-
- /**
- * Determine the client's best encoding method from the HTTP Accept-Encoding
- * header.
- *
- * If no Accept-Encoding header is set, or the browser is IE before v6 SP2,
- * this will return ('', ''), the "identity" encoding.
- *
- * A syntax-aware scan is done of the Accept-Encoding, so the method must
- * be non 0. The methods are favored in order of gzip, deflate, then
- * compress. Deflate is always smallest and generally faster, but is
- * rarely sent by servers, so client support could be buggier.
- *
- * @param bool $allowCompress allow the older compress encoding
- *
- * @param bool $allowDeflate allow the more recent deflate encoding
- *
- * @return array two values, 1st is the actual encoding method, 2nd is the
- * alias of that method to use in the Content-Encoding header (some browsers
- * call gzip "x-gzip" etc.)
- */
- public static function getAcceptedEncoding($allowCompress = true, $allowDeflate = true)
- {
- // @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
-
- if (! isset($_SERVER['HTTP_ACCEPT_ENCODING'])
- || self::_isBuggyIe())
- {
- return array('', '');
- }
- $ae = $_SERVER['HTTP_ACCEPT_ENCODING'];
- // gzip checks (quick)
- if (0 === strpos($ae, 'gzip,') // most browsers
- || 0 === strpos($ae, 'deflate, gzip,') // opera
- ) {
- return array('gzip', 'gzip');
- }
- // gzip checks (slow)
- if (preg_match(
- '@(?:^|,)\\s*((?:x-)?gzip)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@'
- ,$ae
- ,$m)) {
- return array('gzip', $m[1]);
- }
- if ($allowDeflate) {
- // deflate checks
- $aeRev = strrev($ae);
- if (0 === strpos($aeRev, 'etalfed ,') // ie, webkit
- || 0 === strpos($aeRev, 'etalfed,') // gecko
- || 0 === strpos($ae, 'deflate,') // opera
- // slow parsing
- || preg_match(
- '@(?:^|,)\\s*deflate\\s*(?:$|,|;\\s*q=(?:0\\.|1))@', $ae)) {
- return array('deflate', 'deflate');
- }
- }
- if ($allowCompress && preg_match(
- '@(?:^|,)\\s*((?:x-)?compress)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@'
- ,$ae
- ,$m)) {
- return array('compress', $m[1]);
- }
- return array('', '');
- }
-
- /**
- * Encode (compress) the content
- *
- * If the encode method is '' (none) or compression level is 0, or the 'zlib'
- * extension isn't loaded, we return false.
- *
- * Then the appropriate gz_* function is called to compress the content. If
- * this fails, false is returned.
- *
- * The header "Vary: Accept-Encoding" is added. If encoding is successful,
- * the Content-Length header is updated, and Content-Encoding is also added.
- *
- * @param int $compressionLevel given to zlib functions. If not given, the
- * class default will be used.
- *
- * @return bool success true if the content was actually compressed
- */
- public function encode($compressionLevel = null)
- {
- $this->_headers['Vary'] = 'Accept-Encoding';
- if (null === $compressionLevel) {
- $compressionLevel = self::$compressionLevel;
- }
- if ('' === $this->_encodeMethod[0]
- || ($compressionLevel == 0)
- || !extension_loaded('zlib'))
- {
- return false;
- }
- if ($this->_encodeMethod[0] === 'deflate') {
- $encoded = gzdeflate($this->_content, $compressionLevel);
- } elseif ($this->_encodeMethod[0] === 'gzip') {
- $encoded = gzencode($this->_content, $compressionLevel);
- } else {
- $encoded = gzcompress($this->_content, $compressionLevel);
- }
- if (false === $encoded) {
- return false;
- }
- $this->_headers['Content-Length'] = strlen($encoded);
- $this->_headers['Content-Encoding'] = $this->_encodeMethod[1];
- $this->_content = $encoded;
- return true;
- }
-
- /**
- * Encode and send appropriate headers and content
- *
- * This is a convenience method for common use of the class
- *
- * @param string $content
- *
- * @param int $compressionLevel given to zlib functions. If not given, the
- * class default will be used.
- *
- * @return bool success true if the content was actually compressed
- */
- public static function output($content, $compressionLevel = null)
- {
- if (null === $compressionLevel) {
- $compressionLevel = self::$compressionLevel;
- }
- $he = new HTTP_Encoder(array('content' => $content));
- $ret = $he->encode($compressionLevel);
- $he->sendAll();
- return $ret;
- }
-
- protected $_content = '';
- protected $_headers = array();
- protected $_encodeMethod = array('', '');
-
- /**
- * Is the browser an IE version earlier than 6 SP2?
- */
- protected static function _isBuggyIe()
- {
- $ua = $_SERVER['HTTP_USER_AGENT'];
- // quick escape for non-IEs
- if (0 !== strpos($ua, 'Mozilla/4.0 (compatible; MSIE ')
- || false !== strpos($ua, 'Opera')) {
- return false;
- }
- // no regex = faaast
- $version = (float)substr($ua, 30);
- return self::$encodeToIe6
- ? ($version < 6 || ($version == 6 && false === strpos($ua, 'SV1')))
- : ($version < 7);
- }
-}
diff --git a/min/lib/JSMin.php b/min/lib/JSMin.php
deleted file mode 100644
index 770e1c6..0000000
--- a/min/lib/JSMin.php
+++ /dev/null
@@ -1,314 +0,0 @@
- (PHP port)
- * @author Steve Clay (modifications + cleanup)
- * @author Andrea Giammarchi (spaceBeforeRegExp)
- * @copyright 2002 Douglas Crockford (jsmin.c)
- * @copyright 2008 Ryan Grove (PHP port)
- * @license http://opensource.org/licenses/mit-license.php MIT License
- * @link http://code.google.com/p/jsmin-php/
- */
-
-class JSMin {
- const ORD_LF = 10;
- const ORD_SPACE = 32;
- const ACTION_KEEP_A = 1;
- const ACTION_DELETE_A = 2;
- const ACTION_DELETE_A_B = 3;
-
- protected $a = "\n";
- protected $b = '';
- protected $input = '';
- protected $inputIndex = 0;
- protected $inputLength = 0;
- protected $lookAhead = null;
- protected $output = '';
-
- /**
- * Minify Javascript
- *
- * @param string $js Javascript to be minified
- * @return string
- */
- public static function minify($js)
- {
- $jsmin = new JSMin($js);
- return $jsmin->min();
- }
-
- /**
- * Setup process
- */
- public function __construct($input)
- {
- $this->input = str_replace("\r\n", "\n", $input);
- $this->inputLength = strlen($this->input);
- }
-
- /**
- * Perform minification, return result
- */
- public function min()
- {
- if ($this->output !== '') { // min already run
- return $this->output;
- }
- $this->action(self::ACTION_DELETE_A_B);
-
- while ($this->a !== null) {
- // determine next command
- $command = self::ACTION_KEEP_A; // default
- if ($this->a === ' ') {
- if (! $this->isAlphaNum($this->b)) {
- $command = self::ACTION_DELETE_A;
- }
- } elseif ($this->a === "\n") {
- if ($this->b === ' ') {
- $command = self::ACTION_DELETE_A_B;
- } elseif (false === strpos('{[(+-', $this->b)
- && ! $this->isAlphaNum($this->b)) {
- $command = self::ACTION_DELETE_A;
- }
- } elseif (! $this->isAlphaNum($this->a)) {
- if ($this->b === ' '
- || ($this->b === "\n"
- && (false === strpos('}])+-"\'', $this->a)))) {
- $command = self::ACTION_DELETE_A_B;
- }
- }
- $this->action($command);
- }
- $this->output = trim($this->output);
- return $this->output;
- }
-
- /**
- * ACTION_KEEP_A = Output A. Copy B to A. Get the next B.
- * ACTION_DELETE_A = Copy B to A. Get the next B.
- * ACTION_DELETE_A_B = Get the next B.
- */
- protected function action($command)
- {
- switch ($command) {
- case self::ACTION_KEEP_A:
- $this->output .= $this->a;
- // fallthrough
- case self::ACTION_DELETE_A:
- $this->a = $this->b;
- if ($this->a === "'" || $this->a === '"') { // string literal
- $str = $this->a; // in case needed for exception
- while (true) {
- $this->output .= $this->a;
- $this->a = $this->get();
- if ($this->a === $this->b) { // end quote
- break;
- }
- if (ord($this->a) <= self::ORD_LF) {
- throw new JSMin_UnterminatedStringException(
- 'Unterminated String: ' . var_export($str, true));
- }
- $str .= $this->a;
- if ($this->a === '\\') {
- $this->output .= $this->a;
- $this->a = $this->get();
- $str .= $this->a;
- }
- }
- }
- // fallthrough
- case self::ACTION_DELETE_A_B:
- $this->b = $this->next();
- if ($this->b === '/' && $this->isRegexpLiteral()) { // RegExp literal
- $this->output .= $this->a . $this->b;
- $pattern = '/'; // in case needed for exception
- while (true) {
- $this->a = $this->get();
- $pattern .= $this->a;
- if ($this->a === '/') { // end pattern
- break; // while (true)
- } elseif ($this->a === '\\') {
- $this->output .= $this->a;
- $this->a = $this->get();
- $pattern .= $this->a;
- } elseif (ord($this->a) <= self::ORD_LF) {
- throw new JSMin_UnterminatedRegExpException(
- 'Unterminated RegExp: '. var_export($pattern, true));
- }
- $this->output .= $this->a;
- }
- $this->b = $this->next();
- }
- // end case ACTION_DELETE_A_B
- }
- }
-
- protected function isRegexpLiteral()
- {
- if (false !== strpos("\n{;(,=:[!&|?", $this->a)) { // we aren't dividing
- return true;
- }
- if (' ' === $this->a) {
- $length = strlen($this->output);
- if ($length < 2) { // weird edge case
- return true;
- }
- // you can't divide a keyword
- if (preg_match('/(?:case|else|in|return|typeof)$/', $this->output, $m)) {
- if ($this->output === $m[0]) { // odd but could happen
- return true;
- }
- // make sure it's a keyword, not end of an identifier
- $charBeforeKeyword = substr($this->output, $length - strlen($m[0]) - 1, 1);
- if (! $this->isAlphaNum($charBeforeKeyword)) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Get next char. Convert ctrl char to space.
- */
- protected function get()
- {
- $c = $this->lookAhead;
- $this->lookAhead = null;
- if ($c === null) {
- if ($this->inputIndex < $this->inputLength) {
- $c = $this->input[$this->inputIndex];
- $this->inputIndex += 1;
- } else {
- return null;
- }
- }
- if ($c === "\r" || $c === "\n") {
- return "\n";
- }
- if (ord($c) < self::ORD_SPACE) { // control char
- return ' ';
- }
- return $c;
- }
-
- /**
- * Get next char. If is ctrl character, translate to a space or newline.
- */
- protected function peek()
- {
- $this->lookAhead = $this->get();
- return $this->lookAhead;
- }
-
- /**
- * Is $c a letter, digit, underscore, dollar sign, escape, or non-ASCII?
- */
- protected function isAlphaNum($c)
- {
- return (preg_match('/^[0-9a-zA-Z_\\$\\\\]$/', $c) || ord($c) > 126);
- }
-
- protected function singleLineComment()
- {
- $comment = '';
- while (true) {
- $get = $this->get();
- $comment .= $get;
- if (ord($get) <= self::ORD_LF) { // EOL reached
- // if IE conditional comment
- if (preg_match('/^\\/@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
- return "/{$comment}";
- }
- return $get;
- }
- }
- }
-
- protected function multipleLineComment()
- {
- $this->get();
- $comment = '';
- while (true) {
- $get = $this->get();
- if ($get === '*') {
- if ($this->peek() === '/') { // end of comment reached
- $this->get();
- // if comment preserved by YUI Compressor
- if (0 === strpos($comment, '!')) {
- return "\n/*" . substr($comment, 1) . "*/\n";
- }
- // if IE conditional comment
- if (preg_match('/^@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
- return "/*{$comment}*/";
- }
- return ' ';
- }
- } elseif ($get === null) {
- throw new JSMin_UnterminatedCommentException('Unterminated Comment: ' . var_export('/*' . $comment, true));
- }
- $comment .= $get;
- }
- }
-
- /**
- * Get the next character, skipping over comments.
- * Some comments may be preserved.
- */
- protected function next()
- {
- $get = $this->get();
- if ($get !== '/') {
- return $get;
- }
- switch ($this->peek()) {
- case '/': return $this->singleLineComment();
- case '*': return $this->multipleLineComment();
- default: return $get;
- }
- }
-}
-
-class JSMin_UnterminatedStringException extends Exception {}
-class JSMin_UnterminatedCommentException extends Exception {}
-class JSMin_UnterminatedRegExpException extends Exception {}
diff --git a/min/lib/JSMinPlus.php b/min/lib/JSMinPlus.php
deleted file mode 100644
index 4afa43a..0000000
--- a/min/lib/JSMinPlus.php
+++ /dev/null
@@ -1,1980 +0,0 @@
-
- *
- * Usage: $minified = JSMinPlus::minify($script [, $filename])
- *
- * Versionlog (see also changelog.txt):
- * 17-05-2009 - fixed hook:colon precedence, fixed empty body in loop and if-constructs
- * 18-04-2009 - fixed crashbug in PHP 5.2.9 and several other bugfixes
- * 12-04-2009 - some small bugfixes and performance improvements
- * 09-04-2009 - initial open sourced version 1.0
- *
- * Latest version of this script: http://files.tweakers.net/jsminplus/jsminplus.zip
- *
- */
-
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Narcissus JavaScript engine.
- *
- * The Initial Developer of the Original Code is
- * Brendan Eich .
- * Portions created by the Initial Developer are Copyright (C) 2004
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s): Tino Zijdel
- * PHP port, modifications and minifier routine are (C) 2009
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-define('TOKEN_END', 1);
-define('TOKEN_NUMBER', 2);
-define('TOKEN_IDENTIFIER', 3);
-define('TOKEN_STRING', 4);
-define('TOKEN_REGEXP', 5);
-define('TOKEN_NEWLINE', 6);
-define('TOKEN_CONDCOMMENT_START', 7);
-define('TOKEN_CONDCOMMENT_END', 8);
-
-define('JS_SCRIPT', 100);
-define('JS_BLOCK', 101);
-define('JS_LABEL', 102);
-define('JS_FOR_IN', 103);
-define('JS_CALL', 104);
-define('JS_NEW_WITH_ARGS', 105);
-define('JS_INDEX', 106);
-define('JS_ARRAY_INIT', 107);
-define('JS_OBJECT_INIT', 108);
-define('JS_PROPERTY_INIT', 109);
-define('JS_GETTER', 110);
-define('JS_SETTER', 111);
-define('JS_GROUP', 112);
-define('JS_LIST', 113);
-
-define('DECLARED_FORM', 0);
-define('EXPRESSED_FORM', 1);
-define('STATEMENT_FORM', 2);
-
-class JSMinPlus
-{
- private $parser;
- private $reserved = array(
- 'break', 'case', 'catch', 'continue', 'default', 'delete', 'do',
- 'else', 'finally', 'for', 'function', 'if', 'in', 'instanceof',
- 'new', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'var',
- 'void', 'while', 'with',
- // Words reserved for future use
- 'abstract', 'boolean', 'byte', 'char', 'class', 'const', 'debugger',
- 'double', 'enum', 'export', 'extends', 'final', 'float', 'goto',
- 'implements', 'import', 'int', 'interface', 'long', 'native',
- 'package', 'private', 'protected', 'public', 'short', 'static',
- 'super', 'synchronized', 'throws', 'transient', 'volatile',
- // These are not reserved, but should be taken into account
- // in isValidIdentifier (See jslint source code)
- 'arguments', 'eval', 'true', 'false', 'Infinity', 'NaN', 'null', 'undefined'
- );
-
- private function __construct()
- {
- $this->parser = new JSParser();
- }
-
- public static function minify($js, $filename='')
- {
- static $instance;
-
- // this is a singleton
- if(!$instance)
- $instance = new JSMinPlus();
-
- return $instance->min($js, $filename);
- }
-
- private function min($js, $filename)
- {
- try
- {
- $n = $this->parser->parse($js, $filename, 1);
- return $this->parseTree($n);
- }
- catch(Exception $e)
- {
- echo $e->getMessage() . "\n";
- }
-
- return false;
- }
-
- private function parseTree($n, $noBlockGrouping = false)
- {
- $s = '';
-
- switch ($n->type)
- {
- case KEYWORD_FUNCTION:
- $s .= 'function' . ($n->name ? ' ' . $n->name : '') . '(';
- $params = $n->params;
- for ($i = 0, $j = count($params); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $params[$i];
- $s .= '){' . $this->parseTree($n->body, true) . '}';
- break;
-
- case JS_SCRIPT:
- // we do nothing with funDecls or varDecls
- $noBlockGrouping = true;
- // FALL THROUGH
-
- case JS_BLOCK:
- $childs = $n->treeNodes;
- $lastType = 0;
- for ($c = 0, $i = 0, $j = count($childs); $i < $j; $i++)
- {
- $type = $childs[$i]->type;
- $t = $this->parseTree($childs[$i]);
- if (strlen($t))
- {
- if ($c)
- {
- $s = rtrim($s, ';');
-
- if ($type == KEYWORD_FUNCTION && $childs[$i]->functionForm == DECLARED_FORM)
- {
- // put declared functions on a new line
- $s .= "\n";
- }
- elseif ($type == KEYWORD_VAR && $type == $lastType)
- {
- // mutiple var-statements can go into one
- $t = ',' . substr($t, 4);
- }
- else
- {
- // add terminator
- $s .= ';';
- }
- }
-
- $s .= $t;
-
- $c++;
- $lastType = $type;
- }
- }
-
- if ($c > 1 && !$noBlockGrouping)
- {
- $s = '{' . $s . '}';
- }
- break;
-
- case KEYWORD_IF:
- $s = 'if(' . $this->parseTree($n->condition) . ')';
- $thenPart = $this->parseTree($n->thenPart);
- $elsePart = $n->elsePart ? $this->parseTree($n->elsePart) : null;
-
- // empty if-statement
- if ($thenPart == '')
- $thenPart = ';';
-
- if ($elsePart)
- {
- // be carefull and always make a block out of the thenPart; could be more optimized but is a lot of trouble
- if ($thenPart != ';' && $thenPart[0] != '{')
- $thenPart = '{' . $thenPart . '}';
-
- $s .= $thenPart . 'else';
-
- // we could check for more, but that hardly ever applies so go for performance
- if ($elsePart[0] != '{')
- $s .= ' ';
-
- $s .= $elsePart;
- }
- else
- {
- $s .= $thenPart;
- }
- break;
-
- case KEYWORD_SWITCH:
- $s = 'switch(' . $this->parseTree($n->discriminant) . '){';
- $cases = $n->cases;
- for ($i = 0, $j = count($cases); $i < $j; $i++)
- {
- $case = $cases[$i];
- if ($case->type == KEYWORD_CASE)
- $s .= 'case' . ($case->caseLabel->type != TOKEN_STRING ? ' ' : '') . $this->parseTree($case->caseLabel) . ':';
- else
- $s .= 'default:';
-
- $statement = $this->parseTree($case->statements, true);
- if ($statement)
- {
- $s .= $statement;
- // no terminator for last statement
- if ($i + 1 < $j)
- $s .= ';';
- }
- }
- $s .= '}';
- break;
-
- case KEYWORD_FOR:
- $s = 'for(' . ($n->setup ? $this->parseTree($n->setup) : '')
- . ';' . ($n->condition ? $this->parseTree($n->condition) : '')
- . ';' . ($n->update ? $this->parseTree($n->update) : '') . ')';
-
- $body = $this->parseTree($n->body);
- if ($body == '')
- $body = ';';
-
- $s .= $body;
- break;
-
- case KEYWORD_WHILE:
- $s = 'while(' . $this->parseTree($n->condition) . ')';
-
- $body = $this->parseTree($n->body);
- if ($body == '')
- $body = ';';
-
- $s .= $body;
- break;
-
- case JS_FOR_IN:
- $s = 'for(' . ($n->varDecl ? $this->parseTree($n->varDecl) : $this->parseTree($n->iterator)) . ' in ' . $this->parseTree($n->object) . ')';
-
- $body = $this->parseTree($n->body);
- if ($body == '')
- $body = ';';
-
- $s .= $body;
- break;
-
- case KEYWORD_DO:
- $s = 'do{' . $this->parseTree($n->body, true) . '}while(' . $this->parseTree($n->condition) . ')';
- break;
-
- case KEYWORD_BREAK:
- case KEYWORD_CONTINUE:
- $s = $n->value . ($n->label ? ' ' . $n->label : '');
- break;
-
- case KEYWORD_TRY:
- $s = 'try{' . $this->parseTree($n->tryBlock, true) . '}';
- $catchClauses = $n->catchClauses;
- for ($i = 0, $j = count($catchClauses); $i < $j; $i++)
- {
- $t = $catchClauses[$i];
- $s .= 'catch(' . $t->varName . ($t->guard ? ' if ' . $this->parseTree($t->guard) : '') . '){' . $this->parseTree($t->block, true) . '}';
- }
- if ($n->finallyBlock)
- $s .= 'finally{' . $this->parseTree($n->finallyBlock, true) . '}';
- break;
-
- case KEYWORD_THROW:
- $s = 'throw ' . $this->parseTree($n->exception);
- break;
-
- case KEYWORD_RETURN:
- $s = 'return';
- if ($n->value)
- {
- $t = $this->parseTree($n->value);
- if (strlen($t))
- {
- if ( $t[0] != '(' && $t[0] != '[' && $t[0] != '{' &&
- $t[0] != '"' && $t[0] != "'" && $t[0] != '/'
- )
- $s .= ' ';
-
- $s .= $t;
- }
- }
- break;
-
- case KEYWORD_WITH:
- $s = 'with(' . $this->parseTree($n->object) . ')' . $this->parseTree($n->body);
- break;
-
- case KEYWORD_VAR:
- case KEYWORD_CONST:
- $s = $n->value . ' ';
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- {
- $t = $childs[$i];
- $s .= ($i ? ',' : '') . $t->name;
- $u = $t->initializer;
- if ($u)
- $s .= '=' . $this->parseTree($u);
- }
- break;
-
- case KEYWORD_DEBUGGER:
- throw new Exception('NOT IMPLEMENTED: DEBUGGER');
- break;
-
- case TOKEN_CONDCOMMENT_START:
- case TOKEN_CONDCOMMENT_END:
- $s = $n->value . ($n->type == TOKEN_CONDCOMMENT_START ? ' ' : '');
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- $s .= $this->parseTree($childs[$i]);
- break;
-
- case OP_SEMICOLON:
- if ($expression = $n->expression)
- $s = $this->parseTree($expression);
- break;
-
- case JS_LABEL:
- $s = $n->label . ':' . $this->parseTree($n->statement);
- break;
-
- case OP_COMMA:
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
- break;
-
- case OP_ASSIGN:
- $s = $this->parseTree($n->treeNodes[0]) . $n->value . $this->parseTree($n->treeNodes[1]);
- break;
-
- case OP_HOOK:
- $s = $this->parseTree($n->treeNodes[0]) . '?' . $this->parseTree($n->treeNodes[1]) . ':' . $this->parseTree($n->treeNodes[2]);
- break;
-
- case OP_OR: case OP_AND:
- case OP_BITWISE_OR: case OP_BITWISE_XOR: case OP_BITWISE_AND:
- case OP_EQ: case OP_NE: case OP_STRICT_EQ: case OP_STRICT_NE:
- case OP_LT: case OP_LE: case OP_GE: case OP_GT:
- case OP_LSH: case OP_RSH: case OP_URSH:
- case OP_MUL: case OP_DIV: case OP_MOD:
- $s = $this->parseTree($n->treeNodes[0]) . $n->type . $this->parseTree($n->treeNodes[1]);
- break;
-
- case OP_PLUS:
- case OP_MINUS:
- $left = $this->parseTree($n->treeNodes[0]);
- $right = $this->parseTree($n->treeNodes[1]);
-
- switch ($n->treeNodes[1]->type)
- {
- case OP_PLUS:
- case OP_MINUS:
- case OP_INCREMENT:
- case OP_DECREMENT:
- case OP_UNARY_PLUS:
- case OP_UNARY_MINUS:
- $s = $left . $n->type . ' ' . $right;
- break;
-
- case TOKEN_STRING:
- //combine concatted strings with same quotestyle
- if ($n->type == OP_PLUS && substr($left, -1) == $right[0])
- {
- $s = substr($left, 0, -1) . substr($right, 1);
- break;
- }
- // FALL THROUGH
-
- default:
- $s = $left . $n->type . $right;
- }
- break;
-
- case KEYWORD_IN:
- $s = $this->parseTree($n->treeNodes[0]) . ' in ' . $this->parseTree($n->treeNodes[1]);
- break;
-
- case KEYWORD_INSTANCEOF:
- $s = $this->parseTree($n->treeNodes[0]) . ' instanceof ' . $this->parseTree($n->treeNodes[1]);
- break;
-
- case KEYWORD_DELETE:
- $s = 'delete ' . $this->parseTree($n->treeNodes[0]);
- break;
-
- case KEYWORD_VOID:
- $s = 'void(' . $this->parseTree($n->treeNodes[0]) . ')';
- break;
-
- case KEYWORD_TYPEOF:
- $s = 'typeof ' . $this->parseTree($n->treeNodes[0]);
- break;
-
- case OP_NOT:
- case OP_BITWISE_NOT:
- case OP_UNARY_PLUS:
- case OP_UNARY_MINUS:
- $s = $n->value . $this->parseTree($n->treeNodes[0]);
- break;
-
- case OP_INCREMENT:
- case OP_DECREMENT:
- if ($n->postfix)
- $s = $this->parseTree($n->treeNodes[0]) . $n->value;
- else
- $s = $n->value . $this->parseTree($n->treeNodes[0]);
- break;
-
- case OP_DOT:
- $s = $this->parseTree($n->treeNodes[0]) . '.' . $this->parseTree($n->treeNodes[1]);
- break;
-
- case JS_INDEX:
- $s = $this->parseTree($n->treeNodes[0]);
- // See if we can replace named index with a dot saving 3 bytes
- if ( $n->treeNodes[0]->type == TOKEN_IDENTIFIER &&
- $n->treeNodes[1]->type == TOKEN_STRING &&
- $this->isValidIdentifier(substr($n->treeNodes[1]->value, 1, -1))
- )
- $s .= '.' . substr($n->treeNodes[1]->value, 1, -1);
- else
- $s .= '[' . $this->parseTree($n->treeNodes[1]) . ']';
- break;
-
- case JS_LIST:
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
- break;
-
- case JS_CALL:
- $s = $this->parseTree($n->treeNodes[0]) . '(' . $this->parseTree($n->treeNodes[1]) . ')';
- break;
-
- case KEYWORD_NEW:
- case JS_NEW_WITH_ARGS:
- $s = 'new ' . $this->parseTree($n->treeNodes[0]) . '(' . ($n->type == JS_NEW_WITH_ARGS ? $this->parseTree($n->treeNodes[1]) : '') . ')';
- break;
-
- case JS_ARRAY_INIT:
- $s = '[';
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- {
- $s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
- }
- $s .= ']';
- break;
-
- case JS_OBJECT_INIT:
- $s = '{';
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- {
- $t = $childs[$i];
- if ($i)
- $s .= ',';
- if ($t->type == JS_PROPERTY_INIT)
- {
- // Ditch the quotes when the index is a valid identifier
- if ( $t->treeNodes[0]->type == TOKEN_STRING &&
- $this->isValidIdentifier(substr($t->treeNodes[0]->value, 1, -1))
- )
- $s .= substr($t->treeNodes[0]->value, 1, -1);
- else
- $s .= $t->treeNodes[0]->value;
-
- $s .= ':' . $this->parseTree($t->treeNodes[1]);
- }
- else
- {
- $s .= $t->type == JS_GETTER ? 'get' : 'set';
- $s .= ' ' . $t->name . '(';
- $params = $t->params;
- for ($i = 0, $j = count($params); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $params[$i];
- $s .= '){' . $this->parseTree($t->body, true) . '}';
- }
- }
- $s .= '}';
- break;
-
- case KEYWORD_NULL: case KEYWORD_THIS: case KEYWORD_TRUE: case KEYWORD_FALSE:
- case TOKEN_IDENTIFIER: case TOKEN_NUMBER: case TOKEN_STRING: case TOKEN_REGEXP:
- $s = $n->value;
- break;
-
- case JS_GROUP:
- $s = '(' . $this->parseTree($n->treeNodes[0]) . ')';
- break;
-
- default:
- throw new Exception('UNKNOWN TOKEN TYPE: ' . $n->type);
- }
-
- return $s;
- }
-
- private function isValidIdentifier($string)
- {
- return preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $string) && !in_array($string, $this->reserved);
- }
-}
-
-class JSParser
-{
- private $t;
-
- private $opPrecedence = array(
- ';' => 0,
- ',' => 1,
- '=' => 2, '?' => 2, ':' => 2,
- // The above all have to have the same precedence, see bug 330975
- '||' => 4,
- '&&' => 5,
- '|' => 6,
- '^' => 7,
- '&' => 8,
- '==' => 9, '!=' => 9, '===' => 9, '!==' => 9,
- '<' => 10, '<=' => 10, '>=' => 10, '>' => 10, 'in' => 10, 'instanceof' => 10,
- '<<' => 11, '>>' => 11, '>>>' => 11,
- '+' => 12, '-' => 12,
- '*' => 13, '/' => 13, '%' => 13,
- 'delete' => 14, 'void' => 14, 'typeof' => 14,
- '!' => 14, '~' => 14, 'U+' => 14, 'U-' => 14,
- '++' => 15, '--' => 15,
- 'new' => 16,
- '.' => 17,
- JS_NEW_WITH_ARGS => 0, JS_INDEX => 0, JS_CALL => 0,
- JS_ARRAY_INIT => 0, JS_OBJECT_INIT => 0, JS_GROUP => 0
- );
-
- private $opArity = array(
- ',' => -2,
- '=' => 2,
- '?' => 3,
- '||' => 2,
- '&&' => 2,
- '|' => 2,
- '^' => 2,
- '&' => 2,
- '==' => 2, '!=' => 2, '===' => 2, '!==' => 2,
- '<' => 2, '<=' => 2, '>=' => 2, '>' => 2, 'in' => 2, 'instanceof' => 2,
- '<<' => 2, '>>' => 2, '>>>' => 2,
- '+' => 2, '-' => 2,
- '*' => 2, '/' => 2, '%' => 2,
- 'delete' => 1, 'void' => 1, 'typeof' => 1,
- '!' => 1, '~' => 1, 'U+' => 1, 'U-' => 1,
- '++' => 1, '--' => 1,
- 'new' => 1,
- '.' => 2,
- JS_NEW_WITH_ARGS => 2, JS_INDEX => 2, JS_CALL => 2,
- JS_ARRAY_INIT => 1, JS_OBJECT_INIT => 1, JS_GROUP => 1,
- TOKEN_CONDCOMMENT_START => 1, TOKEN_CONDCOMMENT_END => 1
- );
-
- public function __construct()
- {
- $this->t = new JSTokenizer();
- }
-
- public function parse($s, $f, $l)
- {
- // initialize tokenizer
- $this->t->init($s, $f, $l);
-
- $x = new JSCompilerContext(false);
- $n = $this->Script($x);
- if (!$this->t->isDone())
- throw $this->t->newSyntaxError('Syntax error');
-
- return $n;
- }
-
- private function Script($x)
- {
- $n = $this->Statements($x);
- $n->type = JS_SCRIPT;
- $n->funDecls = $x->funDecls;
- $n->varDecls = $x->varDecls;
-
- return $n;
- }
-
- private function Statements($x)
- {
- $n = new JSNode($this->t, JS_BLOCK);
- array_push($x->stmtStack, $n);
-
- while (!$this->t->isDone() && $this->t->peek() != OP_RIGHT_CURLY)
- $n->addNode($this->Statement($x));
-
- array_pop($x->stmtStack);
-
- return $n;
- }
-
- private function Block($x)
- {
- $this->t->mustMatch(OP_LEFT_CURLY);
- $n = $this->Statements($x);
- $this->t->mustMatch(OP_RIGHT_CURLY);
-
- return $n;
- }
-
- private function Statement($x)
- {
- $tt = $this->t->get();
- $n2 = null;
-
- // Cases for statements ending in a right curly return early, avoiding the
- // common semicolon insertion magic after this switch.
- switch ($tt)
- {
- case KEYWORD_FUNCTION:
- return $this->FunctionDefinition(
- $x,
- true,
- count($x->stmtStack) > 1 ? STATEMENT_FORM : DECLARED_FORM
- );
- break;
-
- case OP_LEFT_CURLY:
- $n = $this->Statements($x);
- $this->t->mustMatch(OP_RIGHT_CURLY);
- return $n;
-
- case KEYWORD_IF:
- $n = new JSNode($this->t);
- $n->condition = $this->ParenExpression($x);
- array_push($x->stmtStack, $n);
- $n->thenPart = $this->Statement($x);
- $n->elsePart = $this->t->match(KEYWORD_ELSE) ? $this->Statement($x) : null;
- array_pop($x->stmtStack);
- return $n;
-
- case KEYWORD_SWITCH:
- $n = new JSNode($this->t);
- $this->t->mustMatch(OP_LEFT_PAREN);
- $n->discriminant = $this->Expression($x);
- $this->t->mustMatch(OP_RIGHT_PAREN);
- $n->cases = array();
- $n->defaultIndex = -1;
-
- array_push($x->stmtStack, $n);
-
- $this->t->mustMatch(OP_LEFT_CURLY);
-
- while (($tt = $this->t->get()) != OP_RIGHT_CURLY)
- {
- switch ($tt)
- {
- case KEYWORD_DEFAULT:
- if ($n->defaultIndex >= 0)
- throw $this->t->newSyntaxError('More than one switch default');
- // FALL THROUGH
- case KEYWORD_CASE:
- $n2 = new JSNode($this->t);
- if ($tt == KEYWORD_DEFAULT)
- $n->defaultIndex = count($n->cases);
- else
- $n2->caseLabel = $this->Expression($x, OP_COLON);
- break;
- default:
- throw $this->t->newSyntaxError('Invalid switch case');
- }
-
- $this->t->mustMatch(OP_COLON);
- $n2->statements = new JSNode($this->t, JS_BLOCK);
- while (($tt = $this->t->peek()) != KEYWORD_CASE && $tt != KEYWORD_DEFAULT && $tt != OP_RIGHT_CURLY)
- $n2->statements->addNode($this->Statement($x));
-
- array_push($n->cases, $n2);
- }
-
- array_pop($x->stmtStack);
- return $n;
-
- case KEYWORD_FOR:
- $n = new JSNode($this->t);
- $n->isLoop = true;
- $this->t->mustMatch(OP_LEFT_PAREN);
-
- if (($tt = $this->t->peek()) != OP_SEMICOLON)
- {
- $x->inForLoopInit = true;
- if ($tt == KEYWORD_VAR || $tt == KEYWORD_CONST)
- {
- $this->t->get();
- $n2 = $this->Variables($x);
- }
- else
- {
- $n2 = $this->Expression($x);
- }
- $x->inForLoopInit = false;
- }
-
- if ($n2 && $this->t->match(KEYWORD_IN))
- {
- $n->type = JS_FOR_IN;
- if ($n2->type == KEYWORD_VAR)
- {
- if (count($n2->treeNodes) != 1)
- {
- throw $this->t->SyntaxError(
- 'Invalid for..in left-hand side',
- $this->t->filename,
- $n2->lineno
- );
- }
-
- // NB: n2[0].type == IDENTIFIER and n2[0].value == n2[0].name.
- $n->iterator = $n2->treeNodes[0];
- $n->varDecl = $n2;
- }
- else
- {
- $n->iterator = $n2;
- $n->varDecl = null;
- }
-
- $n->object = $this->Expression($x);
- }
- else
- {
- $n->setup = $n2 ? $n2 : null;
- $this->t->mustMatch(OP_SEMICOLON);
- $n->condition = $this->t->peek() == OP_SEMICOLON ? null : $this->Expression($x);
- $this->t->mustMatch(OP_SEMICOLON);
- $n->update = $this->t->peek() == OP_RIGHT_PAREN ? null : $this->Expression($x);
- }
-
- $this->t->mustMatch(OP_RIGHT_PAREN);
- $n->body = $this->nest($x, $n);
- return $n;
-
- case KEYWORD_WHILE:
- $n = new JSNode($this->t);
- $n->isLoop = true;
- $n->condition = $this->ParenExpression($x);
- $n->body = $this->nest($x, $n);
- return $n;
-
- case KEYWORD_DO:
- $n = new JSNode($this->t);
- $n->isLoop = true;
- $n->body = $this->nest($x, $n, KEYWORD_WHILE);
- $n->condition = $this->ParenExpression($x);
- if (!$x->ecmaStrictMode)
- {
- // ";
- * $link = " ";
- *
- * // in min.php
- * Minify::serve('Groups', array(
- * 'groups' => $groupSources
- * ,'setExpires' => (time() + 86400 * 365)
- * ));
- *
- *
- * @package Minify
- * @author Stephen Clay
- */
-class Minify_Build {
-
- /**
- * Last modification time of all files in the build
- *
- * @var int
- */
- public $lastModified = 0;
-
- /**
- * String to use as ampersand in uri(). Set this to '&' if
- * you are not HTML-escaping URIs.
- *
- * @var string
- */
- public static $ampersand = '&';
-
- /**
- * Get a time-stamped URI
- *
- *
- * echo $b->uri('/site.js');
- * // outputs "/site.js?1678242"
- *
- * echo $b->uri('/scriptaculous.js?load=effects');
- * // outputs "/scriptaculous.js?load=effects&1678242"
- *
- *
- * @param string $uri
- * @param boolean $forceAmpersand (default = false) Force the use of ampersand to
- * append the timestamp to the URI.
- * @return string
- */
- public function uri($uri, $forceAmpersand = false) {
- $sep = ($forceAmpersand || strpos($uri, '?') !== false)
- ? self::$ampersand
- : '?';
- return "{$uri}{$sep}{$this->lastModified}";
- }
-
- /**
- * Create a build object
- *
- * @param array $sources array of Minify_Source objects and/or file paths
- *
- * @return null
- */
- public function __construct($sources)
- {
- $max = 0;
- foreach ((array)$sources as $source) {
- if ($source instanceof Minify_Source) {
- $max = max($max, $source->lastModified);
- } elseif (is_string($source)) {
- if (0 === strpos($source, '//')) {
- $source = $_SERVER['DOCUMENT_ROOT'] . substr($source, 1);
- }
- if (is_file($source)) {
- $max = max($max, filemtime($source));
- }
- }
- }
- $this->lastModified = $max;
- }
-}
diff --git a/min/lib/Minify/CSS.php b/min/lib/Minify/CSS.php
deleted file mode 100644
index 6aaff59..0000000
--- a/min/lib/Minify/CSS.php
+++ /dev/null
@@ -1,80 +0,0 @@
-
- * @author http://code.google.com/u/1stvamp/ (Issue 64 patch)
- */
-class Minify_CSS {
-
- /**
- * Minify a CSS string
- *
- * @param string $css
- *
- * @param array $options available options:
- *
- * 'preserveComments': (default true) multi-line comments that begin
- * with "/*!" will be preserved with newlines before and after to
- * enhance readability.
- *
- * 'prependRelativePath': (default null) if given, this string will be
- * prepended to all relative URIs in import/url declarations
- *
- * 'currentDir': (default null) if given, this is assumed to be the
- * directory of the current CSS file. Using this, minify will rewrite
- * all relative URIs in import/url declarations to correctly point to
- * the desired files. For this to work, the files *must* exist and be
- * visible by the PHP process.
- *
- * 'symlinks': (default = array()) If the CSS file is stored in
- * a symlink-ed directory, provide an array of link paths to
- * target paths, where the link paths are within the document root. Because
- * paths need to be normalized for this to work, use "//" to substitute
- * the doc root in the link paths (the array keys). E.g.:
- *
- * array('//symlink' => '/real/target/path') // unix
- * array('//static' => 'D:\\staticStorage') // Windows
- *
- *
- * @return string
- */
- public static function minify($css, $options = array())
- {
- if (isset($options['preserveComments'])
- && !$options['preserveComments']) {
- $css = Minify_CSS_Compressor::process($css, $options);
- } else {
- $css = Minify_CommentPreserver::process(
- $css
- ,array('Minify_CSS_Compressor', 'process')
- ,array($options)
- );
- }
- if (! isset($options['currentDir']) && ! isset($options['prependRelativePath'])) {
- return $css;
- }
- if (isset($options['currentDir'])) {
- return Minify_CSS_UriRewriter::rewrite(
- $css
- ,$options['currentDir']
- ,isset($options['docRoot']) ? $options['docRoot'] : $_SERVER['DOCUMENT_ROOT']
- ,isset($options['symlinks']) ? $options['symlinks'] : array()
- );
- } else {
- return Minify_CSS_UriRewriter::prepend(
- $css
- ,$options['prependRelativePath']
- );
- }
- }
-}
diff --git a/min/lib/Minify/CSS/Compressor.php b/min/lib/Minify/CSS/Compressor.php
deleted file mode 100644
index a348286..0000000
--- a/min/lib/Minify/CSS/Compressor.php
+++ /dev/null
@@ -1,250 +0,0 @@
-
- * @author http://code.google.com/u/1stvamp/ (Issue 64 patch)
- */
-class Minify_CSS_Compressor {
-
- /**
- * Minify a CSS string
- *
- * @param string $css
- *
- * @param array $options (currently ignored)
- *
- * @return string
- */
- public static function process($css, $options = array())
- {
- $obj = new Minify_CSS_Compressor($options);
- return $obj->_process($css);
- }
-
- /**
- * @var array options
- */
- protected $_options = null;
-
- /**
- * @var bool Are we "in" a hack?
- *
- * I.e. are some browsers targetted until the next comment?
- */
- protected $_inHack = false;
-
-
- /**
- * Constructor
- *
- * @param array $options (currently ignored)
- *
- * @return null
- */
- private function __construct($options) {
- $this->_options = $options;
- }
-
- /**
- * Minify a CSS string
- *
- * @param string $css
- *
- * @return string
- */
- protected function _process($css)
- {
- $css = str_replace("\r\n", "\n", $css);
-
- // preserve empty comment after '>'
- // http://www.webdevout.net/css-hacks#in_css-selectors
- $css = preg_replace('@>/\\*\\s*\\*/@', '>/*keep*/', $css);
-
- // preserve empty comment between property and value
- // http://css-discuss.incutio.com/?page=BoxModelHack
- $css = preg_replace('@/\\*\\s*\\*/\\s*:@', '/*keep*/:', $css);
- $css = preg_replace('@:\\s*/\\*\\s*\\*/@', ':/*keep*/', $css);
-
- // apply callback to all valid comments (and strip out surrounding ws
- $css = preg_replace_callback('@\\s*/\\*([\\s\\S]*?)\\*/\\s*@'
- ,array($this, '_commentCB'), $css);
-
- // remove ws around { } and last semicolon in declaration block
- $css = preg_replace('/\\s*{\\s*/', '{', $css);
- $css = preg_replace('/;?\\s*}\\s*/', '}', $css);
-
- // remove ws surrounding semicolons
- $css = preg_replace('/\\s*;\\s*/', ';', $css);
-
- // remove ws around urls
- $css = preg_replace('/
- url\\( # url(
- \\s*
- ([^\\)]+?) # 1 = the URL (really just a bunch of non right parenthesis)
- \\s*
- \\) # )
- /x', 'url($1)', $css);
-
- // remove ws between rules and colons
- $css = preg_replace('/
- \\s*
- ([{;]) # 1 = beginning of block or rule separator
- \\s*
- ([\\*_]?[\\w\\-]+) # 2 = property (and maybe IE filter)
- \\s*
- :
- \\s*
- (\\b|[#\'"]) # 3 = first character of a value
- /x', '$1$2:$3', $css);
-
- // remove ws in selectors
- $css = preg_replace_callback('/
- (?: # non-capture
- \\s*
- [^~>+,\\s]+ # selector part
- \\s*
- [,>+~] # combinators
- )+
- \\s*
- [^~>+,\\s]+ # selector part
- { # open declaration block
- /x'
- ,array($this, '_selectorsCB'), $css);
-
- // minimize hex colors
- $css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i'
- , '$1#$2$3$4$5', $css);
-
- // remove spaces between font families
- $css = preg_replace_callback('/font-family:([^;}]+)([;}])/'
- ,array($this, '_fontFamilyCB'), $css);
-
- $css = preg_replace('/@import\\s+url/', '@import url', $css);
-
- // replace any ws involving newlines with a single newline
- $css = preg_replace('/[ \\t]*\\n+\\s*/', "\n", $css);
-
- // separate common descendent selectors w/ newlines (to limit line lengths)
- $css = preg_replace('/([\\w#\\.\\*]+)\\s+([\\w#\\.\\*]+){/', "$1\n$2{", $css);
-
- // Use newline after 1st numeric value (to limit line lengths).
- $css = preg_replace('/
- ((?:padding|margin|border|outline):\\d+(?:px|em)?) # 1 = prop : 1st numeric value
- \\s+
- /x'
- ,"$1\n", $css);
-
- // prevent triggering IE6 bug: http://www.crankygeek.com/ie6pebug/
- $css = preg_replace('/:first-l(etter|ine)\\{/', ':first-l$1 {', $css);
-
- return trim($css);
- }
-
- /**
- * Replace what looks like a set of selectors
- *
- * @param array $m regex matches
- *
- * @return string
- */
- protected function _selectorsCB($m)
- {
- // remove ws around the combinators
- return preg_replace('/\\s*([,>+~])\\s*/', '$1', $m[0]);
- }
-
- /**
- * Process a comment and return a replacement
- *
- * @param array $m regex matches
- *
- * @return string
- */
- protected function _commentCB($m)
- {
- $hasSurroundingWs = (trim($m[0]) !== $m[1]);
- $m = $m[1];
- // $m is the comment content w/o the surrounding tokens,
- // but the return value will replace the entire comment.
- if ($m === 'keep') {
- return '/**/';
- }
- if ($m === '" "') {
- // component of http://tantek.com/CSS/Examples/midpass.html
- return '/*" "*/';
- }
- if (preg_match('@";\\}\\s*\\}/\\*\\s+@', $m)) {
- // component of http://tantek.com/CSS/Examples/midpass.html
- return '/*";}}/* */';
- }
- if ($this->_inHack) {
- // inversion: feeding only to one browser
- if (preg_match('@
- ^/ # comment started like /*/
- \\s*
- (\\S[\\s\\S]+?) # has at least some non-ws content
- \\s*
- /\\* # ends like /*/ or /**/
- @x', $m, $n)) {
- // end hack mode after this comment, but preserve the hack and comment content
- $this->_inHack = false;
- return "/*/{$n[1]}/**/";
- }
- }
- if (substr($m, -1) === '\\') { // comment ends like \*/
- // begin hack mode and preserve hack
- $this->_inHack = true;
- return '/*\\*/';
- }
- if ($m !== '' && $m[0] === '/') { // comment looks like /*/ foo */
- // begin hack mode and preserve hack
- $this->_inHack = true;
- return '/*/*/';
- }
- if ($this->_inHack) {
- // a regular comment ends hack mode but should be preserved
- $this->_inHack = false;
- return '/**/';
- }
- // Issue 107: if there's any surrounding whitespace, it may be important, so
- // replace the comment with a single space
- return $hasSurroundingWs // remove all other comments
- ? ' '
- : '';
- }
-
- /**
- * Process a font-family listing and return a replacement
- *
- * @param array $m regex matches
- *
- * @return string
- */
- protected function _fontFamilyCB($m)
- {
- $m[1] = preg_replace('/
- \\s*
- (
- "[^"]+" # 1 = family in double qutoes
- |\'[^\']+\' # or 1 = family in single quotes
- |[\\w\\-]+ # or 1 = unquoted family
- )
- \\s*
- /x', '$1', $m[1]);
- return 'font-family:' . $m[1] . $m[2];
- }
-}
diff --git a/min/lib/Minify/CSS/UriRewriter.php b/min/lib/Minify/CSS/UriRewriter.php
deleted file mode 100644
index 824c6bb..0000000
--- a/min/lib/Minify/CSS/UriRewriter.php
+++ /dev/null
@@ -1,270 +0,0 @@
-
- */
-class Minify_CSS_UriRewriter {
-
- /**
- * Defines which class to call as part of callbacks, change this
- * if you extend Minify_CSS_UriRewriter
- * @var string
- */
- protected static $className = 'Minify_CSS_UriRewriter';
-
- /**
- * rewrite() and rewriteRelative() append debugging information here
- * @var string
- */
- public static $debugText = '';
-
- /**
- * Rewrite file relative URIs as root relative in CSS files
- *
- * @param string $css
- *
- * @param string $currentDir The directory of the current CSS file.
- *
- * @param string $docRoot The document root of the web site in which
- * the CSS file resides (default = $_SERVER['DOCUMENT_ROOT']).
- *
- * @param array $symlinks (default = array()) If the CSS file is stored in
- * a symlink-ed directory, provide an array of link paths to
- * target paths, where the link paths are within the document root. Because
- * paths need to be normalized for this to work, use "//" to substitute
- * the doc root in the link paths (the array keys). E.g.:
- *
- * array('//symlink' => '/real/target/path') // unix
- * array('//static' => 'D:\\staticStorage') // Windows
- *
- *
- * @return string
- */
- public static function rewrite($css, $currentDir, $docRoot = null, $symlinks = array())
- {
- self::$_docRoot = self::_realpath(
- $docRoot ? $docRoot : $_SERVER['DOCUMENT_ROOT']
- );
- self::$_currentDir = self::_realpath($currentDir);
- self::$_symlinks = array();
-
- // normalize symlinks
- foreach ($symlinks as $link => $target) {
- $link = ($link === '//')
- ? self::$_docRoot
- : str_replace('//', self::$_docRoot . '/', $link);
- $link = strtr($link, '/', DIRECTORY_SEPARATOR);
- self::$_symlinks[$link] = self::_realpath($target);
- }
-
- self::$debugText .= "docRoot : " . self::$_docRoot . "\n"
- . "currentDir : " . self::$_currentDir . "\n";
- if (self::$_symlinks) {
- self::$debugText .= "symlinks : " . var_export(self::$_symlinks, 1) . "\n";
- }
- self::$debugText .= "\n";
-
- $css = self::_trimUrls($css);
-
- // rewrite
- $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/'
- ,array(self::$className, '_processUriCB'), $css);
- $css = preg_replace_callback('/url\\(\\s*([^\\)\\s]+)\\s*\\)/'
- ,array(self::$className, '_processUriCB'), $css);
-
- return $css;
- }
-
- /**
- * Prepend a path to relative URIs in CSS files
- *
- * @param string $css
- *
- * @param string $path The path to prepend.
- *
- * @return string
- */
- public static function prepend($css, $path)
- {
- self::$_prependPath = $path;
-
- $css = self::_trimUrls($css);
-
- // append
- $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/'
- ,array(self::$className, '_processUriCB'), $css);
- $css = preg_replace_callback('/url\\(\\s*([^\\)\\s]+)\\s*\\)/'
- ,array(self::$className, '_processUriCB'), $css);
-
- self::$_prependPath = null;
- return $css;
- }
-
-
- /**
- * @var string directory of this stylesheet
- */
- private static $_currentDir = '';
-
- /**
- * @var string DOC_ROOT
- */
- private static $_docRoot = '';
-
- /**
- * @var array directory replacements to map symlink targets back to their
- * source (within the document root) E.g. '/var/www/symlink' => '/var/realpath'
- */
- private static $_symlinks = array();
-
- /**
- * @var string path to prepend
- */
- private static $_prependPath = null;
-
- private static function _trimUrls($css)
- {
- return preg_replace('/
- url\\( # url(
- \\s*
- ([^\\)]+?) # 1 = URI (assuming does not contain ")")
- \\s*
- \\) # )
- /x', 'url($1)', $css);
- }
-
- private static function _processUriCB($m)
- {
- // $m matched either '/@import\\s+([\'"])(.*?)[\'"]/' or '/url\\(\\s*([^\\)\\s]+)\\s*\\)/'
- $isImport = ($m[0][0] === '@');
- // determine URI and the quote character (if any)
- if ($isImport) {
- $quoteChar = $m[1];
- $uri = $m[2];
- } else {
- // $m[1] is either quoted or not
- $quoteChar = ($m[1][0] === "'" || $m[1][0] === '"')
- ? $m[1][0]
- : '';
- $uri = ($quoteChar === '')
- ? $m[1]
- : substr($m[1], 1, strlen($m[1]) - 2);
- }
- // analyze URI
- if ('/' !== $uri[0] // root-relative
- && false === strpos($uri, '//') // protocol (non-data)
- && 0 !== strpos($uri, 'data:') // data protocol
- ) {
- // URI is file-relative: rewrite depending on options
- $uri = (self::$_prependPath !== null)
- ? (self::$_prependPath . $uri)
- : self::rewriteRelative($uri, self::$_currentDir, self::$_docRoot, self::$_symlinks);
- }
- return $isImport
- ? "@import {$quoteChar}{$uri}{$quoteChar}"
- : "url({$quoteChar}{$uri}{$quoteChar})";
- }
-
- /**
- * Rewrite a file relative URI as root relative
- *
- *
- * Minify_CSS_UriRewriter::rewriteRelative(
- * '../img/hello.gif'
- * , '/home/user/www/css' // path of CSS file
- * , '/home/user/www' // doc root
- * );
- * // returns '/img/hello.gif'
- *
- * // example where static files are stored in a symlinked directory
- * Minify_CSS_UriRewriter::rewriteRelative(
- * 'hello.gif'
- * , '/var/staticFiles/theme'
- * , '/home/user/www'
- * , array('/home/user/www/static' => '/var/staticFiles')
- * );
- * // returns '/static/theme/hello.gif'
- *
- *
- * @param string $uri file relative URI
- *
- * @param string $realCurrentDir realpath of the current file's directory.
- *
- * @param string $realDocRoot realpath of the site document root.
- *
- * @param array $symlinks (default = array()) If the file is stored in
- * a symlink-ed directory, provide an array of link paths to
- * real target paths, where the link paths "appear" to be within the document
- * root. E.g.:
- *
- * array('/home/foo/www/not/real/path' => '/real/target/path') // unix
- * array('C:\\htdocs\\not\\real' => 'D:\\real\\target\\path') // Windows
- *
- *
- * @return string
- */
- public static function rewriteRelative($uri, $realCurrentDir, $realDocRoot, $symlinks = array())
- {
- // prepend path with current dir separator (OS-independent)
- $path = strtr($realCurrentDir, '/', DIRECTORY_SEPARATOR)
- . DIRECTORY_SEPARATOR . strtr($uri, '/', DIRECTORY_SEPARATOR);
-
- self::$debugText .= "file-relative URI : {$uri}\n"
- . "path prepended : {$path}\n";
-
- // "unresolve" a symlink back to doc root
- foreach ($symlinks as $link => $target) {
- if (0 === strpos($path, $target)) {
- // replace $target with $link
- $path = $link . substr($path, strlen($target));
-
- self::$debugText .= "symlink unresolved : {$path}\n";
-
- break;
- }
- }
- // strip doc root
- $path = substr($path, strlen($realDocRoot));
-
- self::$debugText .= "docroot stripped : {$path}\n";
-
- // fix to root-relative URI
-
- $uri = strtr($path, '/\\', '//');
-
- // remove /./ and /../ where possible
- $uri = str_replace('/./', '/', $uri);
- // inspired by patch from Oleg Cherniy
- do {
- $uri = preg_replace('@/[^/]+/\\.\\./@', '/', $uri, 1, $changed);
- } while ($changed);
-
- self::$debugText .= "traversals removed : {$uri}\n\n";
-
- return $uri;
- }
-
- /**
- * Get realpath with any trailing slash removed. If realpath() fails,
- * just remove the trailing slash.
- *
- * @param string $path
- *
- * @return mixed path with no trailing slash
- */
- protected static function _realpath($path)
- {
- $realPath = realpath($path);
- if ($realPath !== false) {
- $path = $realPath;
- }
- return rtrim($path, '/\\');
- }
-}
diff --git a/min/lib/Minify/Cache/APC.php b/min/lib/Minify/Cache/APC.php
deleted file mode 100644
index dd51bcb..0000000
--- a/min/lib/Minify/Cache/APC.php
+++ /dev/null
@@ -1,130 +0,0 @@
-
- * Minify::setCache(new Minify_Cache_APC());
- *
- *
- * @package Minify
- * @author Chris Edwards
- **/
-class Minify_Cache_APC implements Minify_Cache_Interface {
-
- /**
- * Create a Minify_Cache_APC object, to be passed to
- * Minify::setCache().
- *
- *
- * @param int $expire seconds until expiration (default = 0
- * meaning the item will not get an expiration date)
- *
- * @return null
- */
- public function __construct($expire = 0)
- {
- $this->_exp = $expire;
- }
-
- /**
- * Write data to cache.
- *
- * @param string $id cache id
- *
- * @param string $data
- *
- * @return bool success
- */
- public function store($id, $data)
- {
- return apc_store($id, "{$_SERVER['REQUEST_TIME']}|{$data}", $this->_exp);
- }
-
- /**
- * Get the size of a cache entry
- *
- * @param string $id cache id
- *
- * @return int size in bytes
- */
- public function getSize($id)
- {
- return $this->_fetch($id)
- ? strlen($this->_data)
- : false;
- }
-
- /**
- * Does a valid cache entry exist?
- *
- * @param string $id cache id
- *
- * @param int $srcMtime mtime of the original source file(s)
- *
- * @return bool exists
- */
- public function isValid($id, $srcMtime)
- {
- return ($this->_fetch($id) && ($this->_lm >= $srcMtime));
- }
-
- /**
- * Send the cached content to output
- *
- * @param string $id cache id
- */
- public function display($id)
- {
- echo $this->_fetch($id)
- ? $this->_data
- : '';
- }
-
- /**
- * Fetch the cached content
- *
- * @param string $id cache id
- *
- * @return string
- */
- public function fetch($id)
- {
- return $this->_fetch($id)
- ? $this->_data
- : '';
- }
-
- private $_exp = null;
-
- // cache of most recently fetched id
- private $_lm = null;
- private $_data = null;
- private $_id = null;
-
- /**
- * Fetch data and timestamp from apc, store in instance
- *
- * @param string $id
- *
- * @return bool success
- */
- private function _fetch($id)
- {
- if ($this->_id === $id) {
- return true;
- }
- $ret = apc_fetch($id);
- if (false === $ret) {
- $this->_id = null;
- return false;
- }
- list($this->_lm, $this->_data) = explode('|', $ret, 2);
- $this->_id = $id;
- return true;
- }
-}
diff --git a/min/lib/Minify/Cache/File.php b/min/lib/Minify/Cache/File.php
deleted file mode 100644
index 6f4d74a..0000000
--- a/min/lib/Minify/Cache/File.php
+++ /dev/null
@@ -1,125 +0,0 @@
-_locking = $fileLocking;
- $this->_path = $path;
- }
-
- /**
- * Write data to cache.
- *
- * @param string $id cache id (e.g. a filename)
- *
- * @param string $data
- *
- * @return bool success
- */
- public function store($id, $data)
- {
- $flag = $this->_locking
- ? LOCK_EX
- : null;
- if (is_file($this->_path . '/' . $id)) {
- @unlink($this->_path . '/' . $id);
- }
- if (! @file_put_contents($this->_path . '/' . $id, $data, $flag)) {
- return false;
- }
- // write control
- if ($data !== $this->fetch($id)) {
- @unlink($file);
- return false;
- }
- return true;
- }
-
- /**
- * Get the size of a cache entry
- *
- * @param string $id cache id (e.g. a filename)
- *
- * @return int size in bytes
- */
- public function getSize($id)
- {
- return filesize($this->_path . '/' . $id);
- }
-
- /**
- * Does a valid cache entry exist?
- *
- * @param string $id cache id (e.g. a filename)
- *
- * @param int $srcMtime mtime of the original source file(s)
- *
- * @return bool exists
- */
- public function isValid($id, $srcMtime)
- {
- $file = $this->_path . '/' . $id;
- return (is_file($file) && (filemtime($file) >= $srcMtime));
- }
-
- /**
- * Send the cached content to output
- *
- * @param string $id cache id (e.g. a filename)
- */
- public function display($id)
- {
- if ($this->_locking) {
- $fp = fopen($this->_path . '/' . $id, 'rb');
- flock($fp, LOCK_SH);
- fpassthru($fp);
- flock($fp, LOCK_UN);
- fclose($fp);
- } else {
- readfile($this->_path . '/' . $id);
- }
- }
-
- /**
- * Fetch the cached content
- *
- * @param string $id cache id (e.g. a filename)
- *
- * @return string
- */
- public function fetch($id)
- {
- if ($this->_locking) {
- $fp = fopen($this->_path . '/' . $id, 'rb');
- flock($fp, LOCK_SH);
- $ret = stream_get_contents($fp);
- flock($fp, LOCK_UN);
- fclose($fp);
- return $ret;
- } else {
- return file_get_contents($this->_path . '/' . $id);
- }
- }
-
- /**
- * Fetch the cache path used
- *
- * @return string
- */
- public function getPath()
- {
- return $this->_path;
- }
-
- private $_path = null;
- private $_locking = null;
-}
diff --git a/min/lib/Minify/Cache/Interface.php b/min/lib/Minify/Cache/Interface.php
deleted file mode 100644
index 89a1816..0000000
--- a/min/lib/Minify/Cache/Interface.php
+++ /dev/null
@@ -1,59 +0,0 @@
-
- * // fall back to disk caching if memcache can't connect
- * $memcache = new Memcache;
- * if ($memcache->connect('localhost', 11211)) {
- * Minify::setCache(new Minify_Cache_Memcache($memcache));
- * } else {
- * Minify::setCache();
- * }
- *
- **/
-class Minify_Cache_Memcache implements Minify_Cache_Interface {
-
- /**
- * Create a Minify_Cache_Memcache object, to be passed to
- * Minify::setCache().
- *
- * @param Memcache $memcache already-connected instance
- *
- * @param int $expire seconds until expiration (default = 0
- * meaning the item will not get an expiration date)
- *
- * @return null
- */
- public function __construct($memcache, $expire = 0)
- {
- $this->_mc = $memcache;
- $this->_exp = $expire;
- }
-
- /**
- * Write data to cache.
- *
- * @param string $id cache id
- *
- * @param string $data
- *
- * @return bool success
- */
- public function store($id, $data)
- {
- return $this->_mc->set($id, "{$_SERVER['REQUEST_TIME']}|{$data}", 0, $this->_exp);
- }
-
-
- /**
- * Get the size of a cache entry
- *
- * @param string $id cache id
- *
- * @return int size in bytes
- */
- public function getSize($id)
- {
- return $this->_fetch($id)
- ? strlen($this->_data)
- : false;
- }
-
- /**
- * Does a valid cache entry exist?
- *
- * @param string $id cache id
- *
- * @param int $srcMtime mtime of the original source file(s)
- *
- * @return bool exists
- */
- public function isValid($id, $srcMtime)
- {
- return ($this->_fetch($id) && ($this->_lm >= $srcMtime));
- }
-
- /**
- * Send the cached content to output
- *
- * @param string $id cache id
- */
- public function display($id)
- {
- echo $this->_fetch($id)
- ? $this->_data
- : '';
- }
-
- /**
- * Fetch the cached content
- *
- * @param string $id cache id
- *
- * @return string
- */
- public function fetch($id)
- {
- return $this->_fetch($id)
- ? $this->_data
- : '';
- }
-
- private $_mc = null;
- private $_exp = null;
-
- // cache of most recently fetched id
- private $_lm = null;
- private $_data = null;
- private $_id = null;
-
- /**
- * Fetch data and timestamp from memcache, store in instance
- *
- * @param string $id
- *
- * @return bool success
- */
- private function _fetch($id)
- {
- if ($this->_id === $id) {
- return true;
- }
- $ret = $this->_mc->get($id);
- if (false === $ret) {
- $this->_id = null;
- return false;
- }
- list($this->_lm, $this->_data) = explode('|', $ret, 2);
- $this->_id = $id;
- return true;
- }
-}
diff --git a/min/lib/Minify/CommentPreserver.php b/min/lib/Minify/CommentPreserver.php
deleted file mode 100644
index f56eb34..0000000
--- a/min/lib/Minify/CommentPreserver.php
+++ /dev/null
@@ -1,90 +0,0 @@
-
- */
-class Minify_CommentPreserver {
-
- /**
- * String to be prepended to each preserved comment
- *
- * @var string
- */
- public static $prepend = "\n";
-
- /**
- * String to be appended to each preserved comment
- *
- * @var string
- */
- public static $append = "\n";
-
- /**
- * Process a string outside of C-style comments that begin with "/*!"
- *
- * On each non-empty string outside these comments, the given processor
- * function will be called. The first "!" will be removed from the
- * preserved comments, and the comments will be surrounded by
- * Minify_CommentPreserver::$preprend and Minify_CommentPreserver::$append.
- *
- * @param string $content
- * @param callback $processor function
- * @param array $args array of extra arguments to pass to the processor
- * function (default = array())
- * @return string
- */
- public static function process($content, $processor, $args = array())
- {
- $ret = '';
- while (true) {
- list($beforeComment, $comment, $afterComment) = self::_nextComment($content);
- if ('' !== $beforeComment) {
- $callArgs = $args;
- array_unshift($callArgs, $beforeComment);
- $ret .= call_user_func_array($processor, $callArgs);
- }
- if (false === $comment) {
- break;
- }
- $ret .= $comment;
- $content = $afterComment;
- }
- return $ret;
- }
-
- /**
- * Extract comments that YUI Compressor preserves.
- *
- * @param string $in input
- *
- * @return array 3 elements are returned. If a YUI comment is found, the
- * 2nd element is the comment and the 1st and 2nd are the surrounding
- * strings. If no comment is found, the entire string is returned as the
- * 1st element and the other two are false.
- */
- private static function _nextComment($in)
- {
- if (
- false === ($start = strpos($in, '/*!'))
- || false === ($end = strpos($in, '*/', $start + 3))
- ) {
- return array($in, false, false);
- }
- $ret = array(
- substr($in, 0, $start)
- ,self::$prepend . '/*' . substr($in, $start + 3, $end - $start - 1) . self::$append
- );
- $endChars = (strlen($in) - $end - 2);
- $ret[] = (0 === $endChars)
- ? ''
- : substr($in, -$endChars);
- return $ret;
- }
-}
diff --git a/min/lib/Minify/Controller/Base.php b/min/lib/Minify/Controller/Base.php
deleted file mode 100644
index 7e467ea..0000000
--- a/min/lib/Minify/Controller/Base.php
+++ /dev/null
@@ -1,204 +0,0 @@
-
- */
-abstract class Minify_Controller_Base {
-
- /**
- * Setup controller sources and set an needed options for Minify::source
- *
- * You must override this method in your subclass controller to set
- * $this->sources. If the request is NOT valid, make sure $this->sources
- * is left an empty array. Then strip any controller-specific options from
- * $options and return it. To serve files, $this->sources must be an array of
- * Minify_Source objects.
- *
- * @param array $options controller and Minify options
- *
- * return array $options Minify::serve options
- */
- abstract public function setupSources($options);
-
- /**
- * Get default Minify options for this controller.
- *
- * Override in subclass to change defaults
- *
- * @return array options for Minify
- */
- public function getDefaultMinifyOptions() {
- return array(
- 'isPublic' => true
- ,'encodeOutput' => function_exists('gzdeflate')
- ,'encodeMethod' => null // determine later
- ,'encodeLevel' => 9
- ,'minifierOptions' => array() // no minifier options
- ,'contentTypeCharset' => 'utf-8'
- ,'maxAge' => 1800 // 30 minutes
- ,'rewriteCssUris' => true
- ,'bubbleCssImports' => false
- ,'quiet' => false // serve() will send headers and output
- ,'debug' => false
-
- // if you override this, the response code MUST be directly after
- // the first space.
- ,'badRequestHeader' => 'HTTP/1.0 400 Bad Request'
-
- // callback function to see/modify content of all sources
- ,'postprocessor' => null
- // file to require to load preprocessor
- ,'postprocessorRequire' => null
- );
- }
-
- /**
- * Get default minifiers for this controller.
- *
- * Override in subclass to change defaults
- *
- * @return array minifier callbacks for common types
- */
- public function getDefaultMinifers() {
- $ret[Minify::TYPE_JS] = array('JSMin', 'minify');
- $ret[Minify::TYPE_CSS] = array('Minify_CSS', 'minify');
- $ret[Minify::TYPE_HTML] = array('Minify_HTML', 'minify');
- return $ret;
- }
-
- /**
- * Load any code necessary to execute the given minifier callback.
- *
- * The controller is responsible for loading minification code on demand
- * via this method. This built-in function will only load classes for
- * static method callbacks where the class isn't already defined. It uses
- * the PEAR convention, so, given array('Jimmy_Minifier', 'minCss'), this
- * function will include 'Jimmy/Minifier.php'.
- *
- * If you need code loaded on demand and this doesn't suit you, you'll need
- * to override this function in your subclass.
- * @see Minify_Controller_Page::loadMinifier()
- *
- * @param callback $minifierCallback callback of minifier function
- *
- * @return null
- */
- public function loadMinifier($minifierCallback)
- {
- // autoloading... may no longer be needed
-
- /*if (is_array($minifierCallback)
- && is_string($minifierCallback[0])
- && !class_exists($minifierCallback[0], false)) {
-
- require str_replace('_', '/', $minifierCallback[0]) . '.php';
- }
- */
- }
-
- /**
- * Is a user-given file within an allowable directory, existing,
- * and having an extension js/css/html/txt ?
- *
- * This is a convenience function for controllers that have to accept
- * user-given paths
- *
- * @param string $file full file path (already processed by realpath())
- *
- * @param array $safeDirs directories where files are safe to serve. Files can also
- * be in subdirectories of these directories.
- *
- * @return bool file is safe
- */
- public static function _fileIsSafe($file, $safeDirs)
- {
- $pathOk = false;
- foreach ((array)$safeDirs as $safeDir) {
- if (strpos($file, $safeDir) === 0) {
- $pathOk = true;
- break;
- }
- }
- $base = basename($file);
- if (! $pathOk || ! is_file($file) || $base[0] === '.') {
- return false;
- }
- list($revExt) = explode('.', strrev($base));
- return in_array(strrev($revExt), array('js', 'css', 'html', 'txt'));
- }
-
- /**
- * @var array instances of Minify_Source, which provide content and
- * any individual minification needs.
- *
- * @see Minify_Source
- */
- public $sources = array();
-
- /**
- * Mix in default controller options with user-given options
- *
- * @param array $options user options
- *
- * @return array mixed options
- */
- public final function mixInDefaultOptions($options)
- {
- $ret = array_merge(
- $this->getDefaultMinifyOptions(), $options
- );
- if (! isset($options['minifiers'])) {
- $options['minifiers'] = array();
- }
- $ret['minifiers'] = array_merge(
- $this->getDefaultMinifers(), $options['minifiers']
- );
- return $ret;
- }
-
- /**
- * Analyze sources (if there are any) and set $options 'contentType'
- * and 'lastModifiedTime' if they already aren't.
- *
- * @param array $options options for Minify
- *
- * @return array options for Minify
- */
- public final function analyzeSources($options = array())
- {
- if ($this->sources) {
- if (! isset($options['contentType'])) {
- $options['contentType'] = Minify_Source::getContentType($this->sources);
- }
- // last modified is needed for caching, even if setExpires is set
- if (! isset($options['lastModifiedTime'])) {
- $max = 0;
- foreach ($this->sources as $source) {
- $max = max($source->lastModified, $max);
- }
- $options['lastModifiedTime'] = $max;
- }
- }
- return $options;
- }
-
- /**
- * Send message to the Minify logger
- * @param string $msg
- * @return null
- */
- protected function log($msg) {
- Minify_Logger::log($msg);
- }
-}
diff --git a/min/lib/Minify/Controller/Files.php b/min/lib/Minify/Controller/Files.php
deleted file mode 100644
index 83f028a..0000000
--- a/min/lib/Minify/Controller/Files.php
+++ /dev/null
@@ -1,78 +0,0 @@
-
- * Minify::serve('Files', array(
- * 'files' => array(
- * '//js/jquery.js'
- * ,'//js/plugins.js'
- * ,'/home/username/file.js'
- * )
- * ));
- *
- *
- * As a shortcut, the controller will replace "//" at the beginning
- * of a filename with $_SERVER['DOCUMENT_ROOT'] . '/'.
- *
- * @package Minify
- * @author Stephen Clay
- */
-class Minify_Controller_Files extends Minify_Controller_Base {
-
- /**
- * Set up file sources
- *
- * @param array $options controller and Minify options
- * @return array Minify options
- *
- * Controller options:
- *
- * 'files': (required) array of complete file paths, or a single path
- */
- public function setupSources($options) {
- // strip controller options
-
- $files = $options['files'];
- // if $files is a single object, casting will break it
- if (is_object($files)) {
- $files = array($files);
- } elseif (! is_array($files)) {
- $files = (array)$files;
- }
- unset($options['files']);
-
- $sources = array();
- foreach ($files as $file) {
- if ($file instanceof Minify_Source) {
- $sources[] = $file;
- continue;
- }
- if (0 === strpos($file, '//')) {
- $file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1);
- }
- $realPath = realpath($file);
- if (is_file($realPath)) {
- $sources[] = new Minify_Source(array(
- 'filepath' => $realPath
- ));
- } else {
- $this->log("The path \"{$file}\" could not be found (or was not a file)");
- return $options;
- }
- }
- if ($sources) {
- $this->sources = $sources;
- }
- return $options;
- }
-}
-
diff --git a/min/lib/Minify/Controller/Groups.php b/min/lib/Minify/Controller/Groups.php
deleted file mode 100644
index 1ac5770..0000000
--- a/min/lib/Minify/Controller/Groups.php
+++ /dev/null
@@ -1,94 +0,0 @@
-
- * Minify::serve('Groups', array(
- * 'groups' => array(
- * 'css' => array('//css/type.css', '//css/layout.css')
- * ,'js' => array('//js/jquery.js', '//js/site.js')
- * )
- * ));
- *
- *
- * If the above code were placed in /serve.php, it would enable the URLs
- * /serve.php/js and /serve.php/css
- *
- * As a shortcut, the controller will replace "//" at the beginning
- * of a filename with $_SERVER['DOCUMENT_ROOT'] . '/'.
- *
- * @package Minify
- * @author Stephen Clay
- */
-class Minify_Controller_Groups extends Minify_Controller_Base {
-
- /**
- * Set up groups of files as sources
- *
- * @param array $options controller and Minify options
- * @return array Minify options
- *
- * Controller options:
- *
- * 'groups': (required) array mapping PATH_INFO strings to arrays
- * of complete file paths. @see Minify_Controller_Groups
- */
- public function setupSources($options) {
- // strip controller options
- $groups = $options['groups'];
- unset($options['groups']);
-
- // mod_fcgid places PATH_INFO in ORIG_PATH_INFO
- $pi = isset($_SERVER['ORIG_PATH_INFO'])
- ? substr($_SERVER['ORIG_PATH_INFO'], 1)
- : (isset($_SERVER['PATH_INFO'])
- ? substr($_SERVER['PATH_INFO'], 1)
- : false
- );
- if (false === $pi || ! isset($groups[$pi])) {
- // no PATH_INFO or not a valid group
- $this->log("Missing PATH_INFO or no group set for \"$pi\"");
- return $options;
- }
- $sources = array();
-
- $files = $groups[$pi];
- // if $files is a single object, casting will break it
- if (is_object($files)) {
- $files = array($files);
- } elseif (! is_array($files)) {
- $files = (array)$files;
- }
- foreach ($files as $file) {
- if ($file instanceof Minify_Source) {
- $sources[] = $file;
- continue;
- }
- if (0 === strpos($file, '//')) {
- $file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1);
- }
- $realPath = realpath($file);
- if (is_file($realPath)) {
- $sources[] = new Minify_Source(array(
- 'filepath' => $realPath
- ));
- } else {
- $this->log("The path \"{$file}\" could not be found (or was not a file)");
- return $options;
- }
- }
- if ($sources) {
- $this->sources = $sources;
- }
- return $options;
- }
-}
-
diff --git a/min/lib/Minify/Controller/MinApp.php b/min/lib/Minify/Controller/MinApp.php
deleted file mode 100644
index 36aa71b..0000000
--- a/min/lib/Minify/Controller/MinApp.php
+++ /dev/null
@@ -1,153 +0,0 @@
-
- */
-class Minify_Controller_MinApp extends Minify_Controller_Base {
-
- /**
- * Set up groups of files as sources
- *
- * If $_GET['g'] is set, it's split with "," and each piece is looked up as
- * a key in groupsConfig.php, and the found arrays are added to the sources.
- *
- * If $_GET['f'] is set and $options['groupsOnly'] is false, sources are
- * added based on validity of name and location.
- *
- * Caveat: Groups always come before files, but the groups are ordered as
- * requested. E.g.
- * /f=file.js&g=js1,js2 == /g=js1,js2&f=file.js != /g=js2,js1&f=file.js
- *
- * Caveat: If JS group(s) are specified, the method will still allow you to
- * add CSS files and vice-versa. E.g.:
- * /g=js1,js2&f=site.css => Minify will try to process site.css through the
- * Javascript minifier, possibly causing an exception.
- *
- * @param array $options controller and Minify options
- * @return array Minify options
- */
- public function setupSources($options) {
- // filter controller options
- $cOptions = array_merge(
- array(
- 'allowDirs' => '//'
- ,'groupsOnly' => false
- ,'groups' => array()
- ,'maxFiles' => 10
- )
- ,(isset($options['minApp']) ? $options['minApp'] : array())
- );
- unset($options['minApp']);
- $sources = array();
- if (isset($_GET['g'])) {
- // try groups
- $files = array();
- $keys = explode(',', $_GET['g']);
- // check for duplicate key
- // note: no check for duplicate files
- if ($keys != array_unique($keys)) {
- $this->log("Duplicate key given in \"{$_GET['g']}\"");
- return $options;
- }
- foreach ($keys as $key) {
- if (! isset($cOptions['groups'][$key])) {
- $this->log("A group configuration for \"{$key}\" was not set");
- return $options;
- }
- $groupFiles = $cOptions['groups'][$key];
- if (is_array($groupFiles)) {
- array_splice($files, count($files), 0, $groupFiles);
- } else {
- $files[] = $groupFiles;
- }
- }
- foreach ($files as $file) {
- if ($file instanceof Minify_Source) {
- $sources[] = $file;
- continue;
- }
- if (0 === strpos($file, '//')) {
- $file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1);
- }
- $file = realpath($file);
- if (is_file($file)) {
- $sources[] = new Minify_Source(array(
- 'filepath' => $file
- ));
- } else {
- $this->log("The path \"{$file}\" could not be found (or was not a file)");
- return $options;
- }
- }
- }
- if (! $cOptions['groupsOnly'] && isset($_GET['f'])) {
- // try user files
- // The following restrictions are to limit the URLs that minify will
- // respond to. Ideally there should be only one way to reference a file.
- if (// verify at least one file, files are single comma separated,
- // and are all same extension
- ! preg_match('/^[^,]+\\.(css|js)(?:,[^,]+\\.\\1)*$/', $_GET['f'])
- // no "//"
- || strpos($_GET['f'], '//') !== false
- // no "\"
- || strpos($_GET['f'], '\\') !== false
- // no "./"
- || preg_match('/(?:^|[^\\.])\\.\\//', $_GET['f'])
- ) {
- $this->log("GET param 'f' invalid (see MinApp.php line 63)");
- return $options;
- }
- $files = explode(',', $_GET['f']);
- if (count($files) > $cOptions['maxFiles'] || $files != array_unique($files)) {
- $this->log("Too many or duplicate files specified");
- return $options;
- }
- if (isset($_GET['b'])) {
- // check for validity
- if (preg_match('@^[^/]+(?:/[^/]+)*$@', $_GET['b'])
- && false === strpos($_GET['b'], '..')
- && $_GET['b'] !== '.') {
- // valid base
- $base = "/{$_GET['b']}/";
- } else {
- $this->log("GET param 'b' invalid (see MinApp.php line 84)");
- return $options;
- }
- } else {
- $base = '/';
- }
- $allowDirs = array();
- foreach ((array)$cOptions['allowDirs'] as $allowDir) {
- $allowDirs[] = realpath(str_replace('//', $_SERVER['DOCUMENT_ROOT'] . '/', $allowDir));
- }
- foreach ($files as $file) {
- $path = $_SERVER['DOCUMENT_ROOT'] . $base . $file;
- $file = realpath($path);
- if (false === $file) {
- $this->log("Path \"{$path}\" failed realpath()");
- return $options;
- } elseif (! parent::_fileIsSafe($file, $allowDirs)) {
- $this->log("Path \"{$path}\" failed Minify_Controller_Base::_fileIsSafe()");
- return $options;
- } else {
- $sources[] = new Minify_Source(array(
- 'filepath' => $file
- ));
- }
- }
- }
- if ($sources) {
- $this->sources = $sources;
- } else {
- $this->log("No sources to serve");
- }
- return $options;
- }
-}
diff --git a/min/lib/Minify/Controller/Page.php b/min/lib/Minify/Controller/Page.php
deleted file mode 100644
index 494f260..0000000
--- a/min/lib/Minify/Controller/Page.php
+++ /dev/null
@@ -1,82 +0,0 @@
-
- */
-class Minify_Controller_Page extends Minify_Controller_Base {
-
- /**
- * Set up source of HTML content
- *
- * @param array $options controller and Minify options
- * @return array Minify options
- *
- * Controller options:
- *
- * 'content': (required) HTML markup
- *
- * 'id': (required) id of page (string for use in server-side caching)
- *
- * 'lastModifiedTime': timestamp of when this content changed. This
- * is recommended to allow both server and client-side caching.
- *
- * 'minifyAll': should all CSS and Javascript blocks be individually
- * minified? (default false)
- *
- */
- public function setupSources($options) {
- if (isset($options['file'])) {
- $sourceSpec = array(
- 'filepath' => $options['file']
- );
- unset($options['file']);
- } else {
- // strip controller options
- $sourceSpec = array(
- 'content' => $options['content']
- ,'id' => $options['id']
- );
- unset($options['content'], $options['id']);
- }
- if (isset($options['minifyAll'])) {
- // this will be the 2nd argument passed to Minify_HTML::minify()
- $sourceSpec['minifyOptions'] = array(
- 'cssMinifier' => array('Minify_CSS', 'minify')
- ,'jsMinifier' => array('JSMin', 'minify')
- );
- $this->_loadCssJsMinifiers = true;
- unset($options['minifyAll']);
- }
- $this->sources[] = new Minify_Source($sourceSpec);
-
- $options['contentType'] = Minify::TYPE_HTML;
- return $options;
- }
-
- protected $_loadCssJsMinifiers = false;
-
- /**
- * @see Minify_Controller_Base::loadMinifier()
- */
- public function loadMinifier($minifierCallback)
- {
- if ($this->_loadCssJsMinifiers) {
- // Minify will not call for these so we must manually load
- // them when Minify/HTML.php is called for.
-
- // autoload
- //require_once 'Minify/CSS.php';
- //require_once 'JSMin.php';
- }
- parent::loadMinifier($minifierCallback); // load Minify/HTML.php
- }
-}
-
diff --git a/min/lib/Minify/Controller/Version1.php b/min/lib/Minify/Controller/Version1.php
deleted file mode 100644
index a8de341..0000000
--- a/min/lib/Minify/Controller/Version1.php
+++ /dev/null
@@ -1,116 +0,0 @@
-
- * Minify::serve('Version1');
- *
- *
- * @package Minify
- * @author Stephen Clay
- */
-class Minify_Controller_Version1 extends Minify_Controller_Base {
-
- /**
- * Set up groups of files as sources
- *
- * @param array $options controller and Minify options
- * @return array Minify options
- *
- */
- public function setupSources($options) {
- self::_setupDefines();
- if (MINIFY_USE_CACHE) {
- $cacheDir = defined('MINIFY_CACHE_DIR')
- ? MINIFY_CACHE_DIR
- : '';
- Minify::setCache($cacheDir);
- }
- $options['badRequestHeader'] = 'HTTP/1.0 404 Not Found';
- $options['contentTypeCharset'] = MINIFY_ENCODING;
-
- // The following restrictions are to limit the URLs that minify will
- // respond to. Ideally there should be only one way to reference a file.
- if (! isset($_GET['files'])
- // verify at least one file, files are single comma separated,
- // and are all same extension
- || ! preg_match('/^[^,]+\\.(css|js)(,[^,]+\\.\\1)*$/', $_GET['files'], $m)
- // no "//" (makes URL rewriting easier)
- || strpos($_GET['files'], '//') !== false
- // no "\"
- || strpos($_GET['files'], '\\') !== false
- // no "./"
- || preg_match('/(?:^|[^\\.])\\.\\//', $_GET['files'])
- ) {
- return $options;
- }
- $extension = $m[1];
-
- $files = explode(',', $_GET['files']);
- if (count($files) > MINIFY_MAX_FILES) {
- return $options;
- }
-
- // strings for prepending to relative/absolute paths
- $prependRelPaths = dirname($_SERVER['SCRIPT_FILENAME'])
- . DIRECTORY_SEPARATOR;
- $prependAbsPaths = $_SERVER['DOCUMENT_ROOT'];
-
- $sources = array();
- $goodFiles = array();
- $hasBadSource = false;
-
- $allowDirs = isset($options['allowDirs'])
- ? $options['allowDirs']
- : MINIFY_BASE_DIR;
-
- foreach ($files as $file) {
- // prepend appropriate string for abs/rel paths
- $file = ($file[0] === '/' ? $prependAbsPaths : $prependRelPaths) . $file;
- // make sure a real file!
- $file = realpath($file);
- // don't allow unsafe or duplicate files
- if (parent::_fileIsSafe($file, $allowDirs)
- && !in_array($file, $goodFiles))
- {
- $goodFiles[] = $file;
- $srcOptions = array(
- 'filepath' => $file
- );
- $this->sources[] = new Minify_Source($srcOptions);
- } else {
- $hasBadSource = true;
- break;
- }
- }
- if ($hasBadSource) {
- $this->sources = array();
- }
- if (! MINIFY_REWRITE_CSS_URLS) {
- $options['rewriteCssUris'] = false;
- }
- return $options;
- }
-
- private static function _setupDefines()
- {
- $defaults = array(
- 'MINIFY_BASE_DIR' => realpath($_SERVER['DOCUMENT_ROOT'])
- ,'MINIFY_ENCODING' => 'utf-8'
- ,'MINIFY_MAX_FILES' => 16
- ,'MINIFY_REWRITE_CSS_URLS' => true
- ,'MINIFY_USE_CACHE' => true
- );
- foreach ($defaults as $const => $val) {
- if (! defined($const)) {
- define($const, $val);
- }
- }
- }
-}
-
diff --git a/min/lib/Minify/HTML.php b/min/lib/Minify/HTML.php
deleted file mode 100644
index fb5c1e9..0000000
--- a/min/lib/Minify/HTML.php
+++ /dev/null
@@ -1,245 +0,0 @@
-
- */
-class Minify_HTML {
-
- /**
- * "Minify" an HTML page
- *
- * @param string $html
- *
- * @param array $options
- *
- * 'cssMinifier' : (optional) callback function to process content of STYLE
- * elements.
- *
- * 'jsMinifier' : (optional) callback function to process content of SCRIPT
- * elements. Note: the type attribute is ignored.
- *
- * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
- * unset, minify will sniff for an XHTML doctype.
- *
- * @return string
- */
- public static function minify($html, $options = array()) {
- $min = new Minify_HTML($html, $options);
- return $min->process();
- }
-
-
- /**
- * Create a minifier object
- *
- * @param string $html
- *
- * @param array $options
- *
- * 'cssMinifier' : (optional) callback function to process content of STYLE
- * elements.
- *
- * 'jsMinifier' : (optional) callback function to process content of SCRIPT
- * elements. Note: the type attribute is ignored.
- *
- * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
- * unset, minify will sniff for an XHTML doctype.
- *
- * @return null
- */
- public function __construct($html, $options = array())
- {
- $this->_html = str_replace("\r\n", "\n", trim($html));
- if (isset($options['xhtml'])) {
- $this->_isXhtml = (bool)$options['xhtml'];
- }
- if (isset($options['cssMinifier'])) {
- $this->_cssMinifier = $options['cssMinifier'];
- }
- if (isset($options['jsMinifier'])) {
- $this->_jsMinifier = $options['jsMinifier'];
- }
- }
-
-
- /**
- * Minify the markeup given in the constructor
- *
- * @return string
- */
- public function process()
- {
- if ($this->_isXhtml === null) {
- $this->_isXhtml = (false !== strpos($this->_html, '_html);
-
- // fill placeholders
- $this->_html = str_replace(
- array_keys($this->_placeholders)
- ,array_values($this->_placeholders)
- ,$this->_html
- );
- return $this->_html;
- }
-
- protected function _commentCB($m)
- {
- return (0 === strpos($m[1], '[') || false !== strpos($m[1], '_replacementHash . count($this->_placeholders) . '%';
- $this->_placeholders[$placeholder] = $content;
- return $placeholder;
- }
-
- protected $_isXhtml = null;
- protected $_replacementHash = null;
- protected $_placeholders = array();
- protected $_cssMinifier = null;
- protected $_jsMinifier = null;
-
- protected function _outsideTagCB($m)
- {
- return '>' . preg_replace('/^\\s+|\\s+$/', ' ', $m[1]) . '<';
- }
-
- protected function _removePreCB($m)
- {
- return $this->_reservePlace($m[1]);
- }
-
- protected function _removeTextareaCB($m)
- {
- return $this->_reservePlace($m[1]);
- }
-
- protected function _removeStyleCB($m)
- {
- $openStyle = $m[1];
- $css = $m[2];
- // remove HTML comments
- $css = preg_replace('/(?:^\\s*\\s*$)/', '', $css);
-
- // remove CDATA section markers
- $css = $this->_removeCdata($css);
-
- // minify
- $minifier = $this->_cssMinifier
- ? $this->_cssMinifier
- : 'trim';
- $css = call_user_func($minifier, $css);
-
- return $this->_reservePlace($this->_needsCdata($css)
- ? "{$openStyle}/**/"
- : "{$openStyle}{$css}"
- );
- }
-
- protected function _removeScriptCB($m)
- {
- $openScript = $m[2];
- $js = $m[3];
-
- // whitespace surrounding? preserve at least one space
- $ws1 = ($m[1] === '') ? '' : ' ';
- $ws2 = ($m[4] === '') ? '' : ' ';
-
- // remove HTML comments (and ending "//" if present)
- $js = preg_replace('/(?:^\\s*\\s*$)/', '', $js);
-
- // remove CDATA section markers
- $js = $this->_removeCdata($js);
-
- // minify
- $minifier = $this->_jsMinifier
- ? $this->_jsMinifier
- : 'trim';
- $js = call_user_func($minifier, $js);
-
- return $this->_reservePlace($this->_needsCdata($js)
- ? "{$ws1}{$openScript}/**/{$ws2}"
- : "{$ws1}{$openScript}{$js}{$ws2}"
- );
- }
-
- protected function _removeCdata($str)
- {
- return (false !== strpos($str, ''), '', $str)
- : $str;
- }
-
- protected function _needsCdata($str)
- {
- return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
- }
-}
diff --git a/min/lib/Minify/ImportProcessor.php b/min/lib/Minify/ImportProcessor.php
deleted file mode 100644
index 0d6d90a..0000000
--- a/min/lib/Minify/ImportProcessor.php
+++ /dev/null
@@ -1,157 +0,0 @@
-
- */
-class Minify_ImportProcessor {
-
- public static $filesIncluded = array();
-
- public static function process($file)
- {
- self::$filesIncluded = array();
- self::$_isCss = (strtolower(substr($file, -4)) === '.css');
- $obj = new Minify_ImportProcessor(dirname($file));
- return $obj->_getContent($file);
- }
-
- // allows callback funcs to know the current directory
- private $_currentDir = null;
-
- // allows _importCB to write the fetched content back to the obj
- private $_importedContent = '';
-
- private static $_isCss = null;
-
- private function __construct($currentDir)
- {
- $this->_currentDir = $currentDir;
- }
-
- private function _getContent($file)
- {
- $file = realpath($file);
- if (! $file
- || in_array($file, self::$filesIncluded)
- || false === ($content = @file_get_contents($file))
- ) {
- // file missing, already included, or failed read
- return '';
- }
- self::$filesIncluded[] = realpath($file);
- $this->_currentDir = dirname($file);
-
- // remove UTF-8 BOM if present
- if (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3)) {
- $content = substr($content, 3);
- }
- // ensure uniform EOLs
- $content = str_replace("\r\n", "\n", $content);
-
- // process @imports
- $content = preg_replace_callback(
- '/
- @import\\s+
- (?:url\\(\\s*)? # maybe url(
- [\'"]? # maybe quote
- (.*?) # 1 = URI
- [\'"]? # maybe end quote
- (?:\\s*\\))? # maybe )
- ([a-zA-Z,\\s]*)? # 2 = media list
- ; # end token
- /x'
- ,array($this, '_importCB')
- ,$content
- );
-
- if (self::$_isCss) {
- // rewrite remaining relative URIs
- $content = preg_replace_callback(
- '/url\\(\\s*([^\\)\\s]+)\\s*\\)/'
- ,array($this, '_urlCB')
- ,$content
- );
- }
-
- return $this->_importedContent . $content;
- }
-
- private function _importCB($m)
- {
- $url = $m[1];
- $mediaList = preg_replace('/\\s+/', '', $m[2]);
-
- if (strpos($url, '://') > 0) {
- // protocol, leave in place for CSS, comment for JS
- return self::$_isCss
- ? $m[0]
- : "/* Minify_ImportProcessor will not include remote content */";
- }
- if ('/' === $url[0]) {
- // protocol-relative or root path
- $url = ltrim($url, '/');
- $file = realpath($_SERVER['DOCUMENT_ROOT']) . DIRECTORY_SEPARATOR
- . strtr($url, '/', DIRECTORY_SEPARATOR);
- } else {
- // relative to current path
- $file = $this->_currentDir . DIRECTORY_SEPARATOR
- . strtr($url, '/', DIRECTORY_SEPARATOR);
- }
- $obj = new Minify_ImportProcessor(dirname($file));
- $content = $obj->_getContent($file);
- if ('' === $content) {
- // failed. leave in place for CSS, comment for JS
- return self::$_isCss
- ? $m[0]
- : "/* Minify_ImportProcessor could not fetch '{$file}' */";;
- }
- return (!self::$_isCss || preg_match('@(?:^$|\\ball\\b)@', $mediaList))
- ? $content
- : "@media {$mediaList} {\n{$content}\n}\n";
- }
-
- private function _urlCB($m)
- {
- // $m[1] is either quoted or not
- $quote = ($m[1][0] === "'" || $m[1][0] === '"')
- ? $m[1][0]
- : '';
- $url = ($quote === '')
- ? $m[1]
- : substr($m[1], 1, strlen($m[1]) - 2);
- if ('/' !== $url[0]) {
- if (strpos($url, '//') > 0) {
- // probably starts with protocol, do not alter
- } else {
- // prepend path with current dir separator (OS-independent)
- $path = $this->_currentDir
- . DIRECTORY_SEPARATOR . strtr($url, '/', DIRECTORY_SEPARATOR);
- // strip doc root
- $path = substr($path, strlen(realpath($_SERVER['DOCUMENT_ROOT'])));
- // fix to absolute URL
- $url = strtr($path, '/\\', '//');
- // remove /./ and /../ where possible
- $url = str_replace('/./', '/', $url);
- // inspired by patch from Oleg Cherniy
- do {
- $url = preg_replace('@/[^/]+/\\.\\./@', '/', $url, 1, $changed);
- } while ($changed);
- }
- }
- return "url({$quote}{$url}{$quote})";
- }
-}
diff --git a/min/lib/Minify/Lines.php b/min/lib/Minify/Lines.php
deleted file mode 100644
index 50fe413..0000000
--- a/min/lib/Minify/Lines.php
+++ /dev/null
@@ -1,130 +0,0 @@
-
- * @author Adam Pedersen (Issue 55 fix)
- */
-class Minify_Lines {
-
- /**
- * Add line numbers in C-style comments
- *
- * This uses a very basic parser easily fooled by comment tokens inside
- * strings or regexes, but, otherwise, generally clean code will not be
- * mangled. URI rewriting can also be performed.
- *
- * @param string $content
- *
- * @param array $options available options:
- *
- * 'id': (optional) string to identify file. E.g. file name/path
- *
- * 'currentDir': (default null) if given, this is assumed to be the
- * directory of the current CSS file. Using this, minify will rewrite
- * all relative URIs in import/url declarations to correctly point to
- * the desired files, and prepend a comment with debugging information about
- * this process.
- *
- * @return string
- */
- public static function minify($content, $options = array())
- {
- $id = (isset($options['id']) && $options['id'])
- ? $options['id']
- : '';
- $content = str_replace("\r\n", "\n", $content);
- $lines = explode("\n", $content);
- $numLines = count($lines);
- // determine left padding
- $padTo = strlen($numLines);
- $inComment = false;
- $i = 0;
- $newLines = array();
- while (null !== ($line = array_shift($lines))) {
- if (('' !== $id) && (0 == $i % 50)) {
- array_push($newLines, '', "/* {$id} */", '');
- }
- ++$i;
- $newLines[] = self::_addNote($line, $i, $inComment, $padTo);
- $inComment = self::_eolInComment($line, $inComment);
- }
- $content = implode("\n", $newLines) . "\n";
-
- // check for desired URI rewriting
- if (isset($options['currentDir'])) {
- Minify_CSS_UriRewriter::$debugText = '';
- $content = Minify_CSS_UriRewriter::rewrite(
- $content
- ,$options['currentDir']
- ,isset($options['docRoot']) ? $options['docRoot'] : $_SERVER['DOCUMENT_ROOT']
- ,isset($options['symlinks']) ? $options['symlinks'] : array()
- );
- $content = "/* Minify_CSS_UriRewriter::\$debugText\n\n"
- . Minify_CSS_UriRewriter::$debugText . "*/\n"
- . $content;
- }
-
- return $content;
- }
-
- /**
- * Is the parser within a C-style comment at the end of this line?
- *
- * @param string $line current line of code
- *
- * @param bool $inComment was the parser in a comment at the
- * beginning of the line?
- *
- * @return bool
- */
- private static function _eolInComment($line, $inComment)
- {
- while (strlen($line)) {
- $search = $inComment
- ? '*/'
- : '/*';
- $pos = strpos($line, $search);
- if (false === $pos) {
- return $inComment;
- } else {
- if ($pos == 0
- || ($inComment
- ? substr($line, $pos, 3)
- : substr($line, $pos-1, 3)) != '*/*')
- {
- $inComment = ! $inComment;
- }
- $line = substr($line, $pos + 2);
- }
- }
- return $inComment;
- }
-
- /**
- * Prepend a comment (or note) to the given line
- *
- * @param string $line current line of code
- *
- * @param string $note content of note/comment
- *
- * @param bool $inComment was the parser in a comment at the
- * beginning of the line?
- *
- * @param int $padTo minimum width of comment
- *
- * @return string
- */
- private static function _addNote($line, $note, $inComment, $padTo)
- {
- return $inComment
- ? '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' *| ' . $line
- : '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' */ ' . $line;
- }
-}
diff --git a/min/lib/Minify/Logger.php b/min/lib/Minify/Logger.php
deleted file mode 100644
index 7844eea..0000000
--- a/min/lib/Minify/Logger.php
+++ /dev/null
@@ -1,45 +0,0 @@
-
- */
-class Minify_Logger {
-
- /**
- * Set logger object.
- *
- * The object should have a method "log" that accepts a value as 1st argument and
- * an optional string label as the 2nd.
- *
- * @param mixed $obj or a "falsey" value to disable
- * @return null
- */
- public static function setLogger($obj = null) {
- self::$_logger = $obj
- ? $obj
- : null;
- }
-
- /**
- * Pass a message to the logger (if set)
- *
- * @param string $msg message to log
- * @return null
- */
- public static function log($msg, $label = 'Minify') {
- if (! self::$_logger) return;
- self::$_logger->log($msg, $label);
- }
-
- /**
- * @var mixed logger object (like FirePHP) or null (i.e. no logger available)
- */
- private static $_logger = null;
-}
diff --git a/min/lib/Minify/Packer.php b/min/lib/Minify/Packer.php
deleted file mode 100644
index 949c3ee..0000000
--- a/min/lib/Minify/Packer.php
+++ /dev/null
@@ -1,37 +0,0 @@
-pack());
- }
-}
diff --git a/min/lib/Minify/Source.php b/min/lib/Minify/Source.php
deleted file mode 100644
index 5a85d10..0000000
--- a/min/lib/Minify/Source.php
+++ /dev/null
@@ -1,187 +0,0 @@
-
- */
-class Minify_Source {
-
- /**
- * @var int time of last modification
- */
- public $lastModified = null;
-
- /**
- * @var callback minifier function specifically for this source.
- */
- public $minifier = null;
-
- /**
- * @var array minification options specific to this source.
- */
- public $minifyOptions = null;
-
- /**
- * @var string full path of file
- */
- public $filepath = null;
-
- /**
- * @var string HTTP Content Type (Minify requires one of the constants Minify::TYPE_*)
- */
- public $contentType = null;
-
- /**
- * Create a Minify_Source
- *
- * In the $spec array(), you can either provide a 'filepath' to an existing
- * file (existence will not be checked!) or give 'id' (unique string for
- * the content), 'content' (the string content) and 'lastModified'
- * (unixtime of last update).
- *
- * As a shortcut, the controller will replace "//" at the beginning
- * of a filepath with $_SERVER['DOCUMENT_ROOT'] . '/'.
- *
- * @param array $spec options
- */
- public function __construct($spec)
- {
- if (isset($spec['filepath'])) {
- if (0 === strpos($spec['filepath'], '//')) {
- $spec['filepath'] = $_SERVER['DOCUMENT_ROOT'] . substr($spec['filepath'], 1);
- }
- $segments = explode('.', $spec['filepath']);
- $ext = strtolower(array_pop($segments));
- switch ($ext) {
- case 'js' : $this->contentType = 'application/x-javascript';
- break;
- case 'css' : $this->contentType = 'text/css';
- break;
- case 'htm' : // fallthrough
- case 'html' : $this->contentType = 'text/html';
- break;
- }
- $this->filepath = $spec['filepath'];
- $this->_id = $spec['filepath'];
- $this->lastModified = filemtime($spec['filepath'])
- // offset for Windows uploaders with out of sync clocks
- + round(Minify::$uploaderHoursBehind * 3600);
- } elseif (isset($spec['id'])) {
- $this->_id = 'id::' . $spec['id'];
- if (isset($spec['content'])) {
- $this->_content = $spec['content'];
- } else {
- $this->_getContentFunc = $spec['getContentFunc'];
- }
- $this->lastModified = isset($spec['lastModified'])
- ? $spec['lastModified']
- : time();
- }
- if (isset($spec['contentType'])) {
- $this->contentType = $spec['contentType'];
- }
- if (isset($spec['minifier'])) {
- $this->minifier = $spec['minifier'];
- }
- if (isset($spec['minifyOptions'])) {
- $this->minifyOptions = $spec['minifyOptions'];
- }
- }
-
- /**
- * Get content
- *
- * @return string
- */
- public function getContent()
- {
- $content = (null !== $this->filepath)
- ? file_get_contents($this->filepath)
- : ((null !== $this->_content)
- ? $this->_content
- : call_user_func($this->_getContentFunc, $this->_id)
- );
- // remove UTF-8 BOM if present
- return (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3))
- ? substr($content, 3)
- : $content;
- }
-
- /**
- * Get id
- *
- * @return string
- */
- public function getId()
- {
- return $this->_id;
- }
-
- /**
- * Verifies a single minification call can handle all sources
- *
- * @param array $sources Minify_Source instances
- *
- * @return bool true iff there no sources with specific minifier preferences.
- */
- public static function haveNoMinifyPrefs($sources)
- {
- foreach ($sources as $source) {
- if (null !== $source->minifier
- || null !== $source->minifyOptions) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Get unique string for a set of sources
- *
- * @param array $sources Minify_Source instances
- *
- * @return string
- */
- public static function getDigest($sources)
- {
- foreach ($sources as $source) {
- $info[] = array(
- $source->_id, $source->minifier, $source->minifyOptions
- );
- }
- return md5(serialize($info));
- }
-
- /**
- * Get content type from a group of sources
- *
- * This is called if the user doesn't pass in a 'contentType' options
- *
- * @param array $sources Minify_Source instances
- *
- * @return string content type. e.g. 'text/css'
- */
- public static function getContentType($sources)
- {
- foreach ($sources as $source) {
- if ($source->contentType !== null) {
- return $source->contentType;
- }
- }
- return 'text/plain';
- }
-
- protected $_content = null;
- protected $_getContentFunc = null;
- protected $_id = null;
-}
-
diff --git a/min/lib/Minify/YUICompressor.php b/min/lib/Minify/YUICompressor.php
deleted file mode 100644
index 7cb61ad..0000000
--- a/min/lib/Minify/YUICompressor.php
+++ /dev/null
@@ -1,139 +0,0 @@
-
- * Minify_YUICompressor::$jarFile = '/path/to/yuicompressor-2.3.5.jar';
- * Minify_YUICompressor::$tempDir = '/tmp';
- * $code = Minify_YUICompressor::minifyJs(
- * $code
- * ,array('nomunge' => true, 'line-break' => 1000)
- * );
- *
- *
- * @todo unit tests, $options docs
- *
- * @package Minify
- * @author Stephen Clay
- */
-class Minify_YUICompressor {
-
- /**
- * Filepath of the YUI Compressor jar file. This must be set before
- * calling minifyJs() or minifyCss().
- *
- * @var string
- */
- public static $jarFile = null;
-
- /**
- * Writable temp directory. This must be set before calling minifyJs()
- * or minifyCss().
- *
- * @var string
- */
- public static $tempDir = null;
-
- /**
- * Filepath of "java" executable (may be needed if not in shell's PATH)
- *
- * @var string
- */
- public static $javaExecutable = 'java';
-
- /**
- * Minify a Javascript string
- *
- * @param string $js
- *
- * @param array $options (verbose is ignored)
- *
- * @see http://www.julienlecomte.net/yuicompressor/README
- *
- * @return string
- */
- public static function minifyJs($js, $options = array())
- {
- return self::_minify('js', $js, $options);
- }
-
- /**
- * Minify a CSS string
- *
- * @param string $css
- *
- * @param array $options (verbose is ignored)
- *
- * @see http://www.julienlecomte.net/yuicompressor/README
- *
- * @return string
- */
- public static function minifyCss($css, $options = array())
- {
- return self::_minify('css', $css, $options);
- }
-
- private static function _minify($type, $content, $options)
- {
- self::_prepare();
- if (! ($tmpFile = tempnam(self::$tempDir, 'yuic_'))) {
- throw new Exception('Minify_YUICompressor : could not create temp file.');
- }
- file_put_contents($tmpFile, $content);
- exec(self::_getCmd($options, $type, $tmpFile), $output);
- unlink($tmpFile);
- return implode("\n", $output);
- }
-
- private static function _getCmd($userOptions, $type, $tmpFile)
- {
- $o = array_merge(
- array(
- 'charset' => ''
- ,'line-break' => 5000
- ,'type' => $type
- ,'nomunge' => false
- ,'preserve-semi' => false
- ,'disable-optimizations' => false
- )
- ,$userOptions
- );
- $cmd = self::$javaExecutable . ' -jar ' . escapeshellarg(self::$jarFile)
- . " --type {$type}"
- . (preg_match('/^[a-zA-Z\\-]+$/', $o['charset'])
- ? " --charset {$o['charset']}"
- : '')
- . (is_numeric($o['line-break']) && $o['line-break'] >= 0
- ? ' --line-break ' . (int)$o['line-break']
- : '');
- if ($type === 'js') {
- foreach (array('nomunge', 'preserve-semi', 'disable-optimizations') as $opt) {
- $cmd .= $o[$opt]
- ? " --{$opt}"
- : '';
- }
- }
- return $cmd . ' ' . escapeshellarg($tmpFile);
- }
-
- private static function _prepare()
- {
- if (! is_file(self::$jarFile)
- || ! is_dir(self::$tempDir)
- || ! is_writable(self::$tempDir)
- ) {
- throw new Exception('Minify_YUICompressor : $jarFile and $tempDir must be set.');
- }
- }
-}
-
diff --git a/min/lib/Solar/Dir.php b/min/lib/Solar/Dir.php
deleted file mode 100644
index 37f7169..0000000
--- a/min/lib/Solar/Dir.php
+++ /dev/null
@@ -1,199 +0,0 @@
-
- *
- * @license http://opensource.org/licenses/bsd-license.php BSD
- *
- * @version $Id: Dir.php 2926 2007-11-09 16:25:44Z pmjones $
- *
- */
-class Solar_Dir {
-
- /**
- *
- * The OS-specific temporary directory location.
- *
- * @var string
- *
- */
- protected static $_tmp;
-
- /**
- *
- * Hack for [[php::is_dir() | ]] that checks the include_path.
- *
- * Use this to see if a directory exists anywhere in the include_path.
- *
- * {{code: php
- * $dir = Solar_Dir::exists('path/to/dir')
- * if ($dir) {
- * $files = scandir($dir);
- * } else {
- * echo "Not found in the include-path.";
- * }
- * }}
- *
- * @param string $dir Check for this directory in the include_path.
- *
- * @return mixed If the directory exists in the include_path, returns the
- * absolute path; if not, returns boolean false.
- *
- */
- public static function exists($dir)
- {
- // no file requested?
- $dir = trim($dir);
- if (! $dir) {
- return false;
- }
-
- // using an absolute path for the file?
- // dual check for Unix '/' and Windows '\',
- // or Windows drive letter and a ':'.
- $abs = ($dir[0] == '/' || $dir[0] == '\\' || $dir[1] == ':');
- if ($abs && is_dir($dir)) {
- return $dir;
- }
-
- // using a relative path on the file
- $path = explode(PATH_SEPARATOR, ini_get('include_path'));
- foreach ($path as $base) {
- // strip Unix '/' and Windows '\'
- $target = rtrim($base, '\\/') . DIRECTORY_SEPARATOR . $dir;
- if (is_dir($target)) {
- return $target;
- }
- }
-
- // never found it
- return false;
- }
-
- /**
- *
- * "Fixes" a directory string for the operating system.
- *
- * Use slashes anywhere you need a directory separator. Then run the
- * string through fixdir() and the slashes will be converted to the
- * proper separator (for example '\' on Windows).
- *
- * Always adds a final trailing separator.
- *
- * @param string $dir The directory string to 'fix'.
- *
- * @return string The "fixed" directory string.
- *
- */
- public static function fix($dir)
- {
- $dir = str_replace('/', DIRECTORY_SEPARATOR, $dir);
- return rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
- }
-
- /**
- *
- * Convenience method for dirname() and higher-level directories.
- *
- * @param string $file Get the dirname() of this file.
- *
- * @param int $up Move up in the directory structure this many
- * times, default 0.
- *
- * @return string The dirname() of the file.
- *
- */
- public static function name($file, $up = 0)
- {
- $dir = dirname($file);
- while ($up --) {
- $dir = dirname($dir);
- }
- return $dir;
- }
-
- /**
- *
- * Returns the OS-specific directory for temporary files.
- *
- * @param string $sub Add this subdirectory to the returned temporary
- * directory name.
- *
- * @return string The temporary directory path.
- *
- */
- public static function tmp($sub = '')
- {
- // find the tmp dir if needed
- if (! Solar_Dir::$_tmp) {
-
- // use the system if we can
- if (function_exists('sys_get_temp_dir')) {
- $tmp = sys_get_temp_dir();
- } else {
- $tmp = Solar_Dir::_tmp();
- }
-
- // remove trailing separator and save
- Solar_Dir::$_tmp = rtrim($tmp, DIRECTORY_SEPARATOR);
- }
-
- // do we have a subdirectory request?
- $sub = trim($sub);
- if ($sub) {
- // remove leading and trailing separators, and force exactly
- // one trailing separator
- $sub = trim($sub, DIRECTORY_SEPARATOR)
- . DIRECTORY_SEPARATOR;
- }
-
- return Solar_Dir::$_tmp . DIRECTORY_SEPARATOR . $sub;
- }
-
- /**
- *
- * Returns the OS-specific temporary directory location.
- *
- * @return string The temp directory path.
- *
- */
- protected static function _tmp()
- {
- // non-Windows system?
- if (strtolower(substr(PHP_OS, 0, 3)) != 'win') {
- $tmp = empty($_ENV['TMPDIR']) ? getenv('TMPDIR') : $_ENV['TMPDIR'];
- if ($tmp) {
- return $tmp;
- } else {
- return '/tmp';
- }
- }
-
- // Windows 'TEMP'
- $tmp = empty($_ENV['TEMP']) ? getenv('TEMP') : $_ENV['TEMP'];
- if ($tmp) {
- return $tmp;
- }
-
- // Windows 'TMP'
- $tmp = empty($_ENV['TMP']) ? getenv('TMP') : $_ENV['TMP'];
- if ($tmp) {
- return $tmp;
- }
-
- // Windows 'windir'
- $tmp = empty($_ENV['windir']) ? getenv('windir') : $_ENV['windir'];
- if ($tmp) {
- return $tmp;
- }
-
- // final fallback for Windows
- return getenv('SystemRoot') . '\\temp';
- }
-}
\ No newline at end of file
diff --git a/min/pageBuffer.php b/min/pageBuffer.php
deleted file mode 100644
index fb09705..0000000
--- a/min/pageBuffer.php
+++ /dev/null
@@ -1,93 +0,0 @@
- $value) {
- header($prop === '_responseCode' ? $value : "{$prop}: {$value}");
- }
- return $out['content'];
-}
-
-/**
- * Get a stepped version of time with a random-like constistent offset
- *
- * This emulates the mtime() of a file being modified regularly. The offset
- * allows you to use the same period in several instances without them all
- * stepping up simultaneously. Offsets should be evenly distributed.
- *
- * @param int $period in seconds
- * @param string $instanceId
- * @return int
- */
-function _steppedTime($period, $instanceId = '') {
- $hashInt = hexdec(substr(md5($instanceId), 0, 8));
- $t = $_SERVER['REQUEST_TIME'];
- return $t - ($t % $period) - ($hashInt % $period);
-}
-
-ob_start('ob_minify_page');
diff --git a/min/pageConfig.php b/min/pageConfig.php
deleted file mode 100644
index 60144c0..0000000
--- a/min/pageConfig.php
+++ /dev/null
@@ -1,82 +0,0 @@
- environment,
- * select the option "Adjust remote timestamp with DST".
- * @link http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time
- */
-$min_uploaderHoursBehind = 0;
-
-
-/**
- * Path to Minify's lib folder. If you happen to move it, change
- * this accordingly.
- */
-$min_libPath = dirname(__FILE__) . '/lib';
-
-
-// try to disable output_compression (may not have an effect)
-ini_set('zlib.output_compression', '0');
diff --git a/min/test/_inc.php b/min/test/_inc.php
deleted file mode 100644
index 0a77395..0000000
--- a/min/test/_inc.php
+++ /dev/null
@@ -1,182 +0,0 @@
-%s : %s
", $class, $outMode, $html);
- return (bool)$test;
-}
-
-function h($txt)
-{
- return htmlspecialchars($txt);
-}
-
-function e($value)
-{
- return htmlspecialchars(var_export($value, 1));
-}
-
-function _gzdecode($data)
-{
- $filename = $error = '';
- return _phpman_gzdecode($data, $filename, $error);
-}
-
-// http://www.php.net/manual/en/function.gzdecode.php#82930
-function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
-{
- $len = strlen($data);
- if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
- $error = "Not in GZIP format.";
- return null; // Not GZIP format (See RFC 1952)
- }
- $method = ord(substr($data,2,1)); // Compression method
- $flags = ord(substr($data,3,1)); // Flags
- if ($flags & 31 != $flags) {
- $error = "Reserved bits not allowed.";
- return null;
- }
- // NOTE: $mtime may be negative (PHP integer limitations)
- $mtime = unpack("V", substr($data,4,4));
- $mtime = $mtime[1];
- $xfl = substr($data,8,1);
- $os = substr($data,8,1);
- $headerlen = 10;
- $extralen = 0;
- $extra = "";
- if ($flags & 4) {
- // 2-byte length prefixed EXTRA data in header
- if ($len - $headerlen - 2 < 8) {
- return false; // invalid
- }
- $extralen = unpack("v",substr($data,8,2));
- $extralen = $extralen[1];
- if ($len - $headerlen - 2 - $extralen < 8) {
- return false; // invalid
- }
- $extra = substr($data,10,$extralen);
- $headerlen += 2 + $extralen;
- }
- $filenamelen = 0;
- $filename = "";
- if ($flags & 8) {
- // C-style string
- if ($len - $headerlen - 1 < 8) {
- return false; // invalid
- }
- $filenamelen = strpos(substr($data,$headerlen),chr(0));
- if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
- return false; // invalid
- }
- $filename = substr($data,$headerlen,$filenamelen);
- $headerlen += $filenamelen + 1;
- }
- $commentlen = 0;
- $comment = "";
- if ($flags & 16) {
- // C-style string COMMENT data in header
- if ($len - $headerlen - 1 < 8) {
- return false; // invalid
- }
- $commentlen = strpos(substr($data,$headerlen),chr(0));
- if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
- return false; // Invalid header format
- }
- $comment = substr($data,$headerlen,$commentlen);
- $headerlen += $commentlen + 1;
- }
- $headercrc = "";
- if ($flags & 2) {
- // 2-bytes (lowest order) of CRC32 on header present
- if ($len - $headerlen - 2 < 8) {
- return false; // invalid
- }
- $calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
- $headercrc = unpack("v", substr($data,$headerlen,2));
- $headercrc = $headercrc[1];
- if ($headercrc != $calccrc) {
- $error = "Header checksum failed.";
- return false; // Bad header CRC
- }
- $headerlen += 2;
- }
- // GZIP FOOTER
- $datacrc = unpack("V",substr($data,-8,4));
- $datacrc = sprintf('%u',$datacrc[1] & 0xFFFFFFFF);
- $isize = unpack("V",substr($data,-4));
- $isize = $isize[1];
- // decompression:
- $bodylen = $len-$headerlen-8;
- if ($bodylen < 1) {
- // IMPLEMENTATION BUG!
- return null;
- }
- $body = substr($data,$headerlen,$bodylen);
- $data = "";
- if ($bodylen > 0) {
- switch ($method) {
- case 8:
- // Currently the only supported compression method:
- $data = gzinflate($body,$maxlength);
- break;
- default:
- $error = "Unknown compression method.";
- return false;
- }
- } // zero-byte body content is allowed
- // Verifiy CRC32
- $crc = sprintf("%u",crc32($data));
- $crcOK = $crc == $datacrc;
- $lenOK = $isize == strlen($data);
- if (!$lenOK || !$crcOK) {
- $error = ( $lenOK ? '' : 'Length check FAILED. ') . ( $crcOK ? '' : 'Checksum FAILED.');
- return false;
- }
- return $data;
-}
\ No newline at end of file
diff --git a/min/test/index.php b/min/test/index.php
deleted file mode 100644
index 850f553..0000000
--- a/min/test/index.php
+++ /dev/null
@@ -1,161 +0,0 @@
-
-Minify server environment/config tests
-
-Minify server environment/config tests
-
-Document Root
-
- Original $_SERVER['DOCUMENT_ROOT']
(set by PHP/env)
- = e($origDocRoot) ?>
- Current $_SERVER['DOCUMENT_ROOT']
(altered by Minify/your config.php)
- = e($_SERVER['DOCUMENT_ROOT']) ?>
- realpath($_SERVER['DOCUMENT_ROOT'])
- = e(realpath($_SERVER['DOCUMENT_ROOT'])) ?>
- __FILE__
- = e(__FILE__) ?>
-
-!NOTE : \$_SERVER['SUBDOMAIN_DOCUMENT_ROOT']
"
- . " is set to " . e($_SERVER['SUBDOMAIN_DOCUMENT_ROOT']) . ". You may need to set"
- . " \$min_documentRoot
to this in config.php.";
-}
-
-$passed = assertTrue(
- 0 === strpos(__FILE__, realpath($_SERVER['DOCUMENT_ROOT']))
- ,'__FILE__
is within realpath of docroot'
-);
-if ($passed) {
- $thisPath = str_replace(
- '\\'
- ,'/'
- ,substr(__FILE__, strlen(realpath($_SERVER['DOCUMENT_ROOT'])))
- );
-} else {
- // try HTTP requests anyway
- $thisPath = '/min/test/index.php';
-}
-
-if ($thisPath !== '/min/test/index.php') {
- echo "!NOTE : /min/ is not directly inside DOCUMENT_ROOT.
";
-}
-
-?>
-
-HTTP Encoding
-!WARN : Local HTTP request failed. Testing cannot continue.";
-} else {
- if ('1' === $oc) {
- echo "!NOTE : zlib.output_compression"
- . " was enabled by default, but this is OK if the next test passes.
";
- }
-
- $fp = fopen($thisUrl . '?hello=1', 'r', false, stream_context_create(array(
- 'http' => array(
- 'method' => "GET",
- 'header' => "Accept-Encoding: deflate, gzip\r\n"
- )
- )));
-
- $meta = stream_get_meta_data($fp);
-
- $passed = true;
- foreach ($meta['wrapper_data'] as $i => $header) {
- if ((preg_match('@^Content-Length: (\\d+)$@i', $header, $m) && $m[1] !== '6')
- || preg_match('@^Content-Encoding:@i', $header, $m)
- ) {
- $passed = false;
- break;
- }
- }
- if ($passed && stream_get_contents($fp) !== 'World!') {
- $passed = false;
- }
- assertTrue(
- $passed
- ,'PHP/server can serve non-encoded content'
- );
- fclose($fp);
-
- if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) {
- if (! $passed) {
- echo "Returned content should be 6 bytes and not HTTP encoded. "
- . "Headers returned by: " . h($thisUrl . '?hello=1') . "
"
- . "" . h(var_export($meta['wrapper_data'], 1)) . "
";
- }
- }
-}
-
-if (assertTrue(function_exists('gzencode'), 'gzencode() exists')) {
- // test encode/decode
- $data = str_repeat(md5('testing'), 160);
- $gzipped = @gzencode($data, 6);
- assertTrue(is_string($gzipped) && strlen($gzipped) < strlen($data), 'gzip works');
- assertTrue(_gzdecode($gzipped) === $data, 'gzdecode works');
-}
-
-?>
-
-Cache
-
- $min_cachePath
in config.php
- = e($min_cachePath) ?>
- Resulting cache object
- = e($cache) ?>
-
-!NOTE : Consider setting \$min_cachePath
for best performance.";
-}
-
-$data = str_repeat(md5('testing'), 160);
-$id = 'Minify_test_cache';
-assertTrue(true === $cache->store($id, $data), 'Cache store');
-assertTrue(strlen($data) === $cache->getSize($id), 'Cache getSize');
-assertTrue(true === $cache->isValid($id, $_SERVER['REQUEST_TIME'] - 10), 'Cache isValid');
-ob_start();
-$cache->display($id);
-$displayed = ob_get_contents();
-ob_end_clean();
-assertTrue($data === $displayed, 'Cache display');
-assertTrue($data === $cache->fetch($id), 'Cache fetch');
diff --git a/min/test/pageBuffer.php b/min/test/pageBuffer.php
deleted file mode 100644
index cf0249a..0000000
--- a/min/test/pageBuffer.php
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- css Zen Garden: The Beauty in CSS Design
-
-
-
-
-
-
-
-
-
-
-
-Browser != IE
-
-
-
- White space is important here!
-
-
-
A demonstration of what can be accomplished visually through CSS -based design. Select any style sheet from the list to load it into this page.
-
Download the sample html file and css file
-
-
-
-
-
-
\ No newline at end of file
diff --git a/min/utils.php b/min/utils.php
deleted file mode 100644
index 0d8ecf4..0000000
--- a/min/utils.php
+++ /dev/null
@@ -1,97 +0,0 @@
-
- *
- *
- *
- *
- * If you do not want ampersands as HTML entities, set Minify_Build::$ampersand = "&"
- * before using this function.
- *
- * @param string $group a key (or comma-separated keys) from groupsConfig.php
- * @param boolean $forceAmpersand (default false) Set to true if the RewriteRule
- * directives in .htaccess are functional. This will remove the "?" from URIs, making them
- * more cacheable by proxies.
- * @return string
- */
-function Minify_groupUri($group, $forceAmpersand = false)
-{
- $path = $forceAmpersand
- ? "/g={$group}"
- : "/?g={$group}";
- return _Minify_getBuild($group)->uri(
- '/' . basename(dirname(__FILE__)) . $path
- ,$forceAmpersand
- );
-}
-
-
-/**
- * Get the last modification time of the source js/css files used by Minify to
- * build the page.
- *
- * If you're caching the output of Minify_groupUri(), you'll want to rebuild
- * the cache if it's older than this timestamp.
- *
- *
- * // simplistic HTML cache system
- * $file = '/path/to/cache/file';
- * if (! file_exists($file) || filemtime($file) < Minify_groupsMtime(array('js', 'css'))) {
- * // (re)build cache
- * $page = buildPage(); // this calls Minify_groupUri() for js and css
- * file_put_contents($file, $page);
- * echo $page;
- * exit();
- * }
- * readfile($file);
- *
- *
- * @param array $groups an array of keys from groupsConfig.php
- * @return int Unix timestamp of the latest modification
- */
-function Minify_groupsMtime($groups)
-{
- $max = 0;
- foreach ((array)$groups as $group) {
- $max = max($max, _Minify_getBuild($group)->lastModified);
- }
- return $max;
-}
-
-/**
- * @param string $group a key (or comma-separated keys) from groupsConfig.php
- * @return Minify_Build
- * @private
- */
-function _Minify_getBuild($group)
-{
- static $builds = array();
- static $gc = false;
- if (false === $gc) {
- $gc = (require dirname(__FILE__) . '/groupsConfig.php');
- }
- if (! isset($builds[$group])) {
- $sources = array();
- foreach (explode(',', $group) as $key) {
- $val = $gc[$key];
- if (is_array($val)) {
- array_splice($sources, count($sources), 0, $val);
- } else {
- $sources[] = $val;
- }
- }
- $builds[$group] = new Minify_Build($sources);
- }
- return $builds[$group];
-}
diff --git a/min_extras/README.txt b/min_extras/README.txt
deleted file mode 100644
index 025946f..0000000
--- a/min_extras/README.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-DO NOT leave this directory on a site in production. Some scripts within may be
-resource intensive and some allow file uploads.
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-This directory contains testing scripts and a few example applications built
-with the Minify library classes.
-
-ab_tests/
- Windows batch files used to benchmark various Minify and Apache
- configurations using Apache ab.
-
-tools/
- Two utility web apps that upload a file, alter it, and send it back to the
- user. One applies HTTP encoding, the other minifies CSS/JS/HTML.
diff --git a/min_extras/ab_tests/README.txt b/min_extras/ab_tests/README.txt
deleted file mode 100644
index be242ef..0000000
--- a/min_extras/ab_tests/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-This is a little AB testing setup for Windows. Before committing any non-trivial
-change, these tests should be run so "results_summary.txt" will be an up-to-date
-document of each revision's performance.
-
-Before testing make sure all cache locations are correct.
-
-Double-click "test_all.bat" to run the tests. At the end, "results_summary.txt"
-will be opened in notepad. For more details see "results.txt".
-
-Delete "results.txt" before committing. We don't need this much info in svn.
\ No newline at end of file
diff --git a/min_extras/ab_tests/_delimiter b/min_extras/ab_tests/_delimiter
deleted file mode 100644
index 091a8cd..0000000
--- a/min_extras/ab_tests/_delimiter
+++ /dev/null
@@ -1,3 +0,0 @@
-
---------------------------------------------------------------------------------
-
diff --git a/min_extras/ab_tests/ideal_php/before.php b/min_extras/ab_tests/ideal_php/before.php
deleted file mode 100644
index fc5c77d..0000000
--- a/min_extras/ab_tests/ideal_php/before.php
+++ /dev/null
@@ -1,25 +0,0 @@
-)[^>]*$|^#(\w+)$/;
-
-// Is it a simple selector
-var isSimple = /^.[^:#\[\.]*$/;
-
-jQuery.fn = jQuery.prototype = {
- init: function( selector, context ) {
- // Make sure that a selection was provided
- selector = selector || document;
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this[0] = selector;
- this.length = 1;
- return this;
-
- // Handle HTML strings
- } else if ( typeof selector == "string" ) {
- // Are we dealing with HTML string or an ID?
- var match = quickExpr.exec( selector );
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] )
- selector = jQuery.clean( [ match[1] ], context );
-
- // HANDLE: $("#id")
- else {
- var elem = document.getElementById( match[3] );
-
- // Make sure an element was located
- if ( elem )
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id != match[3] )
- return jQuery().find( selector );
-
- // Otherwise, we inject the element directly into the jQuery object
- else {
- this[0] = elem;
- this.length = 1;
- return this;
- }
-
- else
- selector = [];
- }
-
- // HANDLE: $(expr, [context])
- // (which is just equivalent to: $(content).find(expr)
- } else
- return new jQuery( context ).find( selector );
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) )
- return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
-
- return this.setArray(
- // HANDLE: $(array)
- selector.constructor == Array && selector ||
-
- // HANDLE: $(arraylike)
- // Watch for when an array-like object, contains DOM nodes, is passed in as the selector
- (selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||
-
- // HANDLE: $(*)
- [ selector ] );
- },
-
- // The current version of jQuery being used
- jquery: "1.2.3",
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- // The number of elements contained in the matched element set
- length: 0,
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == undefined ?
-
- // Return a 'clean' array
- jQuery.makeArray( this ) :
-
- // Return just the object
- this[ num ];
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems ) {
- // Build a new jQuery matched element set
- var ret = jQuery( elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Force the current matched set of elements to become
- // the specified array of elements (destroying the stack in the process)
- // You should use pushStack() in order to do this, but maintain the stack
- setArray: function( elems ) {
- // Resetting the length to 0, then using the native Array push
- // is a super-fast way to populate an object with array-like properties
- this.length = 0;
- Array.prototype.push.apply( this, elems );
-
- return this;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
- var ret = -1;
-
- // Locate the position of the desired element
- this.each(function(i){
- if ( this == elem )
- ret = i;
- });
-
- return ret;
- },
-
- attr: function( name, value, type ) {
- var options = name;
-
- // Look for the case where we're accessing a style value
- if ( name.constructor == String )
- if ( value == undefined )
- return this.length && jQuery[ type || "attr" ]( this[0], name ) || undefined;
-
- else {
- options = {};
- options[ name ] = value;
- }
-
- // Check to see if we're setting style values
- return this.each(function(i){
- // Set all the styles
- for ( name in options )
- jQuery.attr(
- type ?
- this.style :
- this,
- name, jQuery.prop( this, options[ name ], type, i, name )
- );
- });
- },
-
- css: function( key, value ) {
- // ignore negative width and height values
- if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
- value = undefined;
- return this.attr( key, value, "curCSS" );
- },
-
- text: function( text ) {
- if ( typeof text != "object" && text != null )
- return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
-
- var ret = "";
-
- jQuery.each( text || this, function(){
- jQuery.each( this.childNodes, function(){
- if ( this.nodeType != 8 )
- ret += this.nodeType != 1 ?
- this.nodeValue :
- jQuery.fn.text( [ this ] );
- });
- });
-
- return ret;
- },
-
- wrapAll: function( html ) {
- if ( this[0] )
- // The elements to wrap the target around
- jQuery( html, this[0].ownerDocument )
- .clone()
- .insertBefore( this[0] )
- .map(function(){
- var elem = this;
-
- while ( elem.firstChild )
- elem = elem.firstChild;
-
- return elem;
- })
- .append(this);
-
- return this;
- },
-
- wrapInner: function( html ) {
- return this.each(function(){
- jQuery( this ).contents().wrapAll( html );
- });
- },
-
- wrap: function( html ) {
- return this.each(function(){
- jQuery( this ).wrapAll( html );
- });
- },
-
- append: function() {
- return this.domManip(arguments, true, false, function(elem){
- if (this.nodeType == 1)
- this.appendChild( elem );
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, true, function(elem){
- if (this.nodeType == 1)
- this.insertBefore( elem, this.firstChild );
- });
- },
-
- before: function() {
- return this.domManip(arguments, false, false, function(elem){
- this.parentNode.insertBefore( elem, this );
- });
- },
-
- after: function() {
- return this.domManip(arguments, false, true, function(elem){
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- },
-
- end: function() {
- return this.prevObject || jQuery( [] );
- },
-
- find: function( selector ) {
- var elems = jQuery.map(this, function(elem){
- return jQuery.find( selector, elem );
- });
-
- return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
- jQuery.unique( elems ) :
- elems );
- },
-
- clone: function( events ) {
- // Do the clone
- var ret = this.map(function(){
- if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
- // IE copies events bound via attachEvent when
- // using cloneNode. Calling detachEvent on the
- // clone will also remove the events from the orignal
- // In order to get around this, we use innerHTML.
- // Unfortunately, this means some modifications to
- // attributes in IE that are actually only stored
- // as properties will not be copied (such as the
- // the name attribute on an input).
- var clone = this.cloneNode(true),
- container = document.createElement("div");
- container.appendChild(clone);
- return jQuery.clean([container.innerHTML])[0];
- } else
- return this.cloneNode(true);
- });
-
- // Need to set the expando to null on the cloned set if it exists
- // removeData doesn't work here, IE removes it from the original as well
- // this is primarily for IE but the data expando shouldn't be copied over in any browser
- var clone = ret.find("*").andSelf().each(function(){
- if ( this[ expando ] != undefined )
- this[ expando ] = null;
- });
-
- // Copy the events from the original to the clone
- if ( events === true )
- this.find("*").andSelf().each(function(i){
- if (this.nodeType == 3)
- return;
- var events = jQuery.data( this, "events" );
-
- for ( var type in events )
- for ( var handler in events[ type ] )
- jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
- });
-
- // Return the cloned set
- return ret;
- },
-
- filter: function( selector ) {
- return this.pushStack(
- jQuery.isFunction( selector ) &&
- jQuery.grep(this, function(elem, i){
- return selector.call( elem, i );
- }) ||
-
- jQuery.multiFilter( selector, this ) );
- },
-
- not: function( selector ) {
- if ( selector.constructor == String )
- // test special case where just one selector is passed in
- if ( isSimple.test( selector ) )
- return this.pushStack( jQuery.multiFilter( selector, this, true ) );
- else
- selector = jQuery.multiFilter( selector, this );
-
- var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
- return this.filter(function() {
- return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
- });
- },
-
- add: function( selector ) {
- return !selector ? this : this.pushStack( jQuery.merge(
- this.get(),
- selector.constructor == String ?
- jQuery( selector ).get() :
- selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ?
- selector : [selector] ) );
- },
-
- is: function( selector ) {
- return selector ?
- jQuery.multiFilter( selector, this ).length > 0 :
- false;
- },
-
- hasClass: function( selector ) {
- return this.is( "." + selector );
- },
-
- val: function( value ) {
- if ( value == undefined ) {
-
- if ( this.length ) {
- var elem = this[0];
-
- // We need to handle select boxes special
- if ( jQuery.nodeName( elem, "select" ) ) {
- var index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type == "select-one";
-
- // Nothing was selected
- if ( index < 0 )
- return null;
-
- // Loop through all the selected options
- for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
- var option = options[ i ];
-
- if ( option.selected ) {
- // Get the specifc value for the option
- value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
-
- // We don't need an array for one selects
- if ( one )
- return value;
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
-
- // Everything else, we just grab the value
- } else
- return (this[0].value || "").replace(/\r/g, "");
-
- }
-
- return undefined;
- }
-
- return this.each(function(){
- if ( this.nodeType != 1 )
- return;
-
- if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
- this.checked = (jQuery.inArray(this.value, value) >= 0 ||
- jQuery.inArray(this.name, value) >= 0);
-
- else if ( jQuery.nodeName( this, "select" ) ) {
- var values = value.constructor == Array ?
- value :
- [ value ];
-
- jQuery( "option", this ).each(function(){
- this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
- jQuery.inArray( this.text, values ) >= 0);
- });
-
- if ( !values.length )
- this.selectedIndex = -1;
-
- } else
- this.value = value;
- });
- },
-
- html: function( value ) {
- return value == undefined ?
- (this.length ?
- this[0].innerHTML :
- null) :
- this.empty().append( value );
- },
-
- replaceWith: function( value ) {
- return this.after( value ).remove();
- },
-
- eq: function( i ) {
- return this.slice( i, i + 1 );
- },
-
- slice: function() {
- return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function(elem, i){
- return callback.call( elem, i, elem );
- }));
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- },
-
- data: function( key, value ){
- var parts = key.split(".");
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value == null ) {
- var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- if ( data == undefined && this.length )
- data = jQuery.data( this[0], key );
-
- return data == null && parts[1] ?
- this.data( parts[0] ) :
- data;
- } else
- return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
- jQuery.data( this, key, value );
- });
- },
-
- removeData: function( key ){
- return this.each(function(){
- jQuery.removeData( this, key );
- });
- },
-
- domManip: function( args, table, reverse, callback ) {
- var clone = this.length > 1, elems;
-
- return this.each(function(){
- if ( !elems ) {
- elems = jQuery.clean( args, this.ownerDocument );
-
- if ( reverse )
- elems.reverse();
- }
-
- var obj = this;
-
- if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
- obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
-
- var scripts = jQuery( [] );
-
- jQuery.each(elems, function(){
- var elem = clone ?
- jQuery( this ).clone( true )[0] :
- this;
-
- // execute all scripts after the elements have been injected
- if ( jQuery.nodeName( elem, "script" ) ) {
- scripts = scripts.add( elem );
- } else {
- // Remove any inner scripts for later evaluation
- if ( elem.nodeType == 1 )
- scripts = scripts.add( jQuery( "script", elem ).remove() );
-
- // Inject the elements into the document
- callback.call( obj, elem );
- }
- });
-
- scripts.each( evalScript );
- });
- }
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.prototype.init.prototype = jQuery.prototype;
-
-function evalScript( i, elem ) {
- if ( elem.src )
- jQuery.ajax({
- url: elem.src,
- async: false,
- dataType: "script"
- });
-
- else
- jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
-
- if ( elem.parentNode )
- elem.parentNode.removeChild( elem );
-}
-
-jQuery.extend = jQuery.fn.extend = function() {
- // copy reference to target object
- var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
-
- // Handle a deep copy situation
- if ( target.constructor == Boolean ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target != "object" && typeof target != "function" )
- target = {};
-
- // extend jQuery itself if only one argument is passed
- if ( length == 1 ) {
- target = this;
- i = 0;
- }
-
- for ( ; i < length; i++ )
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null )
- // Extend the base object
- for ( var name in options ) {
- // Prevent never-ending loop
- if ( target === options[ name ] )
- continue;
-
- // Recurse if we're merging object values
- if ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )
- target[ name ] = jQuery.extend( target[ name ], options[ name ] );
-
- // Don't bring in undefined values
- else if ( options[ name ] != undefined )
- target[ name ] = options[ name ];
-
- }
-
- // Return the modified object
- return target;
-};
-
-var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {};
-
-// exclude the following css properties to add px
-var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
-
-jQuery.extend({
- noConflict: function( deep ) {
- window.$ = _$;
-
- if ( deep )
- window.jQuery = _jQuery;
-
- return jQuery;
- },
-
- // See test/unit/core.js for details concerning this function.
- isFunction: function( fn ) {
- return !!fn && typeof fn != "string" && !fn.nodeName &&
- fn.constructor != Array && /function/i.test( fn + "" );
- },
-
- // check if an element is in a (or is an) XML document
- isXMLDoc: function( elem ) {
- return elem.documentElement && !elem.body ||
- elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
- },
-
- // Evalulates a script in a global context
- globalEval: function( data ) {
- data = jQuery.trim( data );
-
- if ( data ) {
- // Inspired by code by Andrea Giammarchi
- // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
- var head = document.getElementsByTagName("head")[0] || document.documentElement,
- script = document.createElement("script");
-
- script.type = "text/javascript";
- if ( jQuery.browser.msie )
- script.text = data;
- else
- script.appendChild( document.createTextNode( data ) );
-
- head.appendChild( script );
- head.removeChild( script );
- }
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
- },
-
- cache: {},
-
- data: function( elem, name, data ) {
- elem = elem == window ?
- windowData :
- elem;
-
- var id = elem[ expando ];
-
- // Compute a unique ID for the element
- if ( !id )
- id = elem[ expando ] = ++uuid;
-
- // Only generate the data cache if we're
- // trying to access or manipulate it
- if ( name && !jQuery.cache[ id ] )
- jQuery.cache[ id ] = {};
-
- // Prevent overriding the named cache with undefined values
- if ( data != undefined )
- jQuery.cache[ id ][ name ] = data;
-
- // Return the named cache data, or the ID for the element
- return name ?
- jQuery.cache[ id ][ name ] :
- id;
- },
-
- removeData: function( elem, name ) {
- elem = elem == window ?
- windowData :
- elem;
-
- var id = elem[ expando ];
-
- // If we want to remove a specific section of the element's data
- if ( name ) {
- if ( jQuery.cache[ id ] ) {
- // Remove the section of cache data
- delete jQuery.cache[ id ][ name ];
-
- // If we've removed all the data, remove the element's cache
- name = "";
-
- for ( name in jQuery.cache[ id ] )
- break;
-
- if ( !name )
- jQuery.removeData( elem );
- }
-
- // Otherwise, we want to remove all of the element's data
- } else {
- // Clean up the element expando
- try {
- delete elem[ expando ];
- } catch(e){
- // IE has trouble directly removing the expando
- // but it's ok with using removeAttribute
- if ( elem.removeAttribute )
- elem.removeAttribute( expando );
- }
-
- // Completely remove the data cache
- delete jQuery.cache[ id ];
- }
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- if ( args ) {
- if ( object.length == undefined ) {
- for ( var name in object )
- if ( callback.apply( object[ name ], args ) === false )
- break;
- } else
- for ( var i = 0, length = object.length; i < length; i++ )
- if ( callback.apply( object[ i ], args ) === false )
- break;
-
- // A special, fast, case for the most common use of each
- } else {
- if ( object.length == undefined ) {
- for ( var name in object )
- if ( callback.call( object[ name ], name, object[ name ] ) === false )
- break;
- } else
- for ( var i = 0, length = object.length, value = object[0];
- i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
- }
-
- return object;
- },
-
- prop: function( elem, value, type, i, name ) {
- // Handle executable functions
- if ( jQuery.isFunction( value ) )
- value = value.call( elem, i );
-
- // Handle passing in a number to a CSS property
- return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
- value + "px" :
- value;
- },
-
- className: {
- // internal only, use addClass("class")
- add: function( elem, classNames ) {
- jQuery.each((classNames || "").split(/\s+/), function(i, className){
- if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
- elem.className += (elem.className ? " " : "") + className;
- });
- },
-
- // internal only, use removeClass("class")
- remove: function( elem, classNames ) {
- if (elem.nodeType == 1)
- elem.className = classNames != undefined ?
- jQuery.grep(elem.className.split(/\s+/), function(className){
- return !jQuery.className.has( classNames, className );
- }).join(" ") :
- "";
- },
-
- // internal only, use is(".class")
- has: function( elem, className ) {
- return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
- }
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var old = {};
- // Remember the old values, and insert the new ones
- for ( var name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- callback.call( elem );
-
- // Revert the old values
- for ( var name in options )
- elem.style[ name ] = old[ name ];
- },
-
- css: function( elem, name, force ) {
- if ( name == "width" || name == "height" ) {
- var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
-
- function getWH() {
- val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
- var padding = 0, border = 0;
- jQuery.each( which, function() {
- padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
- border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
- });
- val -= Math.round(padding + border);
- }
-
- if ( jQuery(elem).is(":visible") )
- getWH();
- else
- jQuery.swap( elem, props, getWH );
-
- return Math.max(0, val);
- }
-
- return jQuery.curCSS( elem, name, force );
- },
-
- curCSS: function( elem, name, force ) {
- var ret;
-
- // A helper method for determining if an element's values are broken
- function color( elem ) {
- if ( !jQuery.browser.safari )
- return false;
-
- var ret = document.defaultView.getComputedStyle( elem, null );
- return !ret || ret.getPropertyValue("color") == "";
- }
-
- // We need to handle opacity special in IE
- if ( name == "opacity" && jQuery.browser.msie ) {
- ret = jQuery.attr( elem.style, "opacity" );
-
- return ret == "" ?
- "1" :
- ret;
- }
- // Opera sometimes will give the wrong display answer, this fixes it, see #2037
- if ( jQuery.browser.opera && name == "display" ) {
- var save = elem.style.outline;
- elem.style.outline = "0 solid black";
- elem.style.outline = save;
- }
-
- // Make sure we're using the right name for getting the float value
- if ( name.match( /float/i ) )
- name = styleFloat;
-
- if ( !force && elem.style && elem.style[ name ] )
- ret = elem.style[ name ];
-
- else if ( document.defaultView && document.defaultView.getComputedStyle ) {
-
- // Only "float" is needed here
- if ( name.match( /float/i ) )
- name = "float";
-
- name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
-
- var getComputedStyle = document.defaultView.getComputedStyle( elem, null );
-
- if ( getComputedStyle && !color( elem ) )
- ret = getComputedStyle.getPropertyValue( name );
-
- // If the element isn't reporting its values properly in Safari
- // then some display: none elements are involved
- else {
- var swap = [], stack = [];
-
- // Locate all of the parent display: none elements
- for ( var a = elem; a && color(a); a = a.parentNode )
- stack.unshift(a);
-
- // Go through and make them visible, but in reverse
- // (It would be better if we knew the exact display type that they had)
- for ( var i = 0; i < stack.length; i++ )
- if ( color( stack[ i ] ) ) {
- swap[ i ] = stack[ i ].style.display;
- stack[ i ].style.display = "block";
- }
-
- // Since we flip the display style, we have to handle that
- // one special, otherwise get the value
- ret = name == "display" && swap[ stack.length - 1 ] != null ?
- "none" :
- ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || "";
-
- // Finally, revert the display styles back
- for ( var i = 0; i < swap.length; i++ )
- if ( swap[ i ] != null )
- stack[ i ].style.display = swap[ i ];
- }
-
- // We should always get a number back from opacity
- if ( name == "opacity" && ret == "" )
- ret = "1";
-
- } else if ( elem.currentStyle ) {
- var camelCase = name.replace(/\-(\w)/g, function(all, letter){
- return letter.toUpperCase();
- });
-
- ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
- // Remember the original values
- var style = elem.style.left, runtimeStyle = elem.runtimeStyle.left;
-
- // Put in the new values to get a computed value out
- elem.runtimeStyle.left = elem.currentStyle.left;
- elem.style.left = ret || 0;
- ret = elem.style.pixelLeft + "px";
-
- // Revert the changed values
- elem.style.left = style;
- elem.runtimeStyle.left = runtimeStyle;
- }
- }
-
- return ret;
- },
-
- clean: function( elems, context ) {
- var ret = [];
- context = context || document;
- // !context.createElement fails in IE with an error but returns typeof 'object'
- if (typeof context.createElement == 'undefined')
- context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
-
- jQuery.each(elems, function(i, elem){
- if ( !elem )
- return;
-
- if ( elem.constructor == Number )
- elem = elem.toString();
-
- // Convert html string into DOM nodes
- if ( typeof elem == "string" ) {
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
- return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
- all :
- front + ">" + tag + ">";
- });
-
- // Trim whitespace, otherwise indexOf won't work as expected
- var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
-
- var wrap =
- // option or optgroup
- !tags.indexOf("", "" ] ||
-
- !tags.indexOf("", "" ] ||
-
- tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
- [ 1, "" ] ||
-
- !tags.indexOf("", " " ] ||
-
- // matched above
- (!tags.indexOf(" ", " " ] ||
-
- !tags.indexOf("", " " ] ||
-
- // IE can't serialize and
-