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 + '/' - + ' ' - + '
  • '; - } - /** - * 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('') - .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(/&/, '&'); - $('#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

    - - - -
    - -

    Create a list of Javascript or CSS files (or 1 is fine) you'd like to combine -and click [Update].

    - -
    -
    - -
    - -

    - -
    - -

    Minify URI

    -

    Place this URI in your HTML to serve the files above combined, minified, compressed and -with cache headers.

    - - - -
    URI/min (opens in new window)
    HTML
    - -

    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, '_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']); - $this->_placeholders = array(); - - // replace SCRIPTs (and minify) with placeholders - $this->_html = preg_replace_callback( - '/(\\s*)(]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i' - ,array($this, '_removeScriptCB') - ,$this->_html); - - // replace STYLEs (and minify) with placeholders - $this->_html = preg_replace_callback( - '/\\s*(]*?>)([\\s\\S]*?)<\\/style>\\s*/i' - ,array($this, '_removeStyleCB') - ,$this->_html); - - // remove HTML comments (not containing IE conditional comments). - $this->_html = preg_replace_callback( - '//' - ,array($this, '_commentCB') - ,$this->_html); - - // replace PREs with placeholders - $this->_html = preg_replace_callback('/\\s*(]*?>[\\s\\S]*?<\\/pre>)\\s*/i' - ,array($this, '_removePreCB') - ,$this->_html); - - // replace TEXTAREAs with placeholders - $this->_html = preg_replace_callback( - '/\\s*(]*?>[\\s\\S]*?<\\/textarea>)\\s*/i' - ,array($this, '_removeTextareaCB') - ,$this->_html); - - // trim each line. - // @todo take into account attribute values that span multiple lines. - $this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html); - - // remove ws around block/undisplayed elements - $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body' - .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' - .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta' - .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)' - .'|ul)\\b[^>]*>)/i', '$1', $this->_html); - - // remove ws outside of all elements - $this->_html = preg_replace_callback( - '/>([^<]+)_html); - - // use newlines before 1st attribute in open tags (to limit line lengths) - $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_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)
    -
    -
    Current $_SERVER['DOCUMENT_ROOT'] (altered by Minify/your config.php)
    -
    -
    realpath($_SERVER['DOCUMENT_ROOT'])
    -
    -
    __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
    -
    -
    Resulting cache object
    -
    -
    -!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 + ">"; - }); - - // 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 - - \ No newline at end of file diff --git a/min_extras/examples/1/m.php b/min_extras/examples/1/m.php deleted file mode 100644 index 922aa03..0000000 --- a/min_extras/examples/1/m.php +++ /dev/null @@ -1,13 +0,0 @@ - $groupsSources - ,'setExpires' => time() + 86400 * 365 -)); diff --git a/min_extras/examples/2/_groupsSources.php b/min_extras/examples/2/_groupsSources.php deleted file mode 100644 index efb9085..0000000 --- a/min_extras/examples/2/_groupsSources.php +++ /dev/null @@ -1,11 +0,0 @@ - array( - "{$base}/lib.js" - ,"{$base}/test space.js" - ) - ,'css' => array("{$base}/test.css") -); -unset($base); \ No newline at end of file diff --git a/min_extras/examples/2/index.php b/min_extras/examples/2/index.php deleted file mode 100644 index 31a8fc1..0000000 --- a/min_extras/examples/2/index.php +++ /dev/null @@ -1,91 +0,0 @@ - - - - - Minify Example 2 - - - - - - -

    Note: You should always enable caching using -Minify::setCache(). For the examples this can be set in -config.php.

    - - -

    Minify Example 2: Minifying Everything

    - -

    In this example, external Javascript and CSS minification is identical to -example 1, but here Minify is also used to minify and serve the HTML, including -the contents of all <style> and <script> -elements.

    - -

    As the document is XHTML, Minify_HTML places the 2nd <script> -element in a CDATA section because it contains "<". The output is valid XHTML.

    - -

    Validate XHTML

    - -

    Minify tests

    -
      -
    • FAILPASS
    • -
    • FAIL
    • -
    • FAIL
    • -
    - -

    Test client cache

    -

    When you click here to reload the page, your browser should -not have to re-download any files.

    - -

    extras index »

    - - - - - -lastModified - ,$cssBuild->lastModified -); - -Minify::serve('Page', array( - 'content' => $content - ,'id' => __FILE__ - ,'lastModifiedTime' => $pageLastUpdate - // also minify the CSS/JS inside the HTML - ,'minifyAll' => true -)); \ No newline at end of file diff --git a/min_extras/examples/2/m.php b/min_extras/examples/2/m.php deleted file mode 100644 index 922aa03..0000000 --- a/min_extras/examples/2/m.php +++ /dev/null @@ -1,13 +0,0 @@ - $groupsSources - ,'setExpires' => time() + 86400 * 365 -)); diff --git a/min_extras/examples/index.php b/min_extras/examples/index.php deleted file mode 100644 index e5762fe..0000000 --- a/min_extras/examples/index.php +++ /dev/null @@ -1,3 +0,0 @@ - *:first-child {margin-top:0;} - -h1 { - color: #00cc00; - font-size: 20px; -} -h2 { - color: #009900; - font-size: 17px; -} -h1, h2 {margin:1.3em 0 .3em;} - -p { - margin:0 0 1em; -} - -ul, li { - padding:0; - margin:0; - display:block; - font-family: monospace; -} - -#cssFail span { - display: none; -} \ No newline at end of file diff --git a/min_extras/hydrogen_logo.gif b/min_extras/hydrogen_logo.gif deleted file mode 100644 index 7b9e645cf8a942a7f9f5b8e772d8a7198982e729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmV;f0#W@(Nk%w1VKM+N0K@CcxnVH_ez`eb_ z*4EbE-rlyv*2t@?A^8LV2LS&7EC2ui05SkB000I5ASI4uDP9alAOL_67;~9)ZI>Jd zOxRX+k4LAn!At-c&TVPqAP_Pp>ZxQ}JB>-jTB=MM9j=W5*obKx0OMTBARcVm1CcQW zgSEgbep>}d0)YZG2pA#(1$;CZ2owQ-OBnM@ z0?(Ld(~?-rHlf=ZFiCW^0k*EfZ2HVnh-!nX-+EYUXeD9PM$*IJEHw4>l)_HDJ`V@A zk%8z5xHM)SzG)*T3DY!A9t^vZr^|_+Y5c-ymE(<&)dbU6xOCx?310QOvmuXmLVQaq z=pJE>Nq}wL4vHgZj>!b6CU{vfhD=!kW8Z*0!w+mj$rhf5*( zBp9916aT!QIBu{q${h9aLB>&hr14%W99U=(hZkVT=L8htwekr9*h#1Z4?X}P1QA9c Uks*E~pr8T^F2E3lA|U_(J7>fm+yDRo diff --git a/min_extras/tools/encodeFile.php b/min_extras/tools/encodeFile.php deleted file mode 100644 index 3aad3dd..0000000 --- a/min_extras/tools/encodeFile.php +++ /dev/null @@ -1,33 +0,0 @@ - file_get_contents($_FILES['subject']['tmp_name']) - ,'method' => $_POST['method'] - )); - header('Content-Type: application/octet-stream'); - header('Content-Transfer-Encoding: binary'); - header("Content-Disposition: attachment; filename=\"{$_FILES['subject']['name']}." - . ($_POST['method'] == 'deflate' - ? 'zd' - : ($_POST['method'] == 'gzip' - ? 'zg' - : 'zc' - ) - ) . '"'); - $he->encode(9); - echo $he->getContent(); - exit(); -} - -?> -
    -

    Encode
    -as - - -

    -
    \ No newline at end of file diff --git a/min_extras/tools/minifyFile.php b/min_extras/tools/minifyFile.php deleted file mode 100644 index 363f741..0000000 --- a/min_extras/tools/minifyFile.php +++ /dev/null @@ -1,45 +0,0 @@ - array('Minify_CSS', 'minify') - ,'jsMinifier' => array('JSMin', 'minify') - ); - } - $func = array('Minify_' . $type, 'minify'); - - $out = call_user_func($func, file_get_contents($_FILES['subject']['tmp_name']), $arg2); - - header('Content-Type: application/octet-stream'); - header('Content-Transfer-Encoding: binary'); - header('Content-Disposition: attachment; filename="' - . preg_replace('/\\.(\w+)$/', '.min.$1', $_FILES['subject']['name']) - . '"'); - - //@unlink($_FILES['subject']['tmp_name']); - echo $out; - exit(); -} - -?> -
    -

    Minify
    - -

    -
    \ No newline at end of file diff --git a/min_extras/tools/minifyTextarea.php b/min_extras/tools/minifyTextarea.php deleted file mode 100644 index 2c830ed..0000000 --- a/min_extras/tools/minifyTextarea.php +++ /dev/null @@ -1,88 +0,0 @@ -]*>)@i' - ,'$1' - ,$textIn - ); - } - - $sourceSpec['content'] = $textIn; - $sourceSpec['id'] = 'foo'; - if (isset($_POST['minJs'])) { - $sourceSpec['minifyOptions']['jsMinifier'] = array('JSMin', 'minify'); - } - if (isset($_POST['minCss'])) { - $sourceSpec['minifyOptions']['cssMinifier'] = array('Minify_CSS', 'minify'); - } - $source = new Minify_Source($sourceSpec); - Minify_Logger::setLogger(FirePHP::getInstance(true)); - Minify::serve('Files', array( - 'files' => $source - ,'contentType' => Minify::TYPE_HTML - )); - exit(); -} - -$classes = array('Minify_HTML', 'Minify_CSS', 'JSMin', 'JSMinPlus'); - -if (isset($_POST['method']) && in_array($_POST['method'], $classes)) { - - $arg2 = null; - if ($_POST['method'] === 'Minify_HTML') { - $arg2 = array( - 'cssMinifier' => array('Minify_CSS', 'minify') - ,'jsMinifier' => array('JSMin', 'minify') - ); - } - $func = array($_POST['method'], 'minify'); - $inOutBytes[0] = strlen($textIn); - $textOut = call_user_func($func, $textIn, $arg2); - $inOutBytes[1] = strlen($textOut); -} - -header('Content-Type: text/html; charset=utf-8'); -?> -minifyTextarea - - Bytes in{$inOutBytes[0]} (after line endings normalized to \\n) - Bytes out{$inOutBytes[1]} (" . round(100 * $inOutBytes[1] / $inOutBytes[0]) . "%) - - "; -} -?> -
    -

    -

    Minify with: - - - -

    -

    ...or this HTML to the browser. Also minify: - : -. - -

    -
    diff --git a/min_extras/tools/minifyUrl.php b/min_extras/tools/minifyUrl.php deleted file mode 100644 index df1cac6..0000000 --- a/min_extras/tools/minifyUrl.php +++ /dev/null @@ -1,159 +0,0 @@ - $type - ,'sent' => $sentType - ,'charset' => $charset - ); -} - -if (isset($_POST['url'])) { - - require '../config.php'; - - $url = trim(getPost('url')); - $ua = trim(getPost('ua')); - $cook = trim(getPost('cook')); - - if (! preg_match('@^https?://@', $url)) { - die('HTTP(s) only.'); - } - - $httpOpts = array( - 'max_redirects' => 0 - ,'timeout' => 3 - ); - if ($ua !== '') { - $httpOpts['user_agent'] = $ua; - } - if ($cook !== '') { - $httpOpts['header'] = "Cookie: {$cook}\r\n"; - } - $ctx = stream_context_create(array( - 'http' => $httpOpts - )); - - // fetch - if (! ($fp = @fopen($url, 'r', false, $ctx))) { - die('Couldn\'t open URL.'); - } - $meta = stream_get_meta_data($fp); - $content = stream_get_contents($fp); - fclose($fp); - - // get type info - $type = sniffType($meta['wrapper_data']); - if (! $type['minify']) { - die('Unrecognized Content-Type: ' . $type['sent']); - } - - if ($type['minify'] === 'text/html' - && isset($_POST['addBase']) - && ! preg_match('@]*>)@i' - ,'$1' - ,$content - ); - } - - $sourceSpec['content'] = $content; - $sourceSpec['id'] = 'foo'; - - if ($type['minify'] === 'text/html') { - if (isset($_POST['minJs'])) { - $sourceSpec['minifyOptions']['jsMinifier'] = array('JSMin', 'minify'); - } - if (isset($_POST['minCss'])) { - $sourceSpec['minifyOptions']['cssMinifier'] = array('Minify_CSS', 'minify'); - } - } - - $source = new Minify_Source($sourceSpec); - - $sendType = 'text/plain'; - if ($type['minify'] === 'text/html' && ! isset($_POST['asText'])) { - $sendType = $type['sent']; - } - if ($type['charset']) { - $sendType .= ';charset=' . $type['charset']; - } - header('Content-Type: ' . $sendType); - // using combine instead of serve because it allows us to specify a - // Content-Type like application/xhtml+xml IF we need to - echo Minify::combine(array($source), array( - 'contentType' => $type['minify'] - )); - exit(); -} - -header('Content-Type: text/html; charset=utf-8'); - -$ua = get_magic_quotes_gpc() - ? stripslashes($_SERVER['HTTP_USER_AGENT']) - : $_SERVER['HTTP_USER_AGENT']; - -?> -Minify URL - -

    Warning! Please do not place this application on a public site. This should be used -only for testing.

    - -

    Fetch and Minify a URL

    -

    This tool will retrieve the contents of a URL and minify it. -The fetched resource Content-Type will determine the minifier used.

    - -
    -

    -

    - -
    HTML options -

    If the resource above is sent with an (x)HTML Content-Type, the following options will apply:

    -
      -
    • -
    • -
    • -
    • -
    -
    - -
    Retreival options -
      -
    • -
    • -
    -
    - -
    diff --git a/min_extras/tools/testRewriteUri.php b/min_extras/tools/testRewriteUri.php deleted file mode 100644 index b40d9d8..0000000 --- a/min_extras/tools/testRewriteUri.php +++ /dev/null @@ -1,58 +0,0 @@ -"; -} - -// validate user POST (no arrays and fix slashes) -if (! empty($_POST)) { - foreach ($_POST as $name => $val) { - if (! is_string($val)) { - unset($_POST[$name]); - continue; - } - if (get_magic_quotes_gpc()) { - $_POST[$name] = stripslashes($val); - } - } -} - -$defaultCurrentDir = dirname(__FILE__); -$defaultDocRoot = realpath($_SERVER['DOCUMENT_ROOT']); -$defaultSymLink = '//symlinkPath'; -$defaultSymTarget = ($defaultCurrentDir[0] === '/') ? '/tmp' : 'C:\\WINDOWS\\Temp'; -$defaultCss = "url(hello.gif)\nurl(../hello.gif)\nurl(../../hello.gif)\nurl(up/hello.gif)"; - -$out = ''; - -if (isset($_POST['css'])) { - require '../config.php'; - $symlinks = array(); - if ('' !== ($target = getPost('symTarget'))) { - $symlinks[getPost('symLink')] = $target; - } - $css = Minify_CSS_UriRewriter::rewrite( - getPost('css') - , getPost('currentDir') - , getPost('docRoot') - , $symlinks - ); - $out = "
    " . h($css) . '
    '; -} - -?> -

    Test Minify_CSS_UriRewriter::rewrite()

    -
    -
    -
    -
    -

    -

    -
    - \ No newline at end of file diff --git a/min_unit_tests/HTTP_ConditionalGet/2.php b/min_unit_tests/HTTP_ConditionalGet/2.php deleted file mode 100644 index 9b66f24..0000000 --- a/min_unit_tests/HTTP_ConditionalGet/2.php +++ /dev/null @@ -1,44 +0,0 @@ - $lastModified -)); -if ($cg->cacheIsValid) { - $cg->sendHeaders(); - // we're done - exit(); -} - -// generate content -$title = 'Last-Modified is known : add Content-Length'; -$explain = ' -

    Here, like the first example, we know the Last-Modified time, -but we also want to set the Content-Length to increase cacheability and allow -HTTP persistent connections. Instead of sending headers immediately, we first -generate our content, then use setContentLength(strlen($content)) -to add the header. Then finally call sendHeaders() and send the -content.

    -

    Note: This is not required if your PHP config buffers all -output and your script doesn\'t do any incremental flushing of the output -buffer. PHP will generally set Content-Length for you if it can.

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; - -require '_include.php'; -$content = get_content(array( - 'title' => $title - ,'explain' => $explain -)); - -$cg->setContentLength(strlen($content)); -$cg->sendHeaders(); -send_slowly($content); - diff --git a/min_unit_tests/HTTP_ConditionalGet/3.php b/min_unit_tests/HTTP_ConditionalGet/3.php deleted file mode 100644 index 8f5482b..0000000 --- a/min_unit_tests/HTTP_ConditionalGet/3.php +++ /dev/null @@ -1,40 +0,0 @@ -When Last-Modified is unknown, you can still use ETags, but you need a short -string that is unique for that content. In the worst case, you have to generate -all the content first, then instantiate HTTP_ConditionalGet, setting -the array key contentHash to the output of a hash function of the -content. Since we have the full content, we might as well also use -setContentLength(strlen($content)) in the case where we need to -send it.

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; -require '_include.php'; -$content = get_content(array( - 'title' => $title - ,'explain' => $explain -)); - -$cg = new HTTP_ConditionalGet(array( - 'contentHash' => substr(md5($content), 7) -)); -if ($cg->cacheIsValid) { - $cg->sendHeaders(); - // we're done - exit(); -} -$cg->setContentLength(strlen($content)); -$cg->sendHeaders(); - -send_slowly($content); - diff --git a/min_unit_tests/HTTP_ConditionalGet/4.php b/min_unit_tests/HTTP_ConditionalGet/4.php deleted file mode 100644 index 4b77d20..0000000 --- a/min_unit_tests/HTTP_ConditionalGet/4.php +++ /dev/null @@ -1,49 +0,0 @@ - $lastModified - ,'encoding' => $enc -)); -$cg->sendHeaders(); -if ($cg->cacheIsValid) { - // we're done - exit(); -} - -// output encoded content - -$title = 'ConditionalGet + Encoder'; -$explain = ' -

    Using ConditionalGet and Encoder is straightforward. First impliment the -ConditionalGet, then if the cache is not valid, encode and send the content

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; -require '_include.php'; -$content = get_content(array( - 'title' => $title - ,'explain' => $explain -)); - -$he = new HTTP_Encoder(array( - 'content' => get_content(array( - 'title' => $title - ,'explain' => $explain - )) -)); -$he->encode(); - -// usually you would just $he->sendAll(), but here we want to emulate slow -// connection -$he->sendHeaders(); -send_slowly($he->getContent()); diff --git a/min_unit_tests/HTTP_ConditionalGet/5.php b/min_unit_tests/HTTP_ConditionalGet/5.php deleted file mode 100644 index b443c19..0000000 --- a/min_unit_tests/HTTP_ConditionalGet/5.php +++ /dev/null @@ -1,27 +0,0 @@ - 20 - ,'lastModifiedTime' => filemtime(__FILE__) -)); -$cg->sendHeaders(); - -// generate, send content -$title = 'Last-Modified + Expires'; -$explain = ' -

    Here we set a static "lastModifiedTime" and "maxAge" to 20. The browser -will consider this document fresh for 20 seconds, then revalidate its cache. After -the 304 response, the cache will be good for another 20 seconds. Unless you force -a reload, there will only be 304 responses for this page after the initial download. -'; - -require '_include.php'; -echo get_content(array( - 'title' => $title - ,'explain' => $explain -)); - diff --git a/min_unit_tests/HTTP_ConditionalGet/_include.php b/min_unit_tests/HTTP_ConditionalGet/_include.php deleted file mode 100644 index 9b65ae1..0000000 --- a/min_unit_tests/HTTP_ConditionalGet/_include.php +++ /dev/null @@ -1,64 +0,0 @@ - - - - - -HTTP_ConditionalGet : <?php echo $data['title']; ?> - - -

    HTTP_ConditionalGet

    -

    - - -

    Notes

    -

    How to distinguish 200 and 304 responses

    -

    For these pages all 200 responses are sent in chunks a second apart, so you -should notice that 304 responses are quicker. You can also use HTTP sniffers -like Fiddler (win) and -LiveHTTPHeaders (Firefox add-on) -to verify headers and content being sent.

    -

    Browser notes

    -
    -
    Opera
    -
    Opera has a couple behaviors against the HTTP spec: Manual refreshes (F5) - prevents the ETag/If-Modified-Since headers from being sent; it only sends - them when following a link or bookmark. Also, Opera will not honor the - must-revalidate Cache-Control value unless max-age - is set. To get Opera to follow the spec, ConditionalGet will send Opera max-age=0 - (if one is not already set).
    -
    Safari
    -
    ETag validation is unsupported, but Safari supports HTTP/1.0 validation via - If-Modified-Since headers as long as the cache is explicitly marked - "public" or "private" ("private" is default in ConditionalGet).
    -
    - - - $lastModified -)); -$cg->sendHeaders(); -if ($cg->cacheIsValid) { - // we're done - exit(); -} - -$title = 'Last-Modified is known : simple usage'; -$explain = ' -

    If your content has not changed since a certain timestamp, set this via the -the lastModifiedTime array key when instantiating HTTP_ConditionalGet. -You can immediately call the method sendHeaders() to set the -Last-Modified, ETag, and Cache-Control headers. The, if cacheIsValid -property is false, you echo the content.

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; - -require '_include.php'; - -echo send_slowly(get_content(array( - 'title' => $title - ,'explain' => $explain -))); - diff --git a/min_unit_tests/HTTP_Encoder/green.png b/min_unit_tests/HTTP_Encoder/green.png deleted file mode 100644 index d9d3a308aec0e9c7be676a8bc5438e5c61427ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_{3?x-PN__%S%*9TgAsieWw;%dH0CL#^d_r6q z{xkglf9682r8`iBv%n*=n1O-o0|+xZtudJa6cj6QjVN(0N=+=u%+FH@$;?efo0^iDsNj}alv - - - -HTTP_Encoder Test - - - -

    HTTP_Encoder test

    -

    HTML

    -

    CSS

    -

    Javascript

    -

    image

    - - - - $content - ,'type' => $type -)); -$he->encode(); -$he->sendAll(); - -?> \ No newline at end of file diff --git a/min_unit_tests/README.txt b/min_unit_tests/README.txt deleted file mode 100644 index 0be59e3..0000000 --- a/min_unit_tests/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -UNIT TESTING - -Do not modify the "simpletest" directory as it's linked via svn:externals. - diff --git a/min_unit_tests/_inc.php b/min_unit_tests/_inc.php deleted file mode 100644 index 93caf8a..0000000 --- a/min_unit_tests/_inc.php +++ /dev/null @@ -1,53 +0,0 @@ -0, 'fail'=>0, 'total'=>0); - - $mode = $test ? 'pass' : 'fail'; - $outMode = $test ? 'PASS' : '!FAIL'; - printf("%s: %s (%d of %d tests run so far have %sed)\n", - $outMode, $message, ++$count[$mode], ++$count['total'], $mode); - - return (bool)$test; -} - -ob_start(); \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/comments.css b/min_unit_tests/_test_files/css/comments.css deleted file mode 100644 index 2ef9fac..0000000 --- a/min_unit_tests/_test_files/css/comments.css +++ /dev/null @@ -1,9 +0,0 @@ - -/* block comments get removed */ - -/*! YUI Compressor style comments are preserved */ - -/* but all other comments are removed */ - -/* comments that have any surrounding whitespace are replaced by a single space. */ -body{ background:#fff/*eef*/ url(/path/to/image.gif) repeat-y; } diff --git a/min_unit_tests/_test_files/css/comments.min.css b/min_unit_tests/_test_files/css/comments.min.css deleted file mode 100644 index 3ea5c61..0000000 --- a/min_unit_tests/_test_files/css/comments.min.css +++ /dev/null @@ -1,3 +0,0 @@ - -/* YUI Compressor style comments are preserved */ -body{background:#fff url(/path/to/image.gif) repeat-y} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/hacks.css b/min_unit_tests/_test_files/css/hacks.css deleted file mode 100644 index fccd321..0000000 --- a/min_unit_tests/_test_files/css/hacks.css +++ /dev/null @@ -1,66 +0,0 @@ -/* hide from ie5/mac \*/ a{} -.foo {color:red} -/* necessary comment */ - -/* comment to attempt to confuse parser */ - -/* feed to ie5/mac \*//*/ -@import "ie5mac.css"; -/* necessary comment */ - -/* comment to attempt to confuse parser */ - -/*/ hide from nav4 */ -.foo {display:block;} -/* necessary comment */ - -/* comment to attempt to confuse parser */ - -/*/ feed to nav *//*/ -.foo {display:crazy;} -/* necessary comment */ - -/* hide props from various IE/win */ -div { - width: 140px; - width/* */:/**/100px; - width: /**/100px; -} - -html>/**/body {} - -/* Tantek's box model hack */ -div { - width:400px; - voice-family: "\"}\""; - voice-family:inherit; - width:300px; -} - -/* don't minimize hex colors in filters */ -div { - filter:chroma(color=#aabbcc); - filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000); -} - -@media screen { - /* for IE 5.x-6, hidden from IE 5 Mac */ /*\*/ - * html div#page { - height: 1%; - } - /**/ /* end hidden from IE 5 Mac */ -} - -foo { /* filters for IE */ - _height : 20px; - *height : 15px; -} - -/* http://tantek.com/CSS/Examples/midpass.html */ -@media tty { - i{content:"\";/*" "*/}} @import 'midpassafter.css'; /*";} -}/* */ - -/* leave at least 1 space between these pseudo elements and "{" for IE6: http://www.crankygeek.com/ie6pebug/ */ -p:first-letter {color:red;} -p:first-line {color:red;} diff --git a/min_unit_tests/_test_files/css/hacks.min.css b/min_unit_tests/_test_files/css/hacks.min.css deleted file mode 100644 index 68be2ee..0000000 --- a/min_unit_tests/_test_files/css/hacks.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*\*/a{}.foo{color:red}/**/ /*\*//*/@import "ie5mac.css";/**/ /*/*/.foo{display:block}/**/ /*/*//*/.foo{display:crazy}/**/ div{width:140px;width/**/:/**/100px;width:/**/100px}html>/**/body{}div{width:400px;voice-family:"\"}\"";voice-family:inherit;width:300px}div{filter:chroma(color=#aabbcc);filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000)}@media -screen{/*\*/* html -div#page{height:1%}/**/}foo{_height:20px;*height:15px}@media -tty{i{content:"\";/*" "*/}}@import 'midpassafter.css';/*"}}/* */ p:first-letter {color:red}p:first-line {color:red} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/issue62.css b/min_unit_tests/_test_files/css/issue62.css deleted file mode 100644 index 006c7a2..0000000 --- a/min_unit_tests/_test_files/css/issue62.css +++ /dev/null @@ -1,890 +0,0 @@ -/* -* DEFINITION DES STYLES DE TEXTE -*/ - /*-----------------------------------------------------------------------------------*/ -h1 { - color: #339933; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - font-weight: bold; - text-decoration: none; -} - -h2 { - color: #339933; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; -} - -h1,h2,h3,h4,h5 { - margin: 0px; - padding: 0px; -} - -.txt_10_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_noir:link,.txt_10_noir:visited,.txt_10_noir:active { - color: black; -} - -.txt_10_noir:hover { - color: red; -} - -.txt_11_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_noir:link,.txt_11_noir:visited,.txt_11_noir:active { - color: black; -} - -.txt_11_noir:hover { - color: red; -} - -.txt_12_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_noir:link,.txt_12_noir:visited,.txt_12_noir:active { - color: black; -} - -.txt_12_noir:hover { - color: red; -} - -.txt_14_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_noir:link,.txt_14_noir:visited,.txt_14_noir:active { - color: black; -} - -.txt_14_noir:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_gris:link,.txt_10_gris:visited,.txt_10_gris:active { - color: grey; -} - -.txt_10_gris:hover { - color: red; -} - -.txt_11_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_gris:link,.txt_11_gris:visited,.txt_11_gris:active { - color: grey; -} - -.txt_11_gris:hover { - color: red; -} - -.txt_12_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_gris:link,.txt_12_gris:visited,.txt_12_gris:active { - color: grey; -} - -.txt_12_gris:hover { - color: red; -} - -.txt_14_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_gris:link,.txt_14_gris:visited,.txt_14_gris:active { - color: grey; -} - -.txt_14_gris:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_blanc:link,.txt_10_blanc:visited,.txt_10_blanc:active { - color: #FFFFFF; -} - -.txt_10_blanc:hover { - color: #FF8800; /*ORANGE*/ -} - -.txt_11_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_blanc:link,.txt_11_blanc:visited,.txt_11_blanc:active { - color: #FFFFFF; -} - -.txt_11_blanc:hover { - color: #FF8800; -} - -.txt_12_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_blanc:link,.txt_12_blanc:visited,.txt_12_blanc:active { - color: #FFFFFF; -} - -.txt_12_blanc:hover { - color: #FFAA00; -} - -.txt_14_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_blanc:link,.txt_14_blanc:visited,.txt_14_blanc:active { - color: #FFFFFF; -} - -.txt_14_blanc:hover { - color: #FF8800; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_orange:link,.txt_10_orange:visited,.txt_10_orange:active { - color: #FF8800; -} - -.txt_10_orange:hover { - color: darkblue -} - -.txt_11_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_orange:link,.txt_11_orange:visited,.txt_11_orange:active { - color: #FF8800; -} - -.txt_11_orange:hover { - color: darkblue; -} - -.txt_12_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_orange:link,.txt_12_orange:visited,.txt_12_orange:active { - color: #FF8800; -} - -.txt_12_orange:hover { - color: darkblue; -} - -.txt_14_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_orange:link,.txt_14_orange:visited,.txt_14_orange:active { - color: #FF8800; -} - -.txt_14_orange:hover { - color: darkblue; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_rouge:link,.txt_10_rouge:visited,.txt_10_rouge:active { - color: red; -} - -.txt_10_rouge:hover { - color: darkblue; -} - -.txt_11_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_rouge:link,.txt_11_rouge:visited,.txt_11_rouge:active { - color: red; -} - -.txt_11_rouge:hover { - color: darkblue; -} - -.txt_12_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_rouge:link,.txt_12_rouge:visited,.txt_12_rouge:active { - color: red; -} - -.txt_12_rouge:hover { - color: darkblue; -} - -.txt_14_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_rouge:link,.txt_14_rouge:visited,.txt_14_rouge:active { - color: red; -} - -.txt_14_rouge:hover { - color: darkblue; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_bleu:link,.txt_10_bleu:visited,.txt_10_bleu:active { - color: blue; -} - -.txt_10_bleu:hover { - color: red; -} - -.txt_11_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_bleu:link,.txt_11_bleu:visited,.txt_11_bleu:active { - color: blue; -} - -.txt_11_bleu:hover { - color: red; -} - -.txt_12_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_bleu:link,.txt_12_bleu:visited,.txt_12_bleu:active { - color: blue; -} - -.txt_12_bleu:hover { - color: red; -} - -.txt_14_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_bleu:link,.txt_14_bleu:visited,.txt_14_bleu:active { - color: blue; -} - -.txt_14_bleu:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_bleu_f:link,.txt_10_bleu_f:visited,.txt_10_bleu_f:active { - color: darkblue; -} - -.txt_10_bleu_f:hover { - color: red; -} - -.txt_11_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_bleu_f:link,.txt_11_bleu_f:visited,.txt_11_bleu_f:active { - color: darkblue; -} - -.txt_11_bleu_f:hover { - color: red; -} - -.txt_12_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_bleu_f:link,.txt_12_bleu_f:visited,.txt_12_bleu_f:active { - color: darkblue; -} - -.txt_12_bleu_f:hover { - color: red; -} - -.txt_14_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_bleu_f:link,.txt_14_bleu_f:visited,.txt_14_bleu_f:active { - color: darkblue; -} - -.txt_14_bleu_f:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_vert_f:link,.txt_10_vert_f:visited,.txt_10_vert_f:active { - color: darkgreen; -} - -.txt_10_vert_f:hover { - color: red; -} - -.txt_11_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_vert_f:link,.txt_11_vert_f:visited,.txt_11_vert_f:active { - color: darkgreen; -} - -.txt_11_vert_f:hover { - color: red; -} - -.txt_12_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_vert_f:link,.txt_12_vertf:visited,.txt_12_vert_f:active { - color: darkgreen; -} - -.txt_12_vert_f:hover { - color: red; -} - -.txt_14_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_vert_f:link,.txt_14_vert_f:visited,.txt_14_vert_f:active { - color: darkgreen; -} - -.txt_14_vert_f:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_vert:link,.txt_10_vert:visited,.txt_10_vert:active { - color: green; -} - -.txt_10_vert:hover { - color: red; -} - -.txt_11_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_vert:link,.txt_11_vert:visited,.txt_11_vert:active { - color: green; -} - -.txt_11_vert:hover { - color: red; -} - -.txt_12_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_vert:link,.txt_12_vert:visited,.txt_12_vert:active { - color: green; -} - -.txt_12_vert:hover { - color: red; -} - -.txt_14_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_vert:link,.txt_14_vert:visited,.txt_14_vert:active { - color: green; -} - -.txt_14_vert:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.fond_blanc { - background-color: #FFFFFF; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_gris_c, .fond_gris_c tr { - background-color: #FFFFFF; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.fond_gris_c2, .fond_gris_c2 tr { - background-color: #FBFBFB; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_bleu_c, .fond_bleu_c tr { - background-color: #D9EEF9; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; - background-image: url(../images/fond_1.bmp); -} - -.fond_bleu_c2 { - background-color: #ECF4FF; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_bleu_f { - background-color: #003366; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_orange { - background-color: #FEEFE7; - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; - background-image: url(../images/fond_3.jpg); -} - -.fond_orange_2 { - background-color: #FFF8F4; - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; - border: 1px solid orange; - border-collapse: collapse; -} - -.vccDlgBody { - border: 3px solid #336699; - border-collapse: collapse; - color: black; - background-color: #EEFFEE; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -/* DEFINITION DES STYLES DE TABLEAUX */ -.bordure_0 { - border: 0px solid; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.bordure_1_bleu { - border: 1px solid green; - border-collapse: collapse; - color: black; - background-color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.bordure_3_bleu { - border: 3px solid #336699; - border-collapse: collapse; - color: black; - background-color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.indent { - margin-left: 20px; -} - -/* DEFINITION DES STYLES D'OBJETS DE FORMULAIRE */ -.Btn { - color: #003366; - text-align: center; - font-weight: bold; - background-color: #FFFFFF; - background-image: url(../images/ongletStyle1.jpg); - background-repeat: no-repeat; - background-position: center center; -} - -.Btn:hover { - color: red; -} - -.menu1h { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - font-weight: bold; - text-decoration: none; - border-top: 1px solid #003366; - border-bottom: 1px solid #003366; - border-left: 1px solid #003366; - border-right: 1px solid white; - border-collapse: collapse; - display: block; -} - -.menu1h:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menu1h_f { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - font-weight: bold; - text-decoration: none; - border: 1px solid #003366; - display: block; -} - -.menu1h_f:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menu1v { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - font-weight: bold; - text-decoration: none; - border: 1px solid #003366; - border-collapse: collapse; - display: block; -} - -.menu1v:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menu2v { - background-color: #5588BB; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; - border: 1px solid #4277AB; - border-collapse: collapse; - float: left; - display: block; -} - -.menu2v:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menuEDF { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.menuEDF:hover { - color: #FF8800; -} - -/*bouton bleu sur blanc*/ -.Bouton { - color: #003366; - text-align: center; - font-weight: bold; - /* Ricardo cursor: hand; */ - cursor: pointer; - background-color: #FFFFFF; -} - -input { - border: 2px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.disabled_input { - border: 1px solid gray; - color: grey; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input0 { - border: 0px; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); -} - -.input2 { - border: 1px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input3 { - border: 1px solid black; - color: #003366; - background-color: #EEEEEE; - background-image: url(); -} - -.input4 { - border: 1px solid blue; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input5 { - border: 1px solid darkblue; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input_btn { - border: 0px; - /* cursor: hand; */ - cursor: pointer; -} - -textarea { - border: 2px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_5.bmp); -} - -.TEXTAREA3 { - border: 1px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(); -} - -.TEXTAREA4 { - border: 1px solid green; - color: #003366; - background-color: #EEEEEE; - background-image: url(); -} - -.hand { - cursor: hand; - cursor: pointer; -} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/issue62.min.css b/min_unit_tests/_test_files/css/issue62.min.css deleted file mode 100644 index 5eb1982..0000000 --- a/min_unit_tests/_test_files/css/issue62.min.css +++ /dev/null @@ -1,25 +0,0 @@ -h1{color:#393;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;font-weight:bold;text-decoration:none}h2{color:#393;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none}h1,h2,h3,h4,h5{margin:0px;padding:0px}.txt_10_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_noir:link,.txt_10_noir:visited,.txt_10_noir:active{color:black}.txt_10_noir:hover{color:red}.txt_11_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_noir:link,.txt_11_noir:visited,.txt_11_noir:active{color:black}.txt_11_noir:hover{color:red}.txt_12_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_noir:link,.txt_12_noir:visited,.txt_12_noir:active{color:black}.txt_12_noir:hover{color:red}.txt_14_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_noir:link,.txt_14_noir:visited,.txt_14_noir:active{color:black}.txt_14_noir:hover{color:red}.txt_10_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_gris:link,.txt_10_gris:visited,.txt_10_gris:active{color:grey}.txt_10_gris:hover{color:red}.txt_11_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_gris:link,.txt_11_gris:visited,.txt_11_gris:active{color:grey}.txt_11_gris:hover{color:red}.txt_12_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_gris:link,.txt_12_gris:visited,.txt_12_gris:active{color:grey}.txt_12_gris:hover{color:red}.txt_14_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_gris:link,.txt_14_gris:visited,.txt_14_gris:active{color:grey}.txt_14_gris:hover{color:red}.txt_10_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_blanc:link,.txt_10_blanc:visited,.txt_10_blanc:active{color:#FFF}.txt_10_blanc:hover{color:#F80}.txt_11_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_blanc:link,.txt_11_blanc:visited,.txt_11_blanc:active{color:#FFF}.txt_11_blanc:hover{color:#F80}.txt_12_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_blanc:link,.txt_12_blanc:visited,.txt_12_blanc:active{color:#FFF}.txt_12_blanc:hover{color:#FA0}.txt_14_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_blanc:link,.txt_14_blanc:visited,.txt_14_blanc:active{color:#FFF}.txt_14_blanc:hover{color:#F80}.txt_10_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_orange:link,.txt_10_orange:visited,.txt_10_orange:active{color:#F80}.txt_10_orange:hover{color:darkblue}.txt_11_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_orange:link,.txt_11_orange:visited,.txt_11_orange:active{color:#F80}.txt_11_orange:hover{color:darkblue}.txt_12_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_orange:link,.txt_12_orange:visited,.txt_12_orange:active{color:#F80}.txt_12_orange:hover{color:darkblue}.txt_14_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_orange:link,.txt_14_orange:visited,.txt_14_orange:active{color:#F80}.txt_14_orange:hover{color:darkblue}.txt_10_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_rouge:link,.txt_10_rouge:visited,.txt_10_rouge:active{color:red}.txt_10_rouge:hover{color:darkblue}.txt_11_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_rouge:link,.txt_11_rouge:visited,.txt_11_rouge:active{color:red}.txt_11_rouge:hover{color:darkblue}.txt_12_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_rouge:link,.txt_12_rouge:visited,.txt_12_rouge:active{color:red}.txt_12_rouge:hover{color:darkblue}.txt_14_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_rouge:link,.txt_14_rouge:visited,.txt_14_rouge:active{color:red}.txt_14_rouge:hover{color:darkblue}.txt_10_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_bleu:link,.txt_10_bleu:visited,.txt_10_bleu:active{color:blue}.txt_10_bleu:hover{color:red}.txt_11_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_bleu:link,.txt_11_bleu:visited,.txt_11_bleu:active{color:blue}.txt_11_bleu:hover{color:red}.txt_12_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_bleu:link,.txt_12_bleu:visited,.txt_12_bleu:active{color:blue}.txt_12_bleu:hover{color:red}.txt_14_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_bleu:link,.txt_14_bleu:visited,.txt_14_bleu:active{color:blue}.txt_14_bleu:hover{color:red}.txt_10_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_bleu_f:link,.txt_10_bleu_f:visited,.txt_10_bleu_f:active{color:darkblue}.txt_10_bleu_f:hover{color:red}.txt_11_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_bleu_f:link,.txt_11_bleu_f:visited,.txt_11_bleu_f:active{color:darkblue}.txt_11_bleu_f:hover{color:red}.txt_12_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_bleu_f:link,.txt_12_bleu_f:visited,.txt_12_bleu_f:active{color:darkblue}.txt_12_bleu_f:hover{color:red}.txt_14_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_bleu_f:link,.txt_14_bleu_f:visited,.txt_14_bleu_f:active{color:darkblue}.txt_14_bleu_f:hover{color:red}.txt_10_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_vert_f:link,.txt_10_vert_f:visited,.txt_10_vert_f:active{color:darkgreen}.txt_10_vert_f:hover{color:red}.txt_11_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_vert_f:link,.txt_11_vert_f:visited,.txt_11_vert_f:active{color:darkgreen}.txt_11_vert_f:hover{color:red}.txt_12_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_vert_f:link,.txt_12_vertf:visited,.txt_12_vert_f:active{color:darkgreen}.txt_12_vert_f:hover{color:red}.txt_14_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_vert_f:link,.txt_14_vert_f:visited,.txt_14_vert_f:active{color:darkgreen}.txt_14_vert_f:hover{color:red}.txt_10_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_vert:link,.txt_10_vert:visited,.txt_10_vert:active{color:green}.txt_10_vert:hover{color:red}.txt_11_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_vert:link,.txt_11_vert:visited,.txt_11_vert:active{color:green}.txt_11_vert:hover{color:red}.txt_12_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_vert:link,.txt_12_vert:visited,.txt_12_vert:active{color:green}.txt_12_vert:hover{color:red}.txt_14_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_vert:link,.txt_14_vert:visited,.txt_14_vert:active{color:green}.txt_14_vert:hover{color:red}.fond_blanc{background-color:#FFF;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_gris_c, .fond_gris_c -tr{background-color:#FFF;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.fond_gris_c2, .fond_gris_c2 -tr{background-color:#FBFBFB;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_bleu_c, .fond_bleu_c -tr{background-color:#D9EEF9;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none;background-image:url(../images/fond_1.bmp)}.fond_bleu_c2{background-color:#ECF4FF;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_bleu_f{background-color:#036;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_orange{background-color:#FEEFE7;color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none;background-image:url(../images/fond_3.jpg)}.fond_orange_2{background-color:#FFF8F4;color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none;border:1px -solid orange;border-collapse:collapse}.vccDlgBody{border:3px -solid #369;border-collapse:collapse;color:black;background-color:#EFE;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.bordure_0{border:0px -solid;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.bordure_1_bleu{border:1px -solid green;border-collapse:collapse;color:black;background-color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.bordure_3_bleu{border:3px -solid #369;border-collapse:collapse;color:black;background-color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.indent{margin-left:20px}.Btn{color:#036;text-align:center;font-weight:bold;background-color:#FFF;background-image:url(../images/ongletStyle1.jpg);background-repeat:no-repeat;background-position:center center}.Btn:hover{color:red}.menu1h{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;font-weight:bold;text-decoration:none;border-top:1px solid #036;border-bottom:1px solid #036;border-left:1px solid #036;border-right:1px solid white;border-collapse:collapse;display:block}.menu1h:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menu1h_f{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;font-weight:bold;text-decoration:none;border:1px -solid #036;display:block}.menu1h_f:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menu1v{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;font-weight:bold;text-decoration:none;border:1px -solid #036;border-collapse:collapse;display:block}.menu1v:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menu2v{background-color:#58B;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none;border:1px -solid #4277AB;border-collapse:collapse;float:left;display:block}.menu2v:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menuEDF{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.menuEDF:hover{color:#F80}.Bouton{color:#036;text-align:center;font-weight:bold;cursor:pointer;background-color:#FFF}input{border:2px -solid green;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.disabled_input{border:1px -solid gray;color:grey;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input0{border:0px;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp)}.input2{border:1px -solid green;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input3{border:1px -solid black;color:#036;background-color:#EEE;background-image:url()}.input4{border:1px -solid blue;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input5{border:1px -solid darkblue;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input_btn{border:0px;cursor:pointer}textarea{border:2px -solid green;color:#036;background-color:#FFF;background-image:url(../images/fond_5.bmp)}.TEXTAREA3{border:1px -solid green;color:#036;background-color:#FFF;background-image:url()}.TEXTAREA4{border:1px -solid green;color:#036;background-color:#EEE;background-image:url()}.hand{cursor:hand;cursor:pointer} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/paths_prepend.css b/min_unit_tests/_test_files/css/paths_prepend.css deleted file mode 100644 index da7cfca..0000000 --- a/min_unit_tests/_test_files/css/paths_prepend.css +++ /dev/null @@ -1,12 +0,0 @@ -@import "foo.css"; -@import 'bar/foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(../foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/paths_prepend.min.css b/min_unit_tests/_test_files/css/paths_prepend.min.css deleted file mode 100644 index ffb94e2..0000000 --- a/min_unit_tests/_test_files/css/paths_prepend.min.css +++ /dev/null @@ -1 +0,0 @@ -@import "../foo.css";@import '../bar/foo.css' print;@import '/css/foo.css';@import 'http://foo.com/css/foo.css';@import url(../../foo.css) tv, projection;@import url("/css/foo.css");@import url(/css2/foo.css);@import url(data:image/gif;base64,AAAA);foo{background:url('../bar/foo.png')}foo{background:url('http://foo.com/css/foo.css')}foo{background:url("//foo.com/css/foo.css")}foo{background:url(data:image/gif;base64,AAAA)} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/paths_rewrite.css b/min_unit_tests/_test_files/css/paths_rewrite.css deleted file mode 100644 index aa41d0a..0000000 --- a/min_unit_tests/_test_files/css/paths_rewrite.css +++ /dev/null @@ -1,14 +0,0 @@ -@import "foo.css"; -@import 'bar/foo.css' print; -@import '../bar/foo.css' print; -@import '../../foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(../foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/paths_rewrite.min.css b/min_unit_tests/_test_files/css/paths_rewrite.min.css deleted file mode 100644 index 3493615..0000000 --- a/min_unit_tests/_test_files/css/paths_rewrite.min.css +++ /dev/null @@ -1 +0,0 @@ -@import "/_test_files/css/foo.css";@import '/_test_files/css/bar/foo.css' print;@import '/_test_files/bar/foo.css' print;@import '/foo.css' print;@import '/css/foo.css';@import 'http://foo.com/css/foo.css';@import url(/_test_files/foo.css) tv, projection;@import url("/css/foo.css");@import url(/css2/foo.css);@import url(data:image/gif;base64,AAAA);foo{background:url('/_test_files/css/bar/foo.png')}foo{background:url('http://foo.com/css/foo.css')}foo{background:url("//foo.com/css/foo.css")}foo{background:url(data:image/gif;base64,AAAA)} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/readme.txt b/min_unit_tests/_test_files/css/readme.txt deleted file mode 100644 index 0181755..0000000 --- a/min_unit_tests/_test_files/css/readme.txt +++ /dev/null @@ -1 +0,0 @@ -Test suite from http://search.cpan.org/~gtermars/CSS-Minifier-XS/ \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/selectors.css b/min_unit_tests/_test_files/css/selectors.css deleted file mode 100644 index d74c9aa..0000000 --- a/min_unit_tests/_test_files/css/selectors.css +++ /dev/null @@ -1,42 +0,0 @@ -/* http://www.w3.org/TR/css3-selectors/ */ - -* -E[foo] -E[foo="bar"] -E[foo~="bar"] -E[foo^="bar"] -E[foo$="bar"] -E[foo*="bar"] -E[hreflang|="en"] -E:root -E:nth-child(n) -E:nth-last-child(n) -E:nth-of-type(n) -E:nth-last-of-type(n) -E:first-child -E:last-child -E:first-of-type -E:last-of-type -E:only-child -E:only-of-type -E:empty -E:link -E:visited -E:active -E:hover -E:focus -E:target -E:lang(fr) -E:enabled -E:disabled -E:checked -E::first-line -E::first-letter -E::selection -E::before -E::after -E.warning#myid -E:not(s) - > F - + F - ~ F {color: red;} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/selectors.min.css b/min_unit_tests/_test_files/css/selectors.min.css deleted file mode 100644 index 643089f..0000000 --- a/min_unit_tests/_test_files/css/selectors.min.css +++ /dev/null @@ -1,37 +0,0 @@ -* -E[foo] -E[foo="bar"] -E[foo~="bar"] -E[foo^="bar"] -E[foo$="bar"] -E[foo*="bar"] -E[hreflang|="en"] -E:root -E:nth-child(n) -E:nth-last-child(n) -E:nth-of-type(n) -E:nth-last-of-type(n) -E:first-child -E:last-child -E:first-of-type -E:last-of-type -E:only-child -E:only-of-type -E:empty -E:link -E:visited -E:active -E:hover -E:focus -E:target -E:lang(fr) -E:enabled -E:disabled -E:checked -E::first-line -E::first-letter -E::selection -E::before -E::after -E.warning#myid -E:not(s)>F+F~F{color:red} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/styles.css b/min_unit_tests/_test_files/css/styles.css deleted file mode 100644 index bf46c0a..0000000 --- a/min_unit_tests/_test_files/css/styles.css +++ /dev/null @@ -1,31 +0,0 @@ -/* some CSS to try to exercise things in general */ - -@import url( /more.css ); - - body, td, th { - font-family: Verdana , "Bitstream Vera Sans" , sans-serif ; - - font-size : 12px; -} - -.nav { - margin-left: 20%; -} -#main-nav { - background-color: red; - border: 1px solid #00ff77; -} - -div#content -h1 + p { - padding-top: 0; - margin-top: 0; -} - -@media all and (min-width: 640px) { - #media-queries-1 { background-color: #0f0; } -} - -@media screen and (max-width: 2000px) { - #media-queries-2 { background-color: #0f0; } -} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/styles.min.css b/min_unit_tests/_test_files/css/styles.min.css deleted file mode 100644 index a823b05..0000000 --- a/min_unit_tests/_test_files/css/styles.min.css +++ /dev/null @@ -1,3 +0,0 @@ -@import url(/more.css);body,td,th{font-family:Verdana,"Bitstream Vera Sans",sans-serif;font-size:12px}.nav{margin-left:20%}#main-nav{background-color:red;border:1px -solid #0f7}div#content -h1+p{padding-top:0;margin-top:0}@media all and (min-width: 640px){#media-queries-1{background-color:#0f0}}@media screen and (max-width: 2000px){#media-queries-2{background-color:#0f0}} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/subsilver.css b/min_unit_tests/_test_files/css/subsilver.css deleted file mode 100644 index 79d34ec..0000000 --- a/min_unit_tests/_test_files/css/subsilver.css +++ /dev/null @@ -1,434 +0,0 @@ -/* Based on the original Style Sheet for the fisubsilver v2 Theme for phpBB version 2+ -Edited by Daz - http://www.forumimages.com - last updated 26-06-03 */ -/* The content of the posts (body of text) */ -/* General page style */ - - - - /* begin suggest post */ - .float-l{ - float: left; - } - - .form-suggest{ - height:200px; - background:#DEE2D0; - vertical-align: top; - } - - .form-input input{ - font-size: 10px; - } - - .hide{ - display:none; - } - - .form-input textarea{ - font-size: 11px; - width: 350px; - } - - .form-label{ - font-size: 10px; - font-weight: bold; - line-height: 25px; - padding-right: 10px; - text-align: right; - width: 100px; - color: #39738F; - } - - .font-9{ - font-size: 9px; - } - - .form-topic{ - font-weight:bold; - - } - - .form-error{ - color:red; - } - - .inline{ - display: inline; - } - - .space-10{ - clear: both; - font-size: 10px; - height: 10px; - line-height: 10px; - } - - .suggest-success{ - color:green; - padding-left:10px; - font-size:11px; - font-weight:bold; - } - - .top{ - vertical-align: top; - } - /* end suggest post */ - -table td{ - padding:3px; -} - -a:link,a:active,a:visited,a.postlink{ - color: #006699; - text-decoration: none; -} - -a:hover{ - color: #DD6900; -} - -a.admin:hover,a.mod:hover{ - color: #DD6900; -} - -a.but,a.but:hover,a.but:visited{ - color: #000000; - text-decoration: none; -} - -a.topictitle:visited{ - color: #5493B4; -} - -a.topictitle:hover{ - color: #DD6900; -} - - - -body{ - color: #000000; - font: 11px Verdana,Arial,Helvetica,sans-serif; - margin: 0 10px 10px 10px; - padding: 0; - overflow:auto; -} - -/* General font families for common tags */ -font,th,td,p{ - font: 12px Verdana,Arial,Helvetica,sans-serif; -} - -/* Form elements */ -form{ - display: inline; -} - -hr{ - border: 0px solid #FFFFFF; - border-top-width: 1px; - height: 0px; -} - -/* Gets rid of the need for border="0" on hyperlinked images */ -img{ - border: 0 solid; -} - -input{ - font: 11px Verdana,Arial,Helvetica,sans-serif; -} - -input.button,input.liteoption,.fakebut{ - background: #FAFAFA; - border: 1px solid #000000; - font-size: 11px; -} - -input.catbutton{ - background: #FAFAFA; - border: 1px solid #000000; - font-size: 10px; -} - -input.mainoption{ - background: #FAFAFA; - border: 1px solid #000000; - font-size: 11px; - font-weight: bold; -} - -input.post,textarea.post{ - background: #FFFFFF; - border: 1px solid #000000; - font: 11px Verdana,Arial,Helvetica,sans-serif; - padding-bottom: 2px; - padding-left: 2px; -} - -select{ - background: #FFFFFF; - font: 11px Verdana,Arial,Helvetica,sans-serif; -} - -table{ - text-align: left; -} - -td{ - vertical-align: middle; -} - -/* Category gradients*/ -td.cat{ - background-color: #C2C6BA; - font-weight: bold; - height: 20px; - letter-spacing: 1px; - text-indent: 4px; -} - -td.genmed,.genmed{ - font-size: 11px; -} - -/* This is for the table cell above the Topics,Post & Last posts on the index.php */ -td.rowpic{ - background: #C2C6BA; -} - -td.spacerow{ - background: #E5E6E2; -} - -/* Table Header cells */ -th{ - background-color: #FADD31; - background-image: url(images/cellpic3.gif); - background-repeat: repeat-x; - color: #68685E; - font-size: 11px; - font-weight: bold; - line-height:16px; - height: 16px; - padding-left: 8px; - padding-right: 8px; - text-align: center; - white-space: nowrap; -} - -/* Admin & Moderator Colours MODification */ -.admin,.mod{ - font-size: 11px; - font-weight: bold; -} - -.admin,a.admin,a.admin:visited{ - color: #FFA34F; -} - -/* This is the border line & background colour round the entire page */ -.bodyline{ - background: #FFFFFF; - border: 1px solid #98AAB1; -} - -.center{ - text-align: center; -} - -/* Code blocks */ -.code{ - background: #FAFAFA; - border: 1px solid #D1D7DC; - color: #006600; - font: 12px Courier,"Courier New",sans-serif; - padding: 5px; -} - -/* This is for the error messages that pop up */ -.errorline{ - background: #E5E6E2; - border: 1px solid #8F8B8B; - color:#D92A2A; -} - -.explaintitle{ - color: #5C81B1; - font-size: 11px; - font-weight: bold; -} - -/* This is the outline round the main forum tables */ -.forumline{ - background: #FFFFFF; -} - -/* General text */ -.gensmall{ - font-size: 10px; -} - -.h1-font{ - color: #006699; - display: inline; - font: bold 13px Verdana, Arial, Helvetica, sans-serif; - margin: 0; - text-decoration: none; -} - -.h2-font{ - display: inline; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; -} - -.height1{ - height: 1px; -} - -.height22{ - height: 22px; -} - -.height25{ - height: 25px; -} - -.height28{ - height: 28px; -} - -.height30{ - height: 30px; -} - -.height40{ - height: 40px; -} - -/* This is the line in the posting page which shows the rollover -help line. Colour value in row2 */ -.helpline{ - border: 0 solid; - font-size: 10px; -} - -.imgfolder{ - margin: 1px 4px 1px 4px; -} - -.imgspace{ - margin-left: 1px; - margin-right: 2px; -} - -/* Specify the space around images */ -.imgtopic,.imgicon{ - margin-left: 3px; -} - -.left{ - text-align: left; -} - -/* The largest text used in the index page title and toptic title etc. */ -.maintitle,h1,h2{ - color: #5C81B1; - font: bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif; - text-decoration: none; -} - -.maxwidth{ - width: 100%; -} - -.mod,a.mod,a.mod:visited{ - color: #006600; -} - -/* Name of poster in viewmsg.php and viewtopic.php and other places */ -.name{ - font-size: 11px; - font-weight: bold; -} - -/* Used for the navigation text,(Page 1,2,3 etc) and the navigation bar when in a forum */ -.nav{ - font-size: 11px; - font-weight: bold; -} - -.nowrap{ - white-space: nowrap; -} - -.postbody{ - font-size: 12px; - line-height: 125%; -} - -.postbody a{ - text-decoration: underline; -} - -/* Location,number of posts,post date etc */ -.postdetails{ - color: #00396A; - font-size: 10px; -} - -/* Quote blocks */ -.quote{ - background: #F3F3EF; - border: 1px solid #C2C6BA; - color: #006699; - font-size: 11px; - line-height: 125%; -} - -.right{ - text-align: right; -} - -/* Main table cell colours and backgrounds */ -.row1{ - background: #F0F0EB; -} - -.row2,.helpline{ - background: #E5E6E2; -} - -.row3{ - background: #DBDBD4; -} - -.subtitle,h2{ - font: bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif; - text-decoration: none; -} - -/* titles for the topics:could specify viewed link colour too */ -.topictitle { - color: #000000; - font-size: 11px; - font-weight: bold; -} - -.underline{ - text-decoration: underline; -} - -.top{ -vertical-align:top; -} - -.image-hspace{ -margin-right:3px; -} - -.clear{ -clear:both; -} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/subsilver.min.css b/min_unit_tests/_test_files/css/subsilver.min.css deleted file mode 100644 index f59b15a..0000000 --- a/min_unit_tests/_test_files/css/subsilver.min.css +++ /dev/null @@ -1,18 +0,0 @@ -.float-l{float:left}.form-suggest{height:200px;background:#DEE2D0;vertical-align:top}.form-input -input{font-size:10px}.hide{display:none}.form-input -textarea{font-size:11px;width:350px}.form-label{font-size:10px;font-weight:bold;line-height:25px;padding-right:10px;text-align:right;width:100px;color:#39738F}.font-9{font-size:9px}.form-topic{font-weight:bold}.form-error{color:red}.inline{display:inline}.space-10{clear:both;font-size:10px;height:10px;line-height:10px}.suggest-success{color:green;padding-left:10px;font-size:11px;font-weight:bold}.top{vertical-align:top}table -td{padding:3px}a:link,a:active,a:visited,a.postlink{color:#069;text-decoration:none}a:hover{color:#DD6900}a.admin:hover,a.mod:hover{color:#DD6900}a.but,a.but:hover,a.but:visited{color:#000;text-decoration:none}a.topictitle:visited{color:#5493B4}a.topictitle:hover{color:#DD6900}body{color:#000;font:11px Verdana,Arial,Helvetica,sans-serif;margin:0 -10px 10px 10px;padding:0;overflow:auto}font,th,td,p{font:12px Verdana,Arial,Helvetica,sans-serif}form{display:inline}hr{border:0px -solid #FFF;border-top-width:1px;height:0px}img{border:0 -solid}input{font:11px Verdana,Arial,Helvetica,sans-serif}input.button,input.liteoption,.fakebut{background:#FAFAFA;border:1px -solid #000;font-size:11px}input.catbutton{background:#FAFAFA;border:1px -solid #000;font-size:10px}input.mainoption{background:#FAFAFA;border:1px -solid #000;font-size:11px;font-weight:bold}input.post,textarea.post{background:#FFF;border:1px -solid #000;font:11px Verdana,Arial,Helvetica,sans-serif;padding-bottom:2px;padding-left:2px}select{background:#FFF;font:11px Verdana,Arial,Helvetica,sans-serif}table{text-align:left}td{vertical-align:middle}td.cat{background-color:#C2C6BA;font-weight:bold;height:20px;letter-spacing:1px;text-indent:4px}td.genmed,.genmed{font-size:11px}td.rowpic{background:#C2C6BA}td.spacerow{background:#E5E6E2}th{background-color:#FADD31;background-image:url(images/cellpic3.gif);background-repeat:repeat-x;color:#68685E;font-size:11px;font-weight:bold;line-height:16px;height:16px;padding-left:8px;padding-right:8px;text-align:center;white-space:nowrap}.admin,.mod{font-size:11px;font-weight:bold}.admin,a.admin,a.admin:visited{color:#FFA34F}.bodyline{background:#FFF;border:1px -solid #98AAB1}.center{text-align:center}.code{background:#FAFAFA;border:1px -solid #D1D7DC;color:#060;font:12px Courier,"Courier New",sans-serif;padding:5px}.errorline{background:#E5E6E2;border:1px -solid #8F8B8B;color:#D92A2A}.explaintitle{color:#5C81B1;font-size:11px;font-weight:bold}.forumline{background:#FFF}.gensmall{font-size:10px}.h1-font{color:#069;display:inline;font:bold 13px Verdana,Arial,Helvetica,sans-serif;margin:0;text-decoration:none}.h2-font{display:inline;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.height1{height:1px}.height22{height:22px}.height25{height:25px}.height28{height:28px}.height30{height:30px}.height40{height:40px}.helpline{border:0 -solid;font-size:10px}.imgfolder{margin:1px -4px 1px 4px}.imgspace{margin-left:1px;margin-right:2px}.imgtopic,.imgicon{margin-left:3px}.left{text-align:left}.maintitle,h1,h2{color:#5C81B1;font:bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.maxwidth{width:100%}.mod,a.mod,a.mod:visited{color:#060}.name{font-size:11px;font-weight:bold}.nav{font-size:11px;font-weight:bold}.nowrap{white-space:nowrap}.postbody{font-size:12px;line-height:125%}.postbody -a{text-decoration:underline}.postdetails{color:#00396A;font-size:10px}.quote{background:#F3F3EF;border:1px -solid #C2C6BA;color:#069;font-size:11px;line-height:125%}.right{text-align:right}.row1{background:#F0F0EB}.row2,.helpline{background:#E5E6E2}.row3{background:#DBDBD4}.subtitle,h2{font:bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.topictitle{color:#000;font-size:11px;font-weight:bold}.underline{text-decoration:underline}.top{vertical-align:top}.image-hspace{margin-right:3px}.clear{clear:both} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/unusual_strings.css b/min_unit_tests/_test_files/css/unusual_strings.css deleted file mode 100644 index 69fa756..0000000 --- a/min_unit_tests/_test_files/css/unusual_strings.css +++ /dev/null @@ -1,10 +0,0 @@ -/* test unusual, but valid strings in CSS */ - -foo[attr="multiple spaces"] { - content: "Hello World!"; -} - -foo[attr="Hel\ -lo"] { - content: " \"World\""; -} diff --git a/min_unit_tests/_test_files/css/unusual_strings.min.css b/min_unit_tests/_test_files/css/unusual_strings.min.css deleted file mode 100644 index 4b7d97e..0000000 --- a/min_unit_tests/_test_files/css/unusual_strings.min.css +++ /dev/null @@ -1,2 +0,0 @@ -foo[attr="multiple spaces"]{content:"Hello World!"}foo[attr="Hel\ -lo"]{content:" \"World\""} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/vladmirated.css b/min_unit_tests/_test_files/css/vladmirated.css deleted file mode 100644 index 819835e..0000000 --- a/min_unit_tests/_test_files/css/vladmirated.css +++ /dev/null @@ -1,658 +0,0 @@ -/* from http://www.vladimirated.com/web-development-minify-css-using-php-and-cssmin-class */ - - #comments_inviter #close_me { - clear: both; - text-align: center; - border-top: 1px solid #eeeeee; - padding-top: 10px; - } - - #comments_inviter #close_me span { - color: #108eed; - cursor: pointer; - font-weight: bold; - } - - #comments_inviter img { - float: left; - margin-right: 3px; - margin-bottom: 10px; - } - - #comments_inviter { - width: 200px; - background-color: #FFFFFF; - border: 4px solid #eeeeee; - font-size: 10px; - font-family: verdana; - padding: 10px; - color: #333333; - } - - .one_com { - background-color: #FAFAFA; - padding: 10px; - margin-bottom: 20px; - border: 1px solid #EEEEEE; - } - - .one_com .com_says, .one_com .com_det { - text-transform: lowercase; - color: #333333; - padding: 0px; - font-family: verdana; - margin: 0px; - font-size: 13px; - font-weight: bold; - } - - .flvPlayer { - text-align: center; - border: 5px solid #dddddd; - width: 320px; - } - - .one_com .com_det { - font-size: 10px; - font-weight: normal; - margin-bottom: 20px; - padding-bottom: 10px; - border-bottom: 8px solid #eeeeee; - } - - .one_com .com_det a { - text-decoration: none; - } - - .one_com .com_txt { - background-color: #ffffff; - margin-bottom: 10px; - border-bottom: 2px solid #eeeeee - } - - .one_com .com_txt p { - font-family: verdana; - font-size: 13px; - color: #777777; - margin: 0px; - padding: 5px; - padding-bottom: 10px; - text-transform: lowercase; - } - - .one_com .com_says a { - color: #333333; - } - - .one_com .com_det a { - color: #333333; - } - - .post_box .related_posts { - - } - - .post_box .related_posts p { - padding: 0px; - margin: 0px; - padding-bottom: 20px; - padding-left: 35px; - font-family: verdana; - - } - - .post_box .related_posts a { - color: #108eed; - } - - .post_nav_2 p { - - text-align: center; - color: #cccccc; - font-family: verdana; - } - - .post_box .related_posts h3, #comments_box #respond, .comments_posted h3 { - padding: 0px; - margin: 0px; - font-size: 18px; - color: #FF8000; - padding-top: 30px; - margin-bottom: 20px; - width: 300px; - border-bottom: 5px solid #e0e0e0; - } - - .comments_posted { - - margin-bottom: 50px; - - } - - .comments_posted h3 { - padding: 0px; - margin: 0px; - margin-bottom: 20px; - - } - - .cmt_txtarea { - width: 300px; - height: 100px; - - } - - #comments_box #respond { - - padding-top: 0px; - margin-bottom: 0px; - - } - - .pagetitle { - color: #65DA33; - text-align: center; - } - - #searchform { - padding: 0px; - margin: 0px; - } - - .si { - background-color: #FFFFEE; - border: 1px solid #e0e0e0; - } - - #rightcol #r_news, #rightcol #linksbro, #rightcol #quick_tags { - margin-top: 30px; - padding-bottom: 10px; - } - - #post_nav p { - padding: 0px; - margin: 0px; - padding-bottom: 5px; - } - - #post_nav { - text-align: left; - padding-bottom: 15px; - } - - #post_nav a, .post_nav_2 p a { - text-decoration: none; - font-family: Verdana; - font-size: 12px; - color: #108eed; - } - - #post_nav a:hover, .post_nav_2 p a:hover { - text-decoration: underline; - color: #FF8000; - } - - #rightcol #about { - padding-bottom: 10px; - } - - #rightcol #r_news input { - color: #333333; - font-size: 12px; - } - - #header { - height: 200px; - width: 100%; - background-image: url('images/header_bg.jpg'); - background-repeat: x-repeat; - } - - #header img { - - float: right; - margin-right: -3px; - z-index: 100; - - } - - .tags { - text-transform: lowercase; - color: #333333; - font-family: arial; - font-size: 12px; - border-top: 2px dotted #EEEEEE; - width: 300px; - padding-top: 20px; - padding-bottom: 0px; - margin-top: 0px; - padding-left: 20px; - padding-right: 20px; - } - - .tags a { - color: #108eed; - } - - .tags p { - text-align: left; - margin: 0px; - padding: 0px; - } - - blockquote strong { - font-family: verdana; - display: block; - margin-top: 10px; - color: #FF0000; - font-style: italic; - text-align: right; - } - - blockquote { - margin: 0px; - background-color: #eeeeee; - border: 2px solid #dddddd; - padding: 24px; - padding-top: 10px; - padding-left: 60px; - padding-bottom: 10px; - font-size: 13px; - color: #333333; - margin-bottom: 30px; - margin-top: 10px; - } - - - html>body #header img { margin-right: 0px; } - - #subscribe h3 { - color: #ff0000; - margin-top: 30px; - padding: 20px; - } - - .post_actions a{ - color: #108eed; - } - - .post_actions { - border-top: 4px solid #DDDDDD; - border-bottom: 1px solid #EEEEEE; - text-align: center; - background-color: #FFFFDd; - color: #dddddd; - white-space: no-wrap; - padding-left: 20px; - padding-bottom: 5px; - text-transform: capitalize; - } - - #subscribe td { - color: #333333; - font-size: 12px; - text-transform: lowercase; - } - - #subscribe input { - font-size: 13px; - color: #333333; - } - - .post_content { - font-size: 13px; - margin-top: 10px; - padding-bottom: 10px; - text-align: justify; - font-family: verdana; - } - - .post_content p { - margin: 0px; - padding: 0px; - padding-bottom: 20px; - line-height: 20px; - } - - #header h1 { - z-index: 200; - margin: 0px; - position: absolute; - float: left; - text-transform: lowercase; - padding: 0px; - font-size: 45px; - margin-top: 70px; - margin-left: 40px; - - } - - #header h1 a { - white-space: no-wrap; - text-decoration: none; - color: #FAFAFA; - display: block - } - - #header h1 a:hover { - color: #FAFAFA; - border-bottom: 3px dotted #FAFAFA; - } - - html>body #header h1 { margin-left: 60px; } - - body { - margin: 0px; - padding: 0px; - height: 100%; - width: 100%; - font-family: 'Lucida Sans Unicode', 'Lucida Grande', Sans-Serif, Verdana, Arial; - font-size: 12px; - } - - #leftcol { - float: left; - width: 200px; - margin-left: 0px; - margin-top: 17px; - color: #000; - padding: 3px; - height: 100%; - } - - #leftcol .box_head h3 { - text-transform: uppercase; - padding: 0px; - margin: 0px; - font-family: georgia; - font-size: 18px; - color: #dddddd; - border-top: 4px solid #dddddd; - border-bottom: 4px solid #cccccc; - padding-left: 10px; - padding-top: 10px; - padding-bottom: 10px; - background-image: url('images/stripesbg.png'); - margin-bottom: 10px; - } - - #leftcol .box_head input { - text-transform: lowercase; - color: #333333; - } - - #leftcol .box_head { - margin-left: 7px; - background-color: #ffefd4; - border-bottom: 2px solid #eeeeee; - padding-bottom: 20px; - margin-bottom: 30px; - } - - #leftcol .box_head p a { - color: #0a2d4d; - display: block; - text-decoration: none; - border-bottom: 3px solid #fefefe; - padding-top: 20px; - text-transform: lowercase; - padding-bottom: 20px; - padding-left: 5px; - padding-right: 5px; - } - - #leftcol .box_head p a:hover { - background-color: #fafafa; - border-bottom: 3px solid #eeeeee; - color: #000000; - } - - #leftcol .box_head p { - text-align: left; - margin: 0px; - width: 170px; - padding-bottom: 0px; - padding-top: 0px; - font-size: 11px; - } - - #rightcol { - position: absolute; - left: 77%; - top: 278px; - border: 3px solid #eeeeee; - width: 200px; - z-index: 3; - color: #333333; - padding: 10px; - text-transform: lowercase; - - } - - #rightcol p { - padding: 0px; - marging: 0px; - text-align: justify; - } - - #rightcol #about img, #rightcol #linksbro img { - border: 5px solid #eeeeee; - } - - #rightcol #about h3, #rightcol #r_news h3, #rightcol #linksbro h3, #rightcol #quick_tags h3 { - background-color: #fafafa; - border: 1px dotted #e0e0e0; - font-size: 14px; - color: #104bbc; - padding: 5px; - padding-top: 10px; - font-family: Arial; - padding-bottom: 10px; - } - - #rightcol #about p a, #rightcol #r_news p a, #rightcol #linksbro p a { - color: #108eed; - } - - #rightcol #about p, #rightcol #r_news p, #rightcol #linksbro p { - font-size: 12px; - text-align: left; - } - - #content_warp { - margin: 20px 25% 0 215px; - padding: 3px; - color: #000; - background-color: #ededed; - } - - #content { - margin: 5px; - background-color: #FFFFFF; - padding: 10px; - } - - - #footer { - width: 99%; - margin-top: 30px; - height: 98px; - background-color: #101b1d; - } - - #footer td a { - color: #FF8000; - } - - #footer td a img { - border: 2px solid #108eed; - } - - #footer td p { - font-family: Verdana; - font-size: 10px; - color: #c0c0c0; - padding: 0px; - margin: 0px; - text-align: center; - padding-bottom: 10px; - } - - .s_offer { - color: #65DA33; - font-size: 20px; - font-weight: bold; - font-style: normal; - } - - .post_box { - text-transform: lowercase; - margin-bottom: 40px; - } - - #newsletter_box { - text-transform: lowercase; - margin-bottom: 10px; - margin-top: 30px; - font-style: normal; - background-color: #ffffff; - border: 5px solid #dddddd; - } - - #newsletter_head { - color: #EEEEEE; - font-family: Georgia; - background-image: url('images/stripesbg.png'); - padding: 10px; - padding-left: 30px; - border-bottom: 5px solid #dddddd; - } - - #newsletter_body { - color: #333333; - font-family: Verdana; - text-align: justify; - background-color: #FFFFFF; - padding: 10px; - font-size: 13px; - } - - .s_offer { - color: #65DA33; - font-size: 26px; - font-weight: bold; - font-style: normal; - } - - .post_title a { - color: #EEEEEE; - text-decoration: none; - } - - .post_title a:hover { - color: #c0c0c0; - } - - .post_title { - background-image: url('images/stripe_post.png'); - text-transform: uppercase; - font-size: 18px; - font-family: georgia; - padding: 10px; - border-top: 4px solid #c0c0c0; - margin: 0px; - border-bottom: 2px solid #ffffdd; - } - - .post_det { - text-transform: none; - margin: 0px; - border-top: 1px solid #f0f0f0; - padding: 0px; - padding-top: 5px; - color: #999999; - font-size: 10px; - font-family: verdana; - margin-bottom: 20px; - background-color: #eeeeee; - padding-bottom: 5px; - padding-left: 10px; - text-align: left; - border-bottom: 2px solid #dddddd; - } - - .post_det a { - color: #999999; - text-decoration: none; - } - - - .subtle { - text-transform: lowercase; - font-size: 10px; - font-family: verdana; - color: #108eed; - text-align: justify; - } - - #top_menu #navlist, #top_menu #navlist li { - padding:0px; - margin: 0px; - padding-top: 14px; - text-transform: lowercase; - padding-bottom: 17px; - padding-left: 30px; - border-left: 1px solid #65cdef; - } - - #top_menu #navlist, #top_menu #navlist li #first { - - border-left: 0px; - - } - - #top_menu #navlist { - padding-left: 30px; - background-color: #1dabd9; - border-top: 5px solid #0e96c3; - border-bottom: 5px solid #0e96c3; - } - - #top_menu #navlist li { - color: #444444; - font-size: 10px; - display: inline; - list-style-type: none; - padding-right: 30px; - } - - #top_menu #navlist li a { - text-decoration: none; - font-family: Verdana; - color: #fafafa; - font-size: 12px; - font-weight: bold; - } - - #top_menu #navlist li a:hover { - color: #333333; - } - - .post_content a { - color: #108eed; - } - - ul#tagcloud { padding:0; margin:0; text-align:center; list-style:none; } - ul#tagcloud li { display:inline; font-size:70%; color:#ccc; background: none; padding: 0;} - ul#tagcloud li a, ul#tagcloud li a:link { text-decoration:none; } - ul#tagcloud li a:hover { text-decoration:underline; } - ul#tagcloud li.t1 a { color:#797979; font-size: 120%; } - ul#tagcloud li.t2 a { color:#6d6d6d; font-size: 160%; } - ul#tagcloud li.t3 a { color:#616161; font-size: 190%; } - ul#tagcloud li.t4 a { color:#555555; font-size: 210%; } - ul#tagcloud li.t5 a { color:#484848; font-size: 230%; } - ul#tagcloud li.t6 a { color:#3c3c3c; font-size: 250%; } - ul#tagcloud li.t7 a { color:#303030; font-size: 270%; } - ul#tagcloud li.t8 a { color:#242424; font-size: 290%; } - ul#tagcloud li.t9 a { color:#181818; font-size: 310%; } - ul#tagcloud li.t10 a { color:#0c0c0c; font-size: 330%; } \ No newline at end of file diff --git a/min_unit_tests/_test_files/css/vladmirated.min.css b/min_unit_tests/_test_files/css/vladmirated.min.css deleted file mode 100644 index eaffaee..0000000 --- a/min_unit_tests/_test_files/css/vladmirated.min.css +++ /dev/null @@ -1,79 +0,0 @@ -#comments_inviter -#close_me{clear:both;text-align:center;border-top:1px solid #eee;padding-top:10px}#comments_inviter #close_me -span{color:#108eed;cursor:pointer;font-weight:bold}#comments_inviter -img{float:left;margin-right:3px;margin-bottom:10px}#comments_inviter{width:200px;background-color:#FFF;border:4px -solid #eee;font-size:10px;font-family:verdana;padding:10px;color:#333}.one_com{background-color:#FAFAFA;padding:10px;margin-bottom:20px;border:1px -solid #EEE}.one_com .com_says, .one_com -.com_det{text-transform:lowercase;color:#333;padding:0px;font-family:verdana;margin:0px;font-size:13px;font-weight:bold}.flvPlayer{text-align:center;border:5px -solid #ddd;width:320px}.one_com -.com_det{font-size:10px;font-weight:normal;margin-bottom:20px;padding-bottom:10px;border-bottom:8px solid #eee}.one_com .com_det -a{text-decoration:none}.one_com -.com_txt{background-color:#fff;margin-bottom:10px;border-bottom:2px solid #eee}.one_com .com_txt -p{font-family:verdana;font-size:13px;color:#777;margin:0px;padding:5px;padding-bottom:10px;text-transform:lowercase}.one_com .com_says -a{color:#333}.one_com .com_det -a{color:#333}.post_box -.related_posts{}.post_box .related_posts -p{padding:0px;margin:0px;padding-bottom:20px;padding-left:35px;font-family:verdana}.post_box .related_posts -a{color:#108eed}.post_nav_2 -p{text-align:center;color:#ccc;font-family:verdana}.post_box .related_posts h3, #comments_box #respond, .comments_posted -h3{padding:0px;margin:0px;font-size:18px;color:#FF8000;padding-top:30px;margin-bottom:20px;width:300px;border-bottom:5px solid #e0e0e0}.comments_posted{margin-bottom:50px}.comments_posted -h3{padding:0px;margin:0px;margin-bottom:20px}.cmt_txtarea{width:300px;height:100px}#comments_box -#respond{padding-top:0px;margin-bottom:0px}.pagetitle{color:#65DA33;text-align:center}#searchform{padding:0px;margin:0px}.si{background-color:#FFE;border:1px -solid #e0e0e0}#rightcol #r_news, #rightcol #linksbro, #rightcol -#quick_tags{margin-top:30px;padding-bottom:10px}#post_nav -p{padding:0px;margin:0px;padding-bottom:5px}#post_nav{text-align:left;padding-bottom:15px}#post_nav a, .post_nav_2 p -a{text-decoration:none;font-family:Verdana;font-size:12px;color:#108eed}#post_nav a:hover, .post_nav_2 p a:hover{text-decoration:underline;color:#FF8000}#rightcol -#about{padding-bottom:10px}#rightcol #r_news -input{color:#333;font-size:12px}#header{height:200px;width:100%;background-image:url('images/header_bg.jpg');background-repeat:x-repeat}#header -img{float:right;margin-right: -3px;z-index:100}.tags{text-transform:lowercase;color:#333;font-family:arial;font-size:12px;border-top:2px dotted #EEE;width:300px;padding-top:20px;padding-bottom:0px;margin-top:0px;padding-left:20px;padding-right:20px}.tags -a{color:#108eed}.tags -p{text-align:left;margin:0px;padding:0px}blockquote -strong{font-family:verdana;display:block;margin-top:10px;color:#F00;font-style:italic;text-align:right}blockquote{margin:0px;background-color:#eee;border:2px -solid #ddd;padding:24px;padding-top:10px;padding-left:60px;padding-bottom:10px;font-size:13px;color:#333;margin-bottom:30px;margin-top:10px}html>body #header -img{margin-right:0px}#subscribe -h3{color:#f00;margin-top:30px;padding:20px}.post_actions -a{color:#108eed}.post_actions{border-top:4px solid #DDD;border-bottom:1px solid #EEE;text-align:center;background-color:#FFD;color:#ddd;white-space:no-wrap;padding-left:20px;padding-bottom:5px;text-transform:capitalize}#subscribe -td{color:#333;font-size:12px;text-transform:lowercase}#subscribe -input{font-size:13px;color:#333}.post_content{font-size:13px;margin-top:10px;padding-bottom:10px;text-align:justify;font-family:verdana}.post_content -p{margin:0px;padding:0px;padding-bottom:20px;line-height:20px}#header -h1{z-index:200;margin:0px;position:absolute;float:left;text-transform:lowercase;padding:0px;font-size:45px;margin-top:70px;margin-left:40px}#header h1 -a{white-space:no-wrap;text-decoration:none;color:#FAFAFA;display:block}#header h1 a:hover{color:#FAFAFA;border-bottom:3px dotted #FAFAFA}html>body #header -h1{margin-left:60px}body{margin:0px;padding:0px;height:100%;width:100%;font-family:'Lucida Sans Unicode','Lucida Grande',Sans-Serif,Verdana,Arial;font-size:12px}#leftcol{float:left;width:200px;margin-left:0px;margin-top:17px;color:#000;padding:3px;height:100%}#leftcol .box_head -h3{text-transform:uppercase;padding:0px;margin:0px;font-family:georgia;font-size:18px;color:#ddd;border-top:4px solid #ddd;border-bottom:4px solid #ccc;padding-left:10px;padding-top:10px;padding-bottom:10px;background-image:url('images/stripesbg.png');margin-bottom:10px}#leftcol .box_head -input{text-transform:lowercase;color:#333}#leftcol -.box_head{margin-left:7px;background-color:#ffefd4;border-bottom:2px solid #eee;padding-bottom:20px;margin-bottom:30px}#leftcol .box_head p -a{color:#0a2d4d;display:block;text-decoration:none;border-bottom:3px solid #fefefe;padding-top:20px;text-transform:lowercase;padding-bottom:20px;padding-left:5px;padding-right:5px}#leftcol .box_head p a:hover{background-color:#fafafa;border-bottom:3px solid #eee;color:#000}#leftcol .box_head -p{text-align:left;margin:0px;width:170px;padding-bottom:0px;padding-top:0px;font-size:11px}#rightcol{position:absolute;left:77%;top:278px;border:3px -solid #eee;width:200px;z-index:3;color:#333;padding:10px;text-transform:lowercase}#rightcol -p{padding:0px;marging:0px;text-align:justify}#rightcol #about img, #rightcol #linksbro -img{border:5px -solid #eee}#rightcol #about h3, #rightcol #r_news h3, #rightcol #linksbro h3, #rightcol #quick_tags -h3{background-color:#fafafa;border:1px -dotted #e0e0e0;font-size:14px;color:#104bbc;padding:5px;padding-top:10px;font-family:Arial;padding-bottom:10px}#rightcol #about p a, #rightcol #r_news p a, #rightcol #linksbro p -a{color:#108eed}#rightcol #about p, #rightcol #r_news p, #rightcol #linksbro -p{font-size:12px;text-align:left}#content_warp{margin:20px -25% 0 215px;padding:3px;color:#000;background-color:#ededed}#content{margin:5px;background-color:#FFF;padding:10px}#footer{width:99%;margin-top:30px;height:98px;background-color:#101b1d}#footer td -a{color:#FF8000}#footer td a -img{border:2px -solid #108eed}#footer td -p{font-family:Verdana;font-size:10px;color:#c0c0c0;padding:0px;margin:0px;text-align:center;padding-bottom:10px}.s_offer{color:#65DA33;font-size:20px;font-weight:bold;font-style:normal}.post_box{text-transform:lowercase;margin-bottom:40px}#newsletter_box{text-transform:lowercase;margin-bottom:10px;margin-top:30px;font-style:normal;background-color:#fff;border:5px -solid #ddd}#newsletter_head{color:#EEE;font-family:Georgia;background-image:url('images/stripesbg.png');padding:10px;padding-left:30px;border-bottom:5px solid #ddd}#newsletter_body{color:#333;font-family:Verdana;text-align:justify;background-color:#FFF;padding:10px;font-size:13px}.s_offer{color:#65DA33;font-size:26px;font-weight:bold;font-style:normal}.post_title -a{color:#EEE;text-decoration:none}.post_title a:hover{color:#c0c0c0}.post_title{background-image:url('images/stripe_post.png');text-transform:uppercase;font-size:18px;font-family:georgia;padding:10px;border-top:4px solid #c0c0c0;margin:0px;border-bottom:2px solid #ffd}.post_det{text-transform:none;margin:0px;border-top:1px solid #f0f0f0;padding:0px;padding-top:5px;color:#999;font-size:10px;font-family:verdana;margin-bottom:20px;background-color:#eee;padding-bottom:5px;padding-left:10px;text-align:left;border-bottom:2px solid #ddd}.post_det -a{color:#999;text-decoration:none}.subtle{text-transform:lowercase;font-size:10px;font-family:verdana;color:#108eed;text-align:justify}#top_menu #navlist, #top_menu #navlist -li{padding:0px;margin:0px;padding-top:14px;text-transform:lowercase;padding-bottom:17px;padding-left:30px;border-left:1px solid #65cdef}#top_menu #navlist, #top_menu #navlist li -#first{border-left:0px}#top_menu -#navlist{padding-left:30px;background-color:#1dabd9;border-top:5px solid #0e96c3;border-bottom:5px solid #0e96c3}#top_menu #navlist -li{color:#444;font-size:10px;display:inline;list-style-type:none;padding-right:30px}#top_menu #navlist li -a{text-decoration:none;font-family:Verdana;color:#fafafa;font-size:12px;font-weight:bold}#top_menu #navlist li a:hover{color:#333}.post_content -a{color:#108eed}ul#tagcloud{padding:0;margin:0;text-align:center;list-style:none}ul#tagcloud -li{display:inline;font-size:70%;color:#ccc;background:none;padding:0}ul#tagcloud li a, ul#tagcloud li a:link{text-decoration:none}ul#tagcloud li a:hover{text-decoration:underline}ul#tagcloud li.t1 -a{color:#797979;font-size:120%}ul#tagcloud li.t2 -a{color:#6d6d6d;font-size:160%}ul#tagcloud li.t3 -a{color:#616161;font-size:190%}ul#tagcloud li.t4 -a{color:#555;font-size:210%}ul#tagcloud li.t5 -a{color:#484848;font-size:230%}ul#tagcloud li.t6 -a{color:#3c3c3c;font-size:250%}ul#tagcloud li.t7 -a{color:#303030;font-size:270%}ul#tagcloud li.t8 -a{color:#242424;font-size:290%}ul#tagcloud li.t9 -a{color:#181818;font-size:310%}ul#tagcloud li.t10 -a{color:#0c0c0c;font-size:330%} \ No newline at end of file diff --git a/min_unit_tests/_test_files/css_uriRewriter/exp.css b/min_unit_tests/_test_files/css_uriRewriter/exp.css deleted file mode 100644 index d749295..0000000 --- a/min_unit_tests/_test_files/css_uriRewriter/exp.css +++ /dev/null @@ -1,14 +0,0 @@ -@import "/_test_files/css_uriRewriter/foo.css"; -@import '/_test_files/css_uriRewriter/bar/foo.css' print; -@import '/_test_files/bar/foo.css' print; -@import '/foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(/_test_files/foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('/_test_files/css_uriRewriter/bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/min_unit_tests/_test_files/css_uriRewriter/in.css b/min_unit_tests/_test_files/css_uriRewriter/in.css deleted file mode 100644 index aa41d0a..0000000 --- a/min_unit_tests/_test_files/css_uriRewriter/in.css +++ /dev/null @@ -1,14 +0,0 @@ -@import "foo.css"; -@import 'bar/foo.css' print; -@import '../bar/foo.css' print; -@import '../../foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(../foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/min_unit_tests/_test_files/html/before.html b/min_unit_tests/_test_files/html/before.html deleted file mode 100644 index c22cc8f..0000000 --- a/min_unit_tests/_test_files/html/before.html +++ /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_unit_tests/_test_files/html/before.min.html b/min_unit_tests/_test_files/html/before.min.html deleted file mode 100644 index 58ba2bb..0000000 --- a/min_unit_tests/_test_files/html/before.min.html +++ /dev/null @@ -1,36 +0,0 @@ -css Zen Garden: The Beauty in CSS Design

    Browser != IE

    css Zen Garden

    The Beauty of CSS Design

    -	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_unit_tests/_test_files/html/before2.html b/min_unit_tests/_test_files/html/before2.html deleted file mode 100644 index 4ca7f19..0000000 --- a/min_unit_tests/_test_files/html/before2.html +++ /dev/null @@ -1,95 +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

    -
    - -Preserve at least 1 char of whitespace near scripts in case of document.write(). -
    - - \ No newline at end of file diff --git a/min_unit_tests/_test_files/html/before2.min.html b/min_unit_tests/_test_files/html/before2.min.html deleted file mode 100644 index ae28465..0000000 --- a/min_unit_tests/_test_files/html/before2.min.html +++ /dev/null @@ -1,36 +0,0 @@ -css Zen Garden: The Beauty in CSS Design

    Browser != IE

    css Zen Garden

    The Beauty of CSS Design

    -	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

    Preserve at least 1 char of whitespace near scripts in case of document.write().
    \ No newline at end of file diff --git a/min_unit_tests/_test_files/importProcessor/1/adjacent.css b/min_unit_tests/_test_files/importProcessor/1/adjacent.css deleted file mode 100644 index da52c69..0000000 --- a/min_unit_tests/_test_files/importProcessor/1/adjacent.css +++ /dev/null @@ -1,3 +0,0 @@ -/* @import url('bad.css' ) bad; */ -adjacent2 foo { background: red url(/red.gif); } -adjacent2 bar { background: url('../green.gif') } \ No newline at end of file diff --git a/min_unit_tests/_test_files/importProcessor/1/tv.css b/min_unit_tests/_test_files/importProcessor/1/tv.css deleted file mode 100644 index 69fa2f5..0000000 --- a/min_unit_tests/_test_files/importProcessor/1/tv.css +++ /dev/null @@ -1,4 +0,0 @@ -@import url( adjacent.css ) all; -@import '../input.css'; -tv foo { background: red url(/red.gif); } -tv bar { background: url('../green.gif') } \ No newline at end of file diff --git a/min_unit_tests/_test_files/importProcessor/adjacent.css b/min_unit_tests/_test_files/importProcessor/adjacent.css deleted file mode 100644 index b452f47..0000000 --- a/min_unit_tests/_test_files/importProcessor/adjacent.css +++ /dev/null @@ -1,4 +0,0 @@ -@import url(../css/styles.css); -@import url(http://example.com/hello.css); -adjacent foo { background: red url(/red.gif); } -adjacent bar { background: url('../green.gif') } \ No newline at end of file diff --git a/min_unit_tests/_test_files/importProcessor/input.css b/min_unit_tests/_test_files/importProcessor/input.css deleted file mode 100644 index bb7b959..0000000 --- a/min_unit_tests/_test_files/importProcessor/input.css +++ /dev/null @@ -1,4 +0,0 @@ -@import url( adjacent.css ) screen; -@import "1/tv.css" tv, projection; -input foo { background: red url(/red.gif); } -input bar { background: url('../green.gif') } \ No newline at end of file diff --git a/min_unit_tests/_test_files/importProcessor/output.css b/min_unit_tests/_test_files/importProcessor/output.css deleted file mode 100644 index 1e4358c..0000000 --- a/min_unit_tests/_test_files/importProcessor/output.css +++ /dev/null @@ -1,48 +0,0 @@ -@media screen { -/* some CSS to try to exercise things in general */ - -@import url(/more.css); - - body, td, th { - font-family: Verdana , "Bitstream Vera Sans" , sans-serif ; - - font-size : 12px; -} - -.nav { - margin-left: 20%; -} -#main-nav { - background-color: red; - border: 1px solid #00ff77; -} - -div#content -h1 + p { - padding-top: 0; - margin-top: 0; -} - -@media all and (min-width: 640px) { - #media-queries-1 { background-color: #0f0; } -} - -@media screen and (max-width: 2000px) { - #media-queries-2 { background-color: #0f0; } -} -@import url(http://example.com/hello.css); -adjacent foo { background: red url(/red.gif); } -adjacent bar { background: url('%TEST_FILES_URI%/green.gif') } -} - -@media tv,projection { -/* @import url('%TEST_FILES_URI%/importProcessor/1/bad.css') bad; */ -adjacent2 foo { background: red url(/red.gif); } -adjacent2 bar { background: url('%TEST_FILES_URI%/importProcessor/green.gif') } -@import '../input.css'; -tv foo { background: red url(/red.gif); } -tv bar { background: url('%TEST_FILES_URI%/importProcessor/green.gif') } -} - -input foo { background: red url(/red.gif); } -input bar { background: url('%TEST_FILES_URI%/green.gif') } \ No newline at end of file diff --git a/min_unit_tests/_test_files/js/before.js b/min_unit_tests/_test_files/js/before.js deleted file mode 100644 index cccdb97..0000000 --- a/min_unit_tests/_test_files/js/before.js +++ /dev/null @@ -1,57 +0,0 @@ -/*! is.js - - (c) 2001 Douglas Crockford - 2001 June 3 -*/ - -// is - -// The -is- object is used to identify the browser. Every browser edition -// identifies itself, but there is no standard way of doing it, and some of -// the identification is deceptive. This is because the authors of web -// browsers are liars. For example, Microsoft's IE browsers claim to be -// Mozilla 4. Netscape 6 claims to be version 5. - -var is = { - ie: navigator.appName == 'Microsoft Internet Explorer', - java: navigator.javaEnabled(), - ns: navigator.appName == 'Netscape', - ua: navigator.userAgent.toLowerCase(), - version: parseFloat(navigator.appVersion.substr(21)) || - parseFloat(navigator.appVersion), - win: navigator.platform == 'Win32' -} -/*!* - * preserve this comment, too - */ -is.mac = is.ua.indexOf('mac') >= 0; -if (is.ua.indexOf('opera') >= 0) { - is.ie = is.ns = false; - is.opera = true; -} -if (is.ua.indexOf('gecko') >= 0) { - is.ie = is.ns = false; - is.gecko = true; -} - -/*@cc_on - /*@if (@_win32) - if (is.ie && is.win) - document.write("PASS: IE/win honored conditional comment.
    "); - @else @*/ - if (is.ie && is.win) - document.write("FAIL: IE/win did not honor multi-line conditional comment.
    "); - else - document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.
    "); - /*@end -@*/ - -var recognizesCondComm = true; -//@cc_on/* -recognizesCondComm = false; -//@cc_on*/ - -if ((is.ie && is.win) == recognizesCondComm) - document.write("PASS: IE/win honored single-line conditional comment.
    "); -else - document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.
    "); diff --git a/min_unit_tests/_test_files/js/before.min.js b/min_unit_tests/_test_files/js/before.min.js deleted file mode 100644 index 6f06c6e..0000000 --- a/min_unit_tests/_test_files/js/before.min.js +++ /dev/null @@ -1,22 +0,0 @@ -/* is.js - - (c) 2001 Douglas Crockford - 2001 June 3 -*/ -var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'} -/** - * preserve this comment, too - */ -is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;} -if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}/*@cc_on - /*@if (@_win32) - if (is.ie && is.win) - document.write("PASS: IE/win honored conditional comment.
    "); - @else @*/if(is.ie&&is.win) -document.write("FAIL: IE/win did not honor multi-line conditional comment.
    ");else -document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.
    ");/*@end -@*/var recognizesCondComm=true;//@cc_on/* -recognizesCondComm=false;//@cc_on*/ -if((is.ie&&is.win)==recognizesCondComm) -document.write("PASS: IE/win honored single-line conditional comment.
    ");else -document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.
    "); \ No newline at end of file diff --git a/min_unit_tests/_test_files/js/before.min_plus.js b/min_unit_tests/_test_files/js/before.min_plus.js deleted file mode 100644 index 6f06c6e..0000000 --- a/min_unit_tests/_test_files/js/before.min_plus.js +++ /dev/null @@ -1,22 +0,0 @@ -/* is.js - - (c) 2001 Douglas Crockford - 2001 June 3 -*/ -var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'} -/** - * preserve this comment, too - */ -is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;} -if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}/*@cc_on - /*@if (@_win32) - if (is.ie && is.win) - document.write("PASS: IE/win honored conditional comment.
    "); - @else @*/if(is.ie&&is.win) -document.write("FAIL: IE/win did not honor multi-line conditional comment.
    ");else -document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.
    ");/*@end -@*/var recognizesCondComm=true;//@cc_on/* -recognizesCondComm=false;//@cc_on*/ -if((is.ie&&is.win)==recognizesCondComm) -document.write("PASS: IE/win honored single-line conditional comment.
    ");else -document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.
    "); \ No newline at end of file diff --git a/min_unit_tests/_test_files/js/condcomm.js b/min_unit_tests/_test_files/js/condcomm.js deleted file mode 100644 index 28aa126..0000000 --- a/min_unit_tests/_test_files/js/condcomm.js +++ /dev/null @@ -1,14 +0,0 @@ -var isWin; -/*@cc_on - @if (@_win32) - isWin = true; - @else @*/ isWin = false; - /*@end -@*/ - -isWin = /*@cc_on!*/!1; - -var recognizesCondComm = true; -//@cc_on/* -recognizesCondComm = false; -//@cc_on*/ diff --git a/min_unit_tests/_test_files/js/condcomm.min_plus.js b/min_unit_tests/_test_files/js/condcomm.min_plus.js deleted file mode 100644 index d8c1ed3..0000000 --- a/min_unit_tests/_test_files/js/condcomm.min_plus.js +++ /dev/null @@ -1,13 +0,0 @@ -var isWin; -/*@cc_on - @if (@_win32) - isWin = true; - @else @*/ - isWin = false; - /*@end -@*/ - -var recognizesCondComm = true; -//@cc_on/* -recognizesCondComm = false; -//@cc_on*/ \ No newline at end of file diff --git a/min_unit_tests/_test_files/js/issue74.js b/min_unit_tests/_test_files/js/issue74.js deleted file mode 100644 index e12eaeb..0000000 --- a/min_unit_tests/_test_files/js/issue74.js +++ /dev/null @@ -1,4 +0,0 @@ - -function testIssue74() { - return /'/; -} diff --git a/min_unit_tests/_test_files/js/issue74.min.js b/min_unit_tests/_test_files/js/issue74.min.js deleted file mode 100644 index 3442a73..0000000 --- a/min_unit_tests/_test_files/js/issue74.min.js +++ /dev/null @@ -1 +0,0 @@ -function testIssue74(){return /'/;} \ No newline at end of file diff --git a/min_unit_tests/_test_files/js/issue74.min_plus.js b/min_unit_tests/_test_files/js/issue74.min_plus.js deleted file mode 100644 index 9caaa89..0000000 --- a/min_unit_tests/_test_files/js/issue74.min_plus.js +++ /dev/null @@ -1 +0,0 @@ -function testIssue74(){return /'/} \ No newline at end of file diff --git a/min_unit_tests/_test_files/js/jquery-1.2.3.js b/min_unit_tests/_test_files/js/jquery-1.2.3.js deleted file mode 100644 index c5a3337..0000000 --- a/min_unit_tests/_test_files/js/jquery-1.2.3.js +++ /dev/null @@ -1,3408 +0,0 @@ -(function(){ -/*! - * jQuery 1.2.3 - New Wave Javascript - * - * Copyright (c) 2008 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $ - * $Rev: 4663 $ - */ - -// Map over jQuery in case of overwrite -if ( window.jQuery ) - var _jQuery = window.jQuery; - -var jQuery = window.jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.prototype.init( selector, context ); -}; - -// Map over the $ in case of overwrite -if ( window.$ ) - var _$ = window.$; - -// Map the jQuery namespace to the '$' one -window.$ = jQuery; - -// A simple way to check for HTML strings or ID strings -// (both of which we optimize for) -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\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 + ">"; - }); - - // 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 \ No newline at end of file diff --git a/min_unit_tests/test_realpath.php b/min_unit_tests/test_realpath.php deleted file mode 100644 index 9ed6666..0000000 --- a/min_unit_tests/test_realpath.php +++ /dev/null @@ -1,64 +0,0 @@ - $_SERVER["DOCUMENT_ROOT"] - ,'__FILE__' => __FILE__ - ,'$_SERVER["SCRIPT_FILENAME"]' => $_SERVER["SCRIPT_FILENAME"] -); - -function e($txt) { - if (is_string($txt)) { - return htmlspecialchars($txt, ENT_QUOTES, 'UTF-8'); - } else { - return '' . htmlspecialchars(var_export($txt, true), ENT_QUOTES, 'UTF-8') . ''; - } -} -function rp() { - if (! isset($_POST['rp']) || ! is_string($_POST['rp'])) { - return ''; - } - return get_magic_quotes_gpc() - ? stripslashes($_POST['rp']) - : $_POST['rp']; -} - -header('Content-Type: text/html; charset=utf-8'); - -?> - -Test of $_SERVER and realpath() - - - -

    Test of $_SERVER and realpath()

    - - $value): ?> -

    - - - -
    value
    realpath(value)
    - -

    $_SERVER['REQUEST_URI']

    - - -
    value
    - -

    Test realpath()

    - - -

    -

    - -
    = 
    - -
    - - \ No newline at end of file diff --git a/min_unit_tests/test_simpletest.php b/min_unit_tests/test_simpletest.php deleted file mode 100644 index 114fe8a..0000000 --- a/min_unit_tests/test_simpletest.php +++ /dev/null @@ -1,20 +0,0 @@ -UnitTestCase(preg_replace('/^Test_/', '', get_class($this))); - } -} - -class Test_Sample extends MinifyTestCase { - function test_Hello() { - $this->assertTrue(true, 'Hello World!'); - } -} - -$test = new Grouptest('All tests'); -$test->addTestCase(new Test_Sample()); -$test->run(new HtmlReporter()); diff --git a/mincache/.htaccess b/mincache/.htaccess deleted file mode 100644 index d56271f..0000000 --- a/mincache/.htaccess +++ /dev/null @@ -1,44 +0,0 @@ - -# turn off MultiViews if enabled -Options -MultiViews - -# register .var as type-map and zd for deflate encoding -AddHandler type-map .mjs .mcss -AddEncoding deflate .zd - -# Necessary to add charset while using type-map -AddType application/x-javascript;charset=utf-8 js -AddType text/css;charset=utf-8 css - -# Below we remove the ETag header and set a far-off Expires -# header. Since clients will aggressively cache, make sure -# to modify the URL (querystring or via mod_rewrite) when -# the resource changes - -# remove ETag -FileETag None - -# requires mod_expires -ExpiresActive On -# sets Expires and Cache-Control: max-age, but not "public" -ExpiresDefault "access plus 1 year" - -# requires mod_headers -# adds the "public" to Cache-Control. -# -# If you get 500 errors, you may need to comment this out -# -Header set Cache-Control "public, max-age=31536000" - -# mod_rewrite reqd. -RewriteEngine On - -# remove any rev number -RewriteRule ^(.*)_\d+\.m(js|css)$ $1.m$2 - -# if mincache is NOT directly within document root, you must -# specify the path to it -RewriteCond %{DOCUMENT_ROOT}/mincache/$1 !-f - -# any unfound files go to PHP -RewriteRule ^(.*)$ gen.php?req=$1 [L,QSA] diff --git a/mincache/.htaccess-dev b/mincache/.htaccess-dev deleted file mode 100644 index 8ba411f..0000000 --- a/mincache/.htaccess-dev +++ /dev/null @@ -1,45 +0,0 @@ -# for Steve's test setup. You may delete this file - - - - -# turn off MultiViews if enabled -Options -MultiViews - -# register .var as type-map and zd for deflate encoding -AddHandler type-map .mjs .mcss -AddEncoding deflate .zd - -# Necessary to add charset while using type-map -AddType application/x-javascript;charset=utf-8 js -AddType text/css;charset=utf-8 css - -# Below we remove the ETag header and set a far-off Expires -# header. Since clients will aggressively cache, make sure -# to modify the URL (querystring or via mod_rewrite) when -# the resource changes - -# remove ETag -FileETag None - -# requires mod_expires -ExpiresActive On -# sets Expires and Cache-Control: max-age, but not "public" -ExpiresDefault "access plus 1 year" - -# requires mod_headers -# adds the "public" to Cache-Control. -Header set Cache-Control "public, max-age=31536000" - -# mod_rewrite reqd. -RewriteEngine On - -# remove any rev number -RewriteRule ^(.*)_\d+\.m(js|css)$ $1.m$2 - -# if mincache is NOT directly within document root, you must -# specify the path to it -RewriteCond %{DOCUMENT_ROOT}/_3rd_party/minify/mincache/$1 !-f - -# any unfound files go to PHP -RewriteRule ^(.*)$ gen.php?req=$1 [L,QSA] diff --git a/mincache/README.txt b/mincache/README.txt deleted file mode 100644 index 3e4a263..0000000 --- a/mincache/README.txt +++ /dev/null @@ -1,69 +0,0 @@ -The files in this directory represent a new way to serve minified files via the -Apache file server. This will yield much better performance than Minify can -deliver when all requests are routed through PHP. - - -REQUIREMENTS - -Apache server with mod_negotiation and mod_rewrite - - -GETTING STARTED - -The "min" directory must already be set up within the DOCUMENT_ROOT. - -Place the "mincache" directory in DOCUMENT_ROOT. - -Request this URL: http://yourserver.com/mincache/f/test.mcss -(It should return a CSS file with a "Success" comment.) - -Place CSS/JS source files in "/mincache/src" and/or specify groups in -"/min/groupsConfig.php" - - -UPDATING FILES - -After changing any source files: - -1. Delete any associated ".mcss" or ".mjs" files inside the "f" and "g" - directories. (the next request will trigger PHP to rebuild them.) - -2. Add or update a revision number within the URIs in your HTML files. This is - recommended because we send a far-future Expires header and you want users - to see your changes. - E.g. /mincache/f/one,two.mjs => /mincache/f/one,two_2.mjs - /mincache/g/grpName_123.mcss => /mincache/g/grpName_124.mcss - - -HOW THIS WORKS - -In your HTML files you'll refer to minify URIs like: - /mincache/f/one,two_12345.mjs - /mincache/g/groupName_12345.mcss - -.htaccess will internally strip the revision numbers (_\d+) from the URIs. - -If the files exist, they'll be served directly by Apache and with deflate -encoding where supported. - -If not, .htaccess will call /mincache/gen.php to generate the files. - - -URIS IN THE "/f" DIRECTORY - -For these URIs, Minify will combine files from a single specified source -directory, "/mincache/src" by default. E.g.: - /mincache/f/one,two.mcss = /mincache/src/one.css - + /mincache/src/two.css - /mincache/f/jQuery.1.3,site.mjs = /mincache/src/jQuery.1.3.js - + /mincache/src/site.js - - -URIS IN THE "/g" DIRECTORY - -(To be implemented) - - -QUESTIONS? - -http://groups.google.com/group/minify \ No newline at end of file diff --git a/mincache/config.php b/mincache/config.php deleted file mode 100644 index 84307b7..0000000 --- a/mincache/config.php +++ /dev/null @@ -1,15 +0,0 @@ - $m[1] - ,'group' => $m[2] - ,'ext' => $m[3] - ,'plainFilename' => "{$m[2]}.{$m[3]}" - ,'deflatedFilename' => "{$m[2]}.{$m[3]}.zd" - ,'typeMap' => MINCACHE_DIR . '/' . $m[0] - ,'plainFile' => MINCACHE_DIR . "/{$m[1]}/{$m[2]}.{$m[3]}" - ,'deflatedFile' => MINCACHE_DIR . "/{$m[1]}/{$m[2]}.{$m[3]}.zd" - ,'ctype' => ($m[3] === 'js' ? 'application/x-javascript' : 'text/css') -); - -// load configs -require MINIFY_MIN_DIR . '/config.php'; -require MINCACHE_DIR . '/config.php'; - -// setup include path -set_include_path($min_libPath . PATH_SEPARATOR . get_include_path()); -function min_autoload($name) { - require str_replace('_', DIRECTORY_SEPARATOR, $name) . '.php'; -} -spl_autoload_register('min_autoload'); - -if ($min_documentRoot) { - $_SERVER['DOCUMENT_ROOT'] = $min_documentRoot; -} elseif (0 === stripos(PHP_OS, 'win')) { - Minify::setDocRoot(); // IIS may need help -} - -$min_serveOptions['minifierOptions']['text/css']['symlinks'] = $min_symlinks; - -$sources = array(); - -// URIs in "/f" -if ($spec['mode'] === 'f') { - $files = explode(',', $spec['group']); - foreach ($files as $file) { - $file = realpath($mincache_servePath . '/' . $file . '.' . $spec['ext']); - if ($file !== false - && is_file($file) - && dirname($file) === realpath($mincache_servePath)) { - // file OK - $sources[] = $file; - } else { - send404(); - } - } - $output = Minify::serve('Files', array( - 'files' => $sources - ,'quiet' => true - ,'encodeMethod' => '' - ,'lastModifiedTime' => 0 - )); - if (! $output['success']) { - send404(); - } -} - -$typeMap = "URI: {$spec['deflatedFilename']}\n" - . "Content-Type: {$spec['ctype']}; qs=0.9\n" - . "Content-Encoding: deflate\n" - . "\n" - . "URI: {$spec['plainFilename']}\n" - . "Content-Type: {$spec['ctype']}; qs=0.6\n"; - -error_reporting(0); -if (false === file_put_contents($spec['plainFile'], $output['content']) - || false === file_put_contents($spec['deflatedFile'], gzdeflate($output['content'])) - || false === file_put_contents($spec['typeMap'], $typeMap)) { - echo "/* File writing failed. Your mincache directories /f and /g must be writable by PHP. */\n"; - exit(); -} - -unset($output['headers']['Last-Modified'], - $output['headers']['ETag']); -foreach ($output['headers'] as $name => $value) { - header("{$name}: {$value}"); -} - -echo $output['content']; diff --git a/mincache/src/test.css b/mincache/src/test.css deleted file mode 100644 index 7026c51..0000000 --- a/mincache/src/test.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - Success! Minify wrote this file to disk. - If you wish, you may delete "/mincache/f/test.*" and "/mincache/src/test.css". - - */ -This file is { content: 'valid css.' ; } diff --git a/release_2.1.3/HISTORY.txt b/release_2.1.3/HISTORY.txt deleted file mode 100644 index 95a46c8..0000000 --- a/release_2.1.3/HISTORY.txt +++ /dev/null @@ -1,75 +0,0 @@ -Minify Release History - -Version 2.1.3 - * HTTP fixes - * ETag generation now valid (different when gzipped) - * Vary header always sent when Accept-Encoding is sniffed - * Cache-Control no longer has "must-revalidate" due to webkit bug - See: http://mrclay.org/index.php/2009/02/24/safari-4-beta-cache-controlmust-revalidate-bug/ - * Dropped deflate encoding. Browser and proxy support could be buggy. - See: http://stackoverflow.com/questions/883841/ - * File cache now works w/o setting $min_cachePath - * Allow setting contentType in Minify_Source objects - * No more 5.3 deprecation warnings: split() removed - -Version 2.1.2 - * Javascript fixes - * Debug mode no longer confused by "*/*" in strings/RegExps (jQuery) - * quote characters inside RegExp literals no longer cause exception - * files ending in single-line comments no longer cause code loss - * CSS: data: URLs no longer mangled - * Optional error logging to Firefox's FirePHP extension - * Unit tests to check for common DOCUMENT_ROOT problems - * DOCUMENT_ROOT no longer overwritten on IIS servers - * Builder app doesn't fail on systems without gzdeflate() - * APC caching class included - -Version 2.1.1 - * Bug fix release - * Detection and workarounds for zlib.output_compression and non-PHP encoding modules - * Zlib not required (mod_rewrite, et.al., can still be used for encoding) - * HTML : More IE conditional comments preserved - * Minify_groupUri() utility fixed - -Version 2.1.0 - * "min" default application for quick deployment - * Minify URI Builder app & bookmarklet for quickly creating minify URIs - * Relative URIs in CSS file are fixed automatically by default - * "debug" mode for revealing original line #s in combined files - * Better IIS support - * Improved minifier classes: - * JS: preserves IE conditional comments - * CSS: smaller output, preserves more hacks and valid CSS syntax, - shorter line lengths, other bug fixes - * HTML: smaller output, shorter line lengths, other bug fixes - * Default Cache-Control: max-age of 30 minutes - * Conditional GETs supported even when max-age sent - * Experimental memcache cache class (default is files) - * Minify_Cache_File has flock()s (by default) - * Workaround for Windows mtime reporting bug - -Version 2.0.2 beta (2008-06-24) - * Fast new cache system. Cached files served almost 3x as fast. - * Dropped support of compress encoding (though HTTP_Encoder still supports it) - -Version 2.0.1 (2008-05-31) - * E_STRICT compliance (Cache_Lite_File). - -Version 2.0.0 (2008-05-22) - * Complete code overhaul. Minify is now a PEAR-style class and toolkit - for building customized minifying file servers. - * Content-Encoding: deflate/gzip/compress, based on request headers - * Expanded CSS and HTML minifiers with test cases - * Easily plug-in 3rd-party minifiers (like Packer) - * Plug-able front end controller allows changing the way files are chosen - * Compression & encoding modules lazy-loaded as needed (304 responses use - use minimal code) - * Separate utility classes for HTTP encoding and cache control - -Version 1.0.1 (2007-05-05) - * Fixed various problems resolving pathnames when hosted on an NFS mount. - * Fixed 'undefined constant' notice. - * Replaced old JSMin library with a much faster custom implementation. - -Version 1.0.0 (2007-05-02) - * First release. \ No newline at end of file diff --git a/release_2.1.3/LICENSE.txt b/release_2.1.3/LICENSE.txt deleted file mode 100644 index 8f008ad..0000000 --- a/release_2.1.3/LICENSE.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2008 Ryan Grove -Copyright (c) 2008 Steve Clay -All rights reserved. - -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. - * Neither the name of this project nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT OWNER OR 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. diff --git a/release_2.1.3/README.txt b/release_2.1.3/README.txt deleted file mode 100644 index 3899b99..0000000 --- a/release_2.1.3/README.txt +++ /dev/null @@ -1,53 +0,0 @@ -WELCOME TO MINIFY 2.1! - -Minify is an HTTP content server. It compresses sources of content -(usually files), combines the result and serves it with appropriate -HTTP headers. These headers can allow clients to perform conditional -GETs (serving content only when clients do not have a valid cache) -and tell clients to cache the file for a period of time. -More info: http://code.google.com/p/minify/ - - -UPGRADING - -See UPGRADING.txt for instructions. - - -INSTALLATION AND USAGE: - -1. Place the /min/ directory as a child of your DOCUMENT_ROOT -directory: i.e. you will have: /home/user/www/public_html/min - -2. Open http://yourdomain/min/ in a web browser. This will forward -you to the Minify URI Builder application, which will help you -quickly start using Minify to serve content on your site. - - -UNIT TESTING: - -1. Place the /min_unit_tests/ directory as a child of your DOCUMENT_ROOT -directory: i.e. you will have: /home/user/www/public_html/min_unit_tests - -2. To run unit tests, access: http://yourdomain/min_unit_tests/test_all.php - -(If you wish, the other test_*.php files can be run to test individual -components with more verbose output.) - -3. Remove /min_unit_tests/ from your DOCUMENT_ROOT when you are done. - - -EXTRAS: - -The min_extras folder contains files for benchmarking using Apache ab on Windows -and a couple single-use tools. DO NOT place this on your production server. - - -FILE ENCODINGS - -Minify *should* work fine with files encoded in UTF-8 or other 8-bit -encodings like ISO 8859/Windows-1252. By default Minify appends -";charset=utf-8" to the Content-Type headers it sends. - -Leading UTF-8 BOMs are stripped from all sources to prevent -duplication in output files, and files are converted to Unix newlines. - diff --git a/release_2.1.3/UPGRADING.txt b/release_2.1.3/UPGRADING.txt deleted file mode 100644 index 5025faf..0000000 --- a/release_2.1.3/UPGRADING.txt +++ /dev/null @@ -1,35 +0,0 @@ -Minify Upgrade Guide - -UPGRADING FROM 2.1.* - -1. Rename the following files: - - /min/config.php --> /min/old_config.php - /min/groupsConfig.php --> /min/old_groupsConfig.php - -2. Overwrite all files in /min (and /min_unit_tests) with those from this zip. - -3. Delete /min/groupsConfig.php - -4. Rename /min/old_groupsConfig.php --> /min/groupsConfig.php - -5. Merge your settings in old_config.php into config.php. - - * If you've set $_SERVER['DOCUMENT_ROOT'], instead set the new option - $min_documentRoot. This is advantageous on IIS systems because Minify - will no longer overwrite the path you specified. - - * $min_errorLogger adds the ability to enable FirePHP logging. - -6. (optional) Delete /min/old_config.php and the Minify files from your cache - directory (specified in $min_cachePath). - - -INSTALLING FRESH - -See README.txt for instructions on installing this app for the first time. - - -SUPPORT - -Send a message to http://groups.google.com/group/minify \ No newline at end of file diff --git a/release_2.1.3/min/.htaccess b/release_2.1.3/min/.htaccess deleted file mode 100644 index 42f13eb..0000000 --- a/release_2.1.3/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/release_2.1.3/min/README.txt b/release_2.1.3/min/README.txt deleted file mode 100644 index a7cf774..0000000 --- a/release_2.1.3/min/README.txt +++ /dev/null @@ -1,132 +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: FASTER PERFORMANCE AND BETTER URLS - -For the best performance, edit groupsConfig.php to pre-specify groups of files -to be combined under preset keys. 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 - ) -); - - -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 a group, 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=1 - -Known issue: files with comment-like strings/regexps can cause problems in this mode. - - -QUESTIONS? - -http://groups.google.com/group/minify \ No newline at end of file diff --git a/release_2.1.3/min/builder/_index.js b/release_2.1.3/min/builder/_index.js deleted file mode 100644 index 8e5313a..0000000 --- a/release_2.1.3/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 + '/' - + ' ' - + '
  • '; - } - /** - * 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('') - .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(/&/, '&'); - $('#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/release_2.1.3/min/builder/bm.js b/release_2.1.3/min/builder/bm.js deleted file mode 100644 index 10d1943..0000000 --- a/release_2.1.3/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/release_2.1.3/min/builder/index.php b/release_2.1.3/min/builder/index.php deleted file mode 100644 index 1b20982..0000000 --- a/release_2.1.3/min/builder/index.php +++ /dev/null @@ -1,182 +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

    - - - -
    - -

    Create a list of Javascript or CSS files (or 1 is fine) you'd like to combine -and click [Update].

    - -
    -
    - -
    - -

    - -
    - -

    Minify URI

    -

    Place this URI in your HTML to serve the files above combined, minified, compressed and -with cache headers.

    - - - -
    URI/min (opens in new window)
    HTML
    - -

    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()); - -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/release_2.1.3/min/builder/ocCheck.php b/release_2.1.3/min/builder/ocCheck.php deleted file mode 100644 index c47baa3..0000000 --- a/release_2.1.3/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/release_2.1.3/min/builder/rewriteTest.js b/release_2.1.3/min/builder/rewriteTest.js deleted file mode 100644 index 56a6051..0000000 --- a/release_2.1.3/min/builder/rewriteTest.js +++ /dev/null @@ -1 +0,0 @@ -1 \ No newline at end of file diff --git a/release_2.1.3/min/config.php b/release_2.1.3/min/config.php deleted file mode 100644 index 76199a0..0000000 --- a/release_2.1.3/min/config.php +++ /dev/null @@ -1,156 +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'); diff --git a/release_2.1.3/min/groupsConfig.php b/release_2.1.3/min/groupsConfig.php deleted file mode 100644 index 9e2514d..0000000 --- a/release_2.1.3/min/groupsConfig.php +++ /dev/null @@ -1,34 +0,0 @@ - array('//js/file1.js', '//js/file2.js'), - // 'css' => array('//css/file1.css', '//css/file2.css'), - - // custom source example - /*'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' => create_function('$a', 'return $a;') - )) - ),//*/ - - /*'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') - )) - ),//*/ -); \ No newline at end of file diff --git a/release_2.1.3/min/index.php b/release_2.1.3/min/index.php deleted file mode 100644 index 51c3525..0000000 --- a/release_2.1.3/min/index.php +++ /dev/null @@ -1,66 +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/release_2.1.3/min/lib/HTTP/ConditionalGet.php b/release_2.1.3/min/lib/HTTP/ConditionalGet.php deleted file mode 100644 index 823db05..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/HTTP/Encoder.php b/release_2.1.3/min/lib/HTTP/Encoder.php deleted file mode 100644 index 66c2678..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/JSMin.php b/release_2.1.3/min/lib/JSMin.php deleted file mode 100644 index 770e1c6..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/JSMinPlus.php b/release_2.1.3/min/lib/JSMinPlus.php deleted file mode 100644 index 31a1a5c..0000000 --- a/release_2.1.3/min/lib/JSMinPlus.php +++ /dev/null @@ -1,1872 +0,0 @@ - - * - * Usage: $minified = JSMinPlus::minify($script [, $filename]) - * - * Versionlog (see also changelog.txt): - * 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_MULTILINE', 7); - -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; - for ($c = 0, $i = 0, $j = count($childs); $i < $j; $i++) - { - $t = $this->parseTree($childs[$i]); - if (strlen($t)) - { - if ($c) - { - if ($childs[$i]->type == KEYWORD_FUNCTION && $childs[$i]->functionForm == DECLARED_FORM) - $s .= "\n"; // put declared functions on a new line - else - $s .= ';'; - } - - $s .= $t; - - $c++; - } - } - - 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; - - // quite a rancid hack to see if we should enclose the thenpart in brackets - if ($thenPart[0] != '{') - { - if (strpos($thenPart, 'if(') !== false) - $thenPart = '{' . $thenPart . '}'; - elseif ($elsePart) - $thenPart .= ';'; - } - - $s .= $thenPart; - - if ($elsePart) - { - $s .= 'else'; - - if ($elsePart[0] != '{') - $s .= ' '; - - $s .= $elsePart; - } - 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); - if ($statement) - $s .= $statement . ';'; - } - $s = rtrim($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) : '') . ')' - . $this->parseTree($n->body); - break; - - case KEYWORD_WHILE: - $s = 'while(' . $this->parseTree($n->condition) . ')' . $this->parseTree($n->body); - break; - - case JS_FOR_IN: - $s = 'for(' . ($n->varDecl ? $this->parseTree($n->varDecl) : $this->parseTree($n->iterator)) . ' in ' . $this->parseTree($n->object) . ')' . $this->parseTree($n->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' . ($n->value ? ' ' . $this->parseTree($n->value) : ''); - 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_MULTILINE: - $s = $n->value . ' '; - $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: - $s = $this->parseTree($n->treeNodes[0]) . $n->type; - $nextTokenType = $n->treeNodes[1]->type; - if ( $nextTokenType == OP_PLUS || $nextTokenType == OP_MINUS || - $nextTokenType == OP_INCREMENT || $nextTokenType == OP_DECREMENT || - $nextTokenType == OP_UNARY_PLUS || $nextTokenType == OP_UNARY_MINUS - ) - $s .= ' '; - $s .= $this->parseTree($n->treeNodes[1]); - 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_MULTILINE => 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/release_2.1.3/min/lib/Minify/CSS.php b/release_2.1.3/min/lib/Minify/CSS.php deleted file mode 100644 index 2220cf2..0000000 --- a/release_2.1.3/min/lib/Minify/CSS.php +++ /dev/null @@ -1,83 +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()) - { - require_once 'Minify/CSS/Compressor.php'; - if (isset($options['preserveComments']) - && !$options['preserveComments']) { - $css = Minify_CSS_Compressor::process($css, $options); - } else { - require_once 'Minify/CommentPreserver.php'; - $css = Minify_CommentPreserver::process( - $css - ,array('Minify_CSS_Compressor', 'process') - ,array($options) - ); - } - if (! isset($options['currentDir']) && ! isset($options['prependRelativePath'])) { - return $css; - } - require_once 'Minify/CSS/UriRewriter.php'; - 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/release_2.1.3/min/lib/Minify/CSS/Compressor.php b/release_2.1.3/min/lib/Minify/CSS/Compressor.php deleted file mode 100644 index a348286..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/CSS/UriRewriter.php b/release_2.1.3/min/lib/Minify/CSS/UriRewriter.php deleted file mode 100644 index 824c6bb..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/Cache/APC.php b/release_2.1.3/min/lib/Minify/Cache/APC.php deleted file mode 100644 index ca84d29..0000000 --- a/release_2.1.3/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 { - - /** - * 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/release_2.1.3/min/lib/Minify/Cache/File.php b/release_2.1.3/min/lib/Minify/Cache/File.php deleted file mode 100644 index 8744a7e..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/Cache/Memcache.php b/release_2.1.3/min/lib/Minify/Cache/Memcache.php deleted file mode 100644 index 2b81e7a..0000000 --- a/release_2.1.3/min/lib/Minify/Cache/Memcache.php +++ /dev/null @@ -1,137 +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 { - - /** - * 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/release_2.1.3/min/lib/Minify/CommentPreserver.php b/release_2.1.3/min/lib/Minify/CommentPreserver.php deleted file mode 100644 index f56eb34..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/Controller/Base.php b/release_2.1.3/min/lib/Minify/Controller/Base.php deleted file mode 100644 index 84889b3..0000000 --- a/release_2.1.3/min/lib/Minify/Controller/Base.php +++ /dev/null @@ -1,202 +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) - { - 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) { - require_once 'Minify/Logger.php'; - Minify_Logger::log($msg); - } -} diff --git a/release_2.1.3/min/lib/Minify/Controller/Files.php b/release_2.1.3/min/lib/Minify/Controller/Files.php deleted file mode 100644 index 83f028a..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/Controller/Groups.php b/release_2.1.3/min/lib/Minify/Controller/Groups.php deleted file mode 100644 index 1ac5770..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/Controller/MinApp.php b/release_2.1.3/min/lib/Minify/Controller/MinApp.php deleted file mode 100644 index 9582d29..0000000 --- a/release_2.1.3/min/lib/Minify/Controller/MinApp.php +++ /dev/null @@ -1,132 +0,0 @@ - - */ -class Minify_Controller_MinApp 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) { - // 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 - if (! isset($cOptions['groups'][$_GET['g']])) { - $this->log("A group configuration for \"{$_GET['g']}\" was not set"); - return $options; - } - - $files = $cOptions['groups'][$_GET['g']]; - // 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); - } - $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; - } - } - } elseif (! $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/release_2.1.3/min/lib/Minify/Controller/Page.php b/release_2.1.3/min/lib/Minify/Controller/Page.php deleted file mode 100644 index fa4599a..0000000 --- a/release_2.1.3/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) - * - * @todo Add 'file' option to read HTML file. - */ - public function setupSources($options) { - if (isset($options['file'])) { - $sourceSpec = array( - 'filepath' => $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. - require_once 'Minify/CSS.php'; - require_once 'JSMin.php'; - } - parent::loadMinifier($minifierCallback); // load Minify/HTML.php - } -} - diff --git a/release_2.1.3/min/lib/Minify/Controller/Version1.php b/release_2.1.3/min/lib/Minify/Controller/Version1.php deleted file mode 100644 index 1861aab..0000000 --- a/release_2.1.3/min/lib/Minify/Controller/Version1.php +++ /dev/null @@ -1,118 +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/release_2.1.3/min/lib/Minify/HTML.php b/release_2.1.3/min/lib/Minify/HTML.php deleted file mode 100644 index fb5c1e9..0000000 --- a/release_2.1.3/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, '_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']); - $this->_placeholders = array(); - - // replace SCRIPTs (and minify) with placeholders - $this->_html = preg_replace_callback( - '/(\\s*)(]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i' - ,array($this, '_removeScriptCB') - ,$this->_html); - - // replace STYLEs (and minify) with placeholders - $this->_html = preg_replace_callback( - '/\\s*(]*?>)([\\s\\S]*?)<\\/style>\\s*/i' - ,array($this, '_removeStyleCB') - ,$this->_html); - - // remove HTML comments (not containing IE conditional comments). - $this->_html = preg_replace_callback( - '//' - ,array($this, '_commentCB') - ,$this->_html); - - // replace PREs with placeholders - $this->_html = preg_replace_callback('/\\s*(]*?>[\\s\\S]*?<\\/pre>)\\s*/i' - ,array($this, '_removePreCB') - ,$this->_html); - - // replace TEXTAREAs with placeholders - $this->_html = preg_replace_callback( - '/\\s*(]*?>[\\s\\S]*?<\\/textarea>)\\s*/i' - ,array($this, '_removeTextareaCB') - ,$this->_html); - - // trim each line. - // @todo take into account attribute values that span multiple lines. - $this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html); - - // remove ws around block/undisplayed elements - $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body' - .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' - .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta' - .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)' - .'|ul)\\b[^>]*>)/i', '$1', $this->_html); - - // remove ws outside of all elements - $this->_html = preg_replace_callback( - '/>([^<]+)_html); - - // use newlines before 1st attribute in open tags (to limit line lengths) - $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_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/release_2.1.3/min/lib/Minify/ImportProcessor.php b/release_2.1.3/min/lib/Minify/ImportProcessor.php deleted file mode 100644 index 0d6d90a..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/Lines.php b/release_2.1.3/min/lib/Minify/Lines.php deleted file mode 100644 index 6f94fb6..0000000 --- a/release_2.1.3/min/lib/Minify/Lines.php +++ /dev/null @@ -1,131 +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'])) { - require_once 'Minify/CSS/UriRewriter.php'; - 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/release_2.1.3/min/lib/Minify/Logger.php b/release_2.1.3/min/lib/Minify/Logger.php deleted file mode 100644 index 7844eea..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/Packer.php b/release_2.1.3/min/lib/Minify/Packer.php deleted file mode 100644 index 949c3ee..0000000 --- a/release_2.1.3/min/lib/Minify/Packer.php +++ /dev/null @@ -1,37 +0,0 @@ -pack()); - } -} diff --git a/release_2.1.3/min/lib/Minify/Source.php b/release_2.1.3/min/lib/Minify/Source.php deleted file mode 100644 index 5a85d10..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Minify/YUICompressor.php b/release_2.1.3/min/lib/Minify/YUICompressor.php deleted file mode 100644 index 7cb61ad..0000000 --- a/release_2.1.3/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/release_2.1.3/min/lib/Solar/Dir.php b/release_2.1.3/min/lib/Solar/Dir.php deleted file mode 100644 index 37f7169..0000000 --- a/release_2.1.3/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/release_2.1.3/min/utils.php b/release_2.1.3/min/utils.php deleted file mode 100644 index c735941..0000000 --- a/release_2.1.3/min/utils.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * - * - * - * If you do not want ampersands as HTML entities, set Minify_Build::$ampersand = "&" - * before using this function. - * - * @param string $group a key 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 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])) { - $builds[$group] = new Minify_Build($gc[$group]); - } - return $builds[$group]; -} diff --git a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/2.php b/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/2.php deleted file mode 100644 index 9b66f24..0000000 --- a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/2.php +++ /dev/null @@ -1,44 +0,0 @@ - $lastModified -)); -if ($cg->cacheIsValid) { - $cg->sendHeaders(); - // we're done - exit(); -} - -// generate content -$title = 'Last-Modified is known : add Content-Length'; -$explain = ' -

    Here, like the first example, we know the Last-Modified time, -but we also want to set the Content-Length to increase cacheability and allow -HTTP persistent connections. Instead of sending headers immediately, we first -generate our content, then use setContentLength(strlen($content)) -to add the header. Then finally call sendHeaders() and send the -content.

    -

    Note: This is not required if your PHP config buffers all -output and your script doesn\'t do any incremental flushing of the output -buffer. PHP will generally set Content-Length for you if it can.

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; - -require '_include.php'; -$content = get_content(array( - 'title' => $title - ,'explain' => $explain -)); - -$cg->setContentLength(strlen($content)); -$cg->sendHeaders(); -send_slowly($content); - diff --git a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/3.php b/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/3.php deleted file mode 100644 index 8f5482b..0000000 --- a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/3.php +++ /dev/null @@ -1,40 +0,0 @@ -When Last-Modified is unknown, you can still use ETags, but you need a short -string that is unique for that content. In the worst case, you have to generate -all the content first, then instantiate HTTP_ConditionalGet, setting -the array key contentHash to the output of a hash function of the -content. Since we have the full content, we might as well also use -setContentLength(strlen($content)) in the case where we need to -send it.

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; -require '_include.php'; -$content = get_content(array( - 'title' => $title - ,'explain' => $explain -)); - -$cg = new HTTP_ConditionalGet(array( - 'contentHash' => substr(md5($content), 7) -)); -if ($cg->cacheIsValid) { - $cg->sendHeaders(); - // we're done - exit(); -} -$cg->setContentLength(strlen($content)); -$cg->sendHeaders(); - -send_slowly($content); - diff --git a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/4.php b/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/4.php deleted file mode 100644 index 4b77d20..0000000 --- a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/4.php +++ /dev/null @@ -1,49 +0,0 @@ - $lastModified - ,'encoding' => $enc -)); -$cg->sendHeaders(); -if ($cg->cacheIsValid) { - // we're done - exit(); -} - -// output encoded content - -$title = 'ConditionalGet + Encoder'; -$explain = ' -

    Using ConditionalGet and Encoder is straightforward. First impliment the -ConditionalGet, then if the cache is not valid, encode and send the content

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; -require '_include.php'; -$content = get_content(array( - 'title' => $title - ,'explain' => $explain -)); - -$he = new HTTP_Encoder(array( - 'content' => get_content(array( - 'title' => $title - ,'explain' => $explain - )) -)); -$he->encode(); - -// usually you would just $he->sendAll(), but here we want to emulate slow -// connection -$he->sendHeaders(); -send_slowly($he->getContent()); diff --git a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/5.php b/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/5.php deleted file mode 100644 index b443c19..0000000 --- a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/5.php +++ /dev/null @@ -1,27 +0,0 @@ - 20 - ,'lastModifiedTime' => filemtime(__FILE__) -)); -$cg->sendHeaders(); - -// generate, send content -$title = 'Last-Modified + Expires'; -$explain = ' -

    Here we set a static "lastModifiedTime" and "maxAge" to 20. The browser -will consider this document fresh for 20 seconds, then revalidate its cache. After -the 304 response, the cache will be good for another 20 seconds. Unless you force -a reload, there will only be 304 responses for this page after the initial download. -'; - -require '_include.php'; -echo get_content(array( - 'title' => $title - ,'explain' => $explain -)); - diff --git a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/_include.php b/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/_include.php deleted file mode 100644 index 9b65ae1..0000000 --- a/release_2.1.3/min_unit_tests/HTTP_ConditionalGet/_include.php +++ /dev/null @@ -1,64 +0,0 @@ - - - - - -HTTP_ConditionalGet : <?php echo $data['title']; ?> - - -

    HTTP_ConditionalGet

    -

    - - -

    Notes

    -

    How to distinguish 200 and 304 responses

    -

    For these pages all 200 responses are sent in chunks a second apart, so you -should notice that 304 responses are quicker. You can also use HTTP sniffers -like Fiddler (win) and -LiveHTTPHeaders (Firefox add-on) -to verify headers and content being sent.

    -

    Browser notes

    -
    -
    Opera
    -
    Opera has a couple behaviors against the HTTP spec: Manual refreshes (F5) - prevents the ETag/If-Modified-Since headers from being sent; it only sends - them when following a link or bookmark. Also, Opera will not honor the - must-revalidate Cache-Control value unless max-age - is set. To get Opera to follow the spec, ConditionalGet will send Opera max-age=0 - (if one is not already set).
    -
    Safari
    -
    ETag validation is unsupported, but Safari supports HTTP/1.0 validation via - If-Modified-Since headers as long as the cache is explicitly marked - "public" or "private" ("private" is default in ConditionalGet).
    -
    - - - $lastModified -)); -$cg->sendHeaders(); -if ($cg->cacheIsValid) { - // we're done - exit(); -} - -$title = 'Last-Modified is known : simple usage'; -$explain = ' -

    If your content has not changed since a certain timestamp, set this via the -the lastModifiedTime array key when instantiating HTTP_ConditionalGet. -You can immediately call the method sendHeaders() to set the -Last-Modified, ETag, and Cache-Control headers. The, if cacheIsValid -property is false, you echo the content.

    -

    This script emulates a document that changes every ' .$every. ' seconds. -
    This is version: ' . date('r', $lastModified) . '

    -'; - -require '_include.php'; - -echo send_slowly(get_content(array( - 'title' => $title - ,'explain' => $explain -))); - diff --git a/release_2.1.3/min_unit_tests/HTTP_Encoder/green.png b/release_2.1.3/min_unit_tests/HTTP_Encoder/green.png deleted file mode 100644 index d9d3a308aec0e9c7be676a8bc5438e5c61427ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_{3?x-PN__%S%*9TgAsieWw;%dH0CL#^d_r6q z{xkglf9682r8`iBv%n*=n1O-o0|+xZtudJa6cj6QjVN(0N=+=u%+FH@$;?efo0^iDsNj}alv - - - -HTTP_Encoder Test - - - -

    HTTP_Encoder test

    -

    HTML

    -

    CSS

    -

    Javascript

    -

    image

    - - - - $content - ,'type' => $type -)); -$he->encode(); -$he->sendAll(); - -?> \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_inc.php b/release_2.1.3/min_unit_tests/_inc.php deleted file mode 100644 index bf416d4..0000000 --- a/release_2.1.3/min_unit_tests/_inc.php +++ /dev/null @@ -1,50 +0,0 @@ -0, 'fail'=>0, 'total'=>0); - - $mode = $test ? 'pass' : 'fail'; - $outMode = $test ? 'PASS' : '!FAIL'; - printf("%s: %s (%d of %d tests run so far have %sed)\n", - $outMode, $message, ++$count[$mode], ++$count['total'], $mode); - - return (bool)$test; -} - -ob_start(); \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/comments.css b/release_2.1.3/min_unit_tests/_test_files/css/comments.css deleted file mode 100644 index 2ef9fac..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/comments.css +++ /dev/null @@ -1,9 +0,0 @@ - -/* block comments get removed */ - -/*! YUI Compressor style comments are preserved */ - -/* but all other comments are removed */ - -/* comments that have any surrounding whitespace are replaced by a single space. */ -body{ background:#fff/*eef*/ url(/path/to/image.gif) repeat-y; } diff --git a/release_2.1.3/min_unit_tests/_test_files/css/comments.min.css b/release_2.1.3/min_unit_tests/_test_files/css/comments.min.css deleted file mode 100644 index 3ea5c61..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/comments.min.css +++ /dev/null @@ -1,3 +0,0 @@ - -/* YUI Compressor style comments are preserved */ -body{background:#fff url(/path/to/image.gif) repeat-y} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/hacks.css b/release_2.1.3/min_unit_tests/_test_files/css/hacks.css deleted file mode 100644 index fccd321..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/hacks.css +++ /dev/null @@ -1,66 +0,0 @@ -/* hide from ie5/mac \*/ a{} -.foo {color:red} -/* necessary comment */ - -/* comment to attempt to confuse parser */ - -/* feed to ie5/mac \*//*/ -@import "ie5mac.css"; -/* necessary comment */ - -/* comment to attempt to confuse parser */ - -/*/ hide from nav4 */ -.foo {display:block;} -/* necessary comment */ - -/* comment to attempt to confuse parser */ - -/*/ feed to nav *//*/ -.foo {display:crazy;} -/* necessary comment */ - -/* hide props from various IE/win */ -div { - width: 140px; - width/* */:/**/100px; - width: /**/100px; -} - -html>/**/body {} - -/* Tantek's box model hack */ -div { - width:400px; - voice-family: "\"}\""; - voice-family:inherit; - width:300px; -} - -/* don't minimize hex colors in filters */ -div { - filter:chroma(color=#aabbcc); - filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000); -} - -@media screen { - /* for IE 5.x-6, hidden from IE 5 Mac */ /*\*/ - * html div#page { - height: 1%; - } - /**/ /* end hidden from IE 5 Mac */ -} - -foo { /* filters for IE */ - _height : 20px; - *height : 15px; -} - -/* http://tantek.com/CSS/Examples/midpass.html */ -@media tty { - i{content:"\";/*" "*/}} @import 'midpassafter.css'; /*";} -}/* */ - -/* leave at least 1 space between these pseudo elements and "{" for IE6: http://www.crankygeek.com/ie6pebug/ */ -p:first-letter {color:red;} -p:first-line {color:red;} diff --git a/release_2.1.3/min_unit_tests/_test_files/css/hacks.min.css b/release_2.1.3/min_unit_tests/_test_files/css/hacks.min.css deleted file mode 100644 index 68be2ee..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/hacks.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*\*/a{}.foo{color:red}/**/ /*\*//*/@import "ie5mac.css";/**/ /*/*/.foo{display:block}/**/ /*/*//*/.foo{display:crazy}/**/ div{width:140px;width/**/:/**/100px;width:/**/100px}html>/**/body{}div{width:400px;voice-family:"\"}\"";voice-family:inherit;width:300px}div{filter:chroma(color=#aabbcc);filter:mask(color=#000000) shadow(color=#9BAD71, direction=135) chroma(color=#000000)}@media -screen{/*\*/* html -div#page{height:1%}/**/}foo{_height:20px;*height:15px}@media -tty{i{content:"\";/*" "*/}}@import 'midpassafter.css';/*"}}/* */ p:first-letter {color:red}p:first-line {color:red} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/issue62.css b/release_2.1.3/min_unit_tests/_test_files/css/issue62.css deleted file mode 100644 index 006c7a2..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/issue62.css +++ /dev/null @@ -1,890 +0,0 @@ -/* -* DEFINITION DES STYLES DE TEXTE -*/ - /*-----------------------------------------------------------------------------------*/ -h1 { - color: #339933; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - font-weight: bold; - text-decoration: none; -} - -h2 { - color: #339933; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; -} - -h1,h2,h3,h4,h5 { - margin: 0px; - padding: 0px; -} - -.txt_10_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_noir:link,.txt_10_noir:visited,.txt_10_noir:active { - color: black; -} - -.txt_10_noir:hover { - color: red; -} - -.txt_11_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_noir:link,.txt_11_noir:visited,.txt_11_noir:active { - color: black; -} - -.txt_11_noir:hover { - color: red; -} - -.txt_12_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_noir:link,.txt_12_noir:visited,.txt_12_noir:active { - color: black; -} - -.txt_12_noir:hover { - color: red; -} - -.txt_14_noir { - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_noir:link,.txt_14_noir:visited,.txt_14_noir:active { - color: black; -} - -.txt_14_noir:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_gris:link,.txt_10_gris:visited,.txt_10_gris:active { - color: grey; -} - -.txt_10_gris:hover { - color: red; -} - -.txt_11_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_gris:link,.txt_11_gris:visited,.txt_11_gris:active { - color: grey; -} - -.txt_11_gris:hover { - color: red; -} - -.txt_12_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_gris:link,.txt_12_gris:visited,.txt_12_gris:active { - color: grey; -} - -.txt_12_gris:hover { - color: red; -} - -.txt_14_gris { - color: grey; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_gris:link,.txt_14_gris:visited,.txt_14_gris:active { - color: grey; -} - -.txt_14_gris:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_blanc:link,.txt_10_blanc:visited,.txt_10_blanc:active { - color: #FFFFFF; -} - -.txt_10_blanc:hover { - color: #FF8800; /*ORANGE*/ -} - -.txt_11_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_blanc:link,.txt_11_blanc:visited,.txt_11_blanc:active { - color: #FFFFFF; -} - -.txt_11_blanc:hover { - color: #FF8800; -} - -.txt_12_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_blanc:link,.txt_12_blanc:visited,.txt_12_blanc:active { - color: #FFFFFF; -} - -.txt_12_blanc:hover { - color: #FFAA00; -} - -.txt_14_blanc { - color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_blanc:link,.txt_14_blanc:visited,.txt_14_blanc:active { - color: #FFFFFF; -} - -.txt_14_blanc:hover { - color: #FF8800; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_orange:link,.txt_10_orange:visited,.txt_10_orange:active { - color: #FF8800; -} - -.txt_10_orange:hover { - color: darkblue -} - -.txt_11_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_orange:link,.txt_11_orange:visited,.txt_11_orange:active { - color: #FF8800; -} - -.txt_11_orange:hover { - color: darkblue; -} - -.txt_12_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_orange:link,.txt_12_orange:visited,.txt_12_orange:active { - color: #FF8800; -} - -.txt_12_orange:hover { - color: darkblue; -} - -.txt_14_orange { - color: #FF8800; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_orange:link,.txt_14_orange:visited,.txt_14_orange:active { - color: #FF8800; -} - -.txt_14_orange:hover { - color: darkblue; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_rouge:link,.txt_10_rouge:visited,.txt_10_rouge:active { - color: red; -} - -.txt_10_rouge:hover { - color: darkblue; -} - -.txt_11_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_rouge:link,.txt_11_rouge:visited,.txt_11_rouge:active { - color: red; -} - -.txt_11_rouge:hover { - color: darkblue; -} - -.txt_12_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_rouge:link,.txt_12_rouge:visited,.txt_12_rouge:active { - color: red; -} - -.txt_12_rouge:hover { - color: darkblue; -} - -.txt_14_rouge { - color: red; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_rouge:link,.txt_14_rouge:visited,.txt_14_rouge:active { - color: red; -} - -.txt_14_rouge:hover { - color: darkblue; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_bleu:link,.txt_10_bleu:visited,.txt_10_bleu:active { - color: blue; -} - -.txt_10_bleu:hover { - color: red; -} - -.txt_11_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_bleu:link,.txt_11_bleu:visited,.txt_11_bleu:active { - color: blue; -} - -.txt_11_bleu:hover { - color: red; -} - -.txt_12_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_bleu:link,.txt_12_bleu:visited,.txt_12_bleu:active { - color: blue; -} - -.txt_12_bleu:hover { - color: red; -} - -.txt_14_bleu { - color: blue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_bleu:link,.txt_14_bleu:visited,.txt_14_bleu:active { - color: blue; -} - -.txt_14_bleu:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_bleu_f:link,.txt_10_bleu_f:visited,.txt_10_bleu_f:active { - color: darkblue; -} - -.txt_10_bleu_f:hover { - color: red; -} - -.txt_11_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_bleu_f:link,.txt_11_bleu_f:visited,.txt_11_bleu_f:active { - color: darkblue; -} - -.txt_11_bleu_f:hover { - color: red; -} - -.txt_12_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_bleu_f:link,.txt_12_bleu_f:visited,.txt_12_bleu_f:active { - color: darkblue; -} - -.txt_12_bleu_f:hover { - color: red; -} - -.txt_14_bleu_f { - color: darkblue; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_bleu_f:link,.txt_14_bleu_f:visited,.txt_14_bleu_f:active { - color: darkblue; -} - -.txt_14_bleu_f:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_vert_f:link,.txt_10_vert_f:visited,.txt_10_vert_f:active { - color: darkgreen; -} - -.txt_10_vert_f:hover { - color: red; -} - -.txt_11_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_vert_f:link,.txt_11_vert_f:visited,.txt_11_vert_f:active { - color: darkgreen; -} - -.txt_11_vert_f:hover { - color: red; -} - -.txt_12_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_vert_f:link,.txt_12_vertf:visited,.txt_12_vert_f:active { - color: darkgreen; -} - -.txt_12_vert_f:hover { - color: red; -} - -.txt_14_vert_f { - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_vert_f:link,.txt_14_vert_f:visited,.txt_14_vert_f:active { - color: darkgreen; -} - -.txt_14_vert_f:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.txt_10_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.txt_10_vert:link,.txt_10_vert:visited,.txt_10_vert:active { - color: green; -} - -.txt_10_vert:hover { - color: red; -} - -.txt_11_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.txt_11_vert:link,.txt_11_vert:visited,.txt_11_vert:active { - color: green; -} - -.txt_11_vert:hover { - color: red; -} - -.txt_12_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - text-decoration: none; -} - -.txt_12_vert:link,.txt_12_vert:visited,.txt_12_vert:active { - color: green; -} - -.txt_12_vert:hover { - color: red; -} - -.txt_14_vert { - color: green; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 14px; - text-decoration: none; -} - -.txt_14_vert:link,.txt_14_vert:visited,.txt_14_vert:active { - color: green; -} - -.txt_14_vert:hover { - color: red; -} - -/*-----------------------------------------------------------------------------------*/ -.fond_blanc { - background-color: #FFFFFF; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_gris_c, .fond_gris_c tr { - background-color: #FFFFFF; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.fond_gris_c2, .fond_gris_c2 tr { - background-color: #FBFBFB; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_bleu_c, .fond_bleu_c tr { - background-color: #D9EEF9; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; - background-image: url(../images/fond_1.bmp); -} - -.fond_bleu_c2 { - background-color: #ECF4FF; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_bleu_f { - background-color: #003366; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.fond_orange { - background-color: #FEEFE7; - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; - background-image: url(../images/fond_3.jpg); -} - -.fond_orange_2 { - background-color: #FFF8F4; - color: darkgreen; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; - border: 1px solid orange; - border-collapse: collapse; -} - -.vccDlgBody { - border: 3px solid #336699; - border-collapse: collapse; - color: black; - background-color: #EEFFEE; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -/* DEFINITION DES STYLES DE TABLEAUX */ -.bordure_0 { - border: 0px solid; - color: black; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.bordure_1_bleu { - border: 1px solid green; - border-collapse: collapse; - color: black; - background-color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.bordure_3_bleu { - border: 3px solid #336699; - border-collapse: collapse; - color: black; - background-color: #FFFFFF; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 11px; - text-decoration: none; -} - -.indent { - margin-left: 20px; -} - -/* DEFINITION DES STYLES D'OBJETS DE FORMULAIRE */ -.Btn { - color: #003366; - text-align: center; - font-weight: bold; - background-color: #FFFFFF; - background-image: url(../images/ongletStyle1.jpg); - background-repeat: no-repeat; - background-position: center center; -} - -.Btn:hover { - color: red; -} - -.menu1h { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - font-weight: bold; - text-decoration: none; - border-top: 1px solid #003366; - border-bottom: 1px solid #003366; - border-left: 1px solid #003366; - border-right: 1px solid white; - border-collapse: collapse; - display: block; -} - -.menu1h:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menu1h_f { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - font-weight: bold; - text-decoration: none; - border: 1px solid #003366; - display: block; -} - -.menu1h_f:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menu1v { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - font-weight: bold; - text-decoration: none; - border: 1px solid #003366; - border-collapse: collapse; - display: block; -} - -.menu1v:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menu2v { - background-color: #5588BB; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 12px; - font-weight: bold; - text-decoration: none; - border: 1px solid #4277AB; - border-collapse: collapse; - float: left; - display: block; -} - -.menu2v:hover { - background-color: white; - color: red; - border: 1px solid darkgreen; - border-collapse: collapse; -} - -.menuEDF { - background-color: #003366; - color: white; - font-family: Verdana, Arial, Lucida, Tahoma; - font-size: 10px; - text-decoration: none; -} - -.menuEDF:hover { - color: #FF8800; -} - -/*bouton bleu sur blanc*/ -.Bouton { - color: #003366; - text-align: center; - font-weight: bold; - /* Ricardo cursor: hand; */ - cursor: pointer; - background-color: #FFFFFF; -} - -input { - border: 2px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.disabled_input { - border: 1px solid gray; - color: grey; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input0 { - border: 0px; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); -} - -.input2 { - border: 1px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input3 { - border: 1px solid black; - color: #003366; - background-color: #EEEEEE; - background-image: url(); -} - -.input4 { - border: 1px solid blue; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input5 { - border: 1px solid darkblue; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_4.bmp); - background-repeat: repeat-x; -} - -.input_btn { - border: 0px; - /* cursor: hand; */ - cursor: pointer; -} - -textarea { - border: 2px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(../images/fond_5.bmp); -} - -.TEXTAREA3 { - border: 1px solid green; - color: #003366; - background-color: #FFFFFF; - background-image: url(); -} - -.TEXTAREA4 { - border: 1px solid green; - color: #003366; - background-color: #EEEEEE; - background-image: url(); -} - -.hand { - cursor: hand; - cursor: pointer; -} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/issue62.min.css b/release_2.1.3/min_unit_tests/_test_files/css/issue62.min.css deleted file mode 100644 index 5eb1982..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/issue62.min.css +++ /dev/null @@ -1,25 +0,0 @@ -h1{color:#393;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;font-weight:bold;text-decoration:none}h2{color:#393;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none}h1,h2,h3,h4,h5{margin:0px;padding:0px}.txt_10_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_noir:link,.txt_10_noir:visited,.txt_10_noir:active{color:black}.txt_10_noir:hover{color:red}.txt_11_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_noir:link,.txt_11_noir:visited,.txt_11_noir:active{color:black}.txt_11_noir:hover{color:red}.txt_12_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_noir:link,.txt_12_noir:visited,.txt_12_noir:active{color:black}.txt_12_noir:hover{color:red}.txt_14_noir{color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_noir:link,.txt_14_noir:visited,.txt_14_noir:active{color:black}.txt_14_noir:hover{color:red}.txt_10_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_gris:link,.txt_10_gris:visited,.txt_10_gris:active{color:grey}.txt_10_gris:hover{color:red}.txt_11_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_gris:link,.txt_11_gris:visited,.txt_11_gris:active{color:grey}.txt_11_gris:hover{color:red}.txt_12_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_gris:link,.txt_12_gris:visited,.txt_12_gris:active{color:grey}.txt_12_gris:hover{color:red}.txt_14_gris{color:grey;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_gris:link,.txt_14_gris:visited,.txt_14_gris:active{color:grey}.txt_14_gris:hover{color:red}.txt_10_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_blanc:link,.txt_10_blanc:visited,.txt_10_blanc:active{color:#FFF}.txt_10_blanc:hover{color:#F80}.txt_11_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_blanc:link,.txt_11_blanc:visited,.txt_11_blanc:active{color:#FFF}.txt_11_blanc:hover{color:#F80}.txt_12_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_blanc:link,.txt_12_blanc:visited,.txt_12_blanc:active{color:#FFF}.txt_12_blanc:hover{color:#FA0}.txt_14_blanc{color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_blanc:link,.txt_14_blanc:visited,.txt_14_blanc:active{color:#FFF}.txt_14_blanc:hover{color:#F80}.txt_10_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_orange:link,.txt_10_orange:visited,.txt_10_orange:active{color:#F80}.txt_10_orange:hover{color:darkblue}.txt_11_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_orange:link,.txt_11_orange:visited,.txt_11_orange:active{color:#F80}.txt_11_orange:hover{color:darkblue}.txt_12_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_orange:link,.txt_12_orange:visited,.txt_12_orange:active{color:#F80}.txt_12_orange:hover{color:darkblue}.txt_14_orange{color:#F80;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_orange:link,.txt_14_orange:visited,.txt_14_orange:active{color:#F80}.txt_14_orange:hover{color:darkblue}.txt_10_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_rouge:link,.txt_10_rouge:visited,.txt_10_rouge:active{color:red}.txt_10_rouge:hover{color:darkblue}.txt_11_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_rouge:link,.txt_11_rouge:visited,.txt_11_rouge:active{color:red}.txt_11_rouge:hover{color:darkblue}.txt_12_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_rouge:link,.txt_12_rouge:visited,.txt_12_rouge:active{color:red}.txt_12_rouge:hover{color:darkblue}.txt_14_rouge{color:red;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_rouge:link,.txt_14_rouge:visited,.txt_14_rouge:active{color:red}.txt_14_rouge:hover{color:darkblue}.txt_10_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_bleu:link,.txt_10_bleu:visited,.txt_10_bleu:active{color:blue}.txt_10_bleu:hover{color:red}.txt_11_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_bleu:link,.txt_11_bleu:visited,.txt_11_bleu:active{color:blue}.txt_11_bleu:hover{color:red}.txt_12_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_bleu:link,.txt_12_bleu:visited,.txt_12_bleu:active{color:blue}.txt_12_bleu:hover{color:red}.txt_14_bleu{color:blue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_bleu:link,.txt_14_bleu:visited,.txt_14_bleu:active{color:blue}.txt_14_bleu:hover{color:red}.txt_10_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_bleu_f:link,.txt_10_bleu_f:visited,.txt_10_bleu_f:active{color:darkblue}.txt_10_bleu_f:hover{color:red}.txt_11_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_bleu_f:link,.txt_11_bleu_f:visited,.txt_11_bleu_f:active{color:darkblue}.txt_11_bleu_f:hover{color:red}.txt_12_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_bleu_f:link,.txt_12_bleu_f:visited,.txt_12_bleu_f:active{color:darkblue}.txt_12_bleu_f:hover{color:red}.txt_14_bleu_f{color:darkblue;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_bleu_f:link,.txt_14_bleu_f:visited,.txt_14_bleu_f:active{color:darkblue}.txt_14_bleu_f:hover{color:red}.txt_10_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_vert_f:link,.txt_10_vert_f:visited,.txt_10_vert_f:active{color:darkgreen}.txt_10_vert_f:hover{color:red}.txt_11_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_vert_f:link,.txt_11_vert_f:visited,.txt_11_vert_f:active{color:darkgreen}.txt_11_vert_f:hover{color:red}.txt_12_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_vert_f:link,.txt_12_vertf:visited,.txt_12_vert_f:active{color:darkgreen}.txt_12_vert_f:hover{color:red}.txt_14_vert_f{color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_vert_f:link,.txt_14_vert_f:visited,.txt_14_vert_f:active{color:darkgreen}.txt_14_vert_f:hover{color:red}.txt_10_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.txt_10_vert:link,.txt_10_vert:visited,.txt_10_vert:active{color:green}.txt_10_vert:hover{color:red}.txt_11_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.txt_11_vert:link,.txt_11_vert:visited,.txt_11_vert:active{color:green}.txt_11_vert:hover{color:red}.txt_12_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;text-decoration:none}.txt_12_vert:link,.txt_12_vert:visited,.txt_12_vert:active{color:green}.txt_12_vert:hover{color:red}.txt_14_vert{color:green;font-family:Verdana,Arial,Lucida,Tahoma;font-size:14px;text-decoration:none}.txt_14_vert:link,.txt_14_vert:visited,.txt_14_vert:active{color:green}.txt_14_vert:hover{color:red}.fond_blanc{background-color:#FFF;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_gris_c, .fond_gris_c -tr{background-color:#FFF;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.fond_gris_c2, .fond_gris_c2 -tr{background-color:#FBFBFB;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_bleu_c, .fond_bleu_c -tr{background-color:#D9EEF9;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none;background-image:url(../images/fond_1.bmp)}.fond_bleu_c2{background-color:#ECF4FF;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_bleu_f{background-color:#036;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.fond_orange{background-color:#FEEFE7;color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none;background-image:url(../images/fond_3.jpg)}.fond_orange_2{background-color:#FFF8F4;color:darkgreen;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none;border:1px -solid orange;border-collapse:collapse}.vccDlgBody{border:3px -solid #369;border-collapse:collapse;color:black;background-color:#EFE;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.bordure_0{border:0px -solid;color:black;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.bordure_1_bleu{border:1px -solid green;border-collapse:collapse;color:black;background-color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.bordure_3_bleu{border:3px -solid #369;border-collapse:collapse;color:black;background-color:#FFF;font-family:Verdana,Arial,Lucida,Tahoma;font-size:11px;text-decoration:none}.indent{margin-left:20px}.Btn{color:#036;text-align:center;font-weight:bold;background-color:#FFF;background-image:url(../images/ongletStyle1.jpg);background-repeat:no-repeat;background-position:center center}.Btn:hover{color:red}.menu1h{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;font-weight:bold;text-decoration:none;border-top:1px solid #036;border-bottom:1px solid #036;border-left:1px solid #036;border-right:1px solid white;border-collapse:collapse;display:block}.menu1h:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menu1h_f{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;font-weight:bold;text-decoration:none;border:1px -solid #036;display:block}.menu1h_f:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menu1v{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;font-weight:bold;text-decoration:none;border:1px -solid #036;border-collapse:collapse;display:block}.menu1v:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menu2v{background-color:#58B;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:12px;font-weight:bold;text-decoration:none;border:1px -solid #4277AB;border-collapse:collapse;float:left;display:block}.menu2v:hover{background-color:white;color:red;border:1px -solid darkgreen;border-collapse:collapse}.menuEDF{background-color:#036;color:white;font-family:Verdana,Arial,Lucida,Tahoma;font-size:10px;text-decoration:none}.menuEDF:hover{color:#F80}.Bouton{color:#036;text-align:center;font-weight:bold;cursor:pointer;background-color:#FFF}input{border:2px -solid green;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.disabled_input{border:1px -solid gray;color:grey;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input0{border:0px;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp)}.input2{border:1px -solid green;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input3{border:1px -solid black;color:#036;background-color:#EEE;background-image:url()}.input4{border:1px -solid blue;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input5{border:1px -solid darkblue;color:#036;background-color:#FFF;background-image:url(../images/fond_4.bmp);background-repeat:repeat-x}.input_btn{border:0px;cursor:pointer}textarea{border:2px -solid green;color:#036;background-color:#FFF;background-image:url(../images/fond_5.bmp)}.TEXTAREA3{border:1px -solid green;color:#036;background-color:#FFF;background-image:url()}.TEXTAREA4{border:1px -solid green;color:#036;background-color:#EEE;background-image:url()}.hand{cursor:hand;cursor:pointer} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.css b/release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.css deleted file mode 100644 index da7cfca..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.css +++ /dev/null @@ -1,12 +0,0 @@ -@import "foo.css"; -@import 'bar/foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(../foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.min.css b/release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.min.css deleted file mode 100644 index ffb94e2..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/paths_prepend.min.css +++ /dev/null @@ -1 +0,0 @@ -@import "../foo.css";@import '../bar/foo.css' print;@import '/css/foo.css';@import 'http://foo.com/css/foo.css';@import url(../../foo.css) tv, projection;@import url("/css/foo.css");@import url(/css2/foo.css);@import url(data:image/gif;base64,AAAA);foo{background:url('../bar/foo.png')}foo{background:url('http://foo.com/css/foo.css')}foo{background:url("//foo.com/css/foo.css")}foo{background:url(data:image/gif;base64,AAAA)} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.css b/release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.css deleted file mode 100644 index aa41d0a..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.css +++ /dev/null @@ -1,14 +0,0 @@ -@import "foo.css"; -@import 'bar/foo.css' print; -@import '../bar/foo.css' print; -@import '../../foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(../foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.min.css b/release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.min.css deleted file mode 100644 index 3493615..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/paths_rewrite.min.css +++ /dev/null @@ -1 +0,0 @@ -@import "/_test_files/css/foo.css";@import '/_test_files/css/bar/foo.css' print;@import '/_test_files/bar/foo.css' print;@import '/foo.css' print;@import '/css/foo.css';@import 'http://foo.com/css/foo.css';@import url(/_test_files/foo.css) tv, projection;@import url("/css/foo.css");@import url(/css2/foo.css);@import url(data:image/gif;base64,AAAA);foo{background:url('/_test_files/css/bar/foo.png')}foo{background:url('http://foo.com/css/foo.css')}foo{background:url("//foo.com/css/foo.css")}foo{background:url(data:image/gif;base64,AAAA)} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/readme.txt b/release_2.1.3/min_unit_tests/_test_files/css/readme.txt deleted file mode 100644 index 0181755..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/readme.txt +++ /dev/null @@ -1 +0,0 @@ -Test suite from http://search.cpan.org/~gtermars/CSS-Minifier-XS/ \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/selectors.css b/release_2.1.3/min_unit_tests/_test_files/css/selectors.css deleted file mode 100644 index d74c9aa..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/selectors.css +++ /dev/null @@ -1,42 +0,0 @@ -/* http://www.w3.org/TR/css3-selectors/ */ - -* -E[foo] -E[foo="bar"] -E[foo~="bar"] -E[foo^="bar"] -E[foo$="bar"] -E[foo*="bar"] -E[hreflang|="en"] -E:root -E:nth-child(n) -E:nth-last-child(n) -E:nth-of-type(n) -E:nth-last-of-type(n) -E:first-child -E:last-child -E:first-of-type -E:last-of-type -E:only-child -E:only-of-type -E:empty -E:link -E:visited -E:active -E:hover -E:focus -E:target -E:lang(fr) -E:enabled -E:disabled -E:checked -E::first-line -E::first-letter -E::selection -E::before -E::after -E.warning#myid -E:not(s) - > F - + F - ~ F {color: red;} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/selectors.min.css b/release_2.1.3/min_unit_tests/_test_files/css/selectors.min.css deleted file mode 100644 index 643089f..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/selectors.min.css +++ /dev/null @@ -1,37 +0,0 @@ -* -E[foo] -E[foo="bar"] -E[foo~="bar"] -E[foo^="bar"] -E[foo$="bar"] -E[foo*="bar"] -E[hreflang|="en"] -E:root -E:nth-child(n) -E:nth-last-child(n) -E:nth-of-type(n) -E:nth-last-of-type(n) -E:first-child -E:last-child -E:first-of-type -E:last-of-type -E:only-child -E:only-of-type -E:empty -E:link -E:visited -E:active -E:hover -E:focus -E:target -E:lang(fr) -E:enabled -E:disabled -E:checked -E::first-line -E::first-letter -E::selection -E::before -E::after -E.warning#myid -E:not(s)>F+F~F{color:red} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/styles.css b/release_2.1.3/min_unit_tests/_test_files/css/styles.css deleted file mode 100644 index bf46c0a..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/styles.css +++ /dev/null @@ -1,31 +0,0 @@ -/* some CSS to try to exercise things in general */ - -@import url( /more.css ); - - body, td, th { - font-family: Verdana , "Bitstream Vera Sans" , sans-serif ; - - font-size : 12px; -} - -.nav { - margin-left: 20%; -} -#main-nav { - background-color: red; - border: 1px solid #00ff77; -} - -div#content -h1 + p { - padding-top: 0; - margin-top: 0; -} - -@media all and (min-width: 640px) { - #media-queries-1 { background-color: #0f0; } -} - -@media screen and (max-width: 2000px) { - #media-queries-2 { background-color: #0f0; } -} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/styles.min.css b/release_2.1.3/min_unit_tests/_test_files/css/styles.min.css deleted file mode 100644 index a823b05..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/styles.min.css +++ /dev/null @@ -1,3 +0,0 @@ -@import url(/more.css);body,td,th{font-family:Verdana,"Bitstream Vera Sans",sans-serif;font-size:12px}.nav{margin-left:20%}#main-nav{background-color:red;border:1px -solid #0f7}div#content -h1+p{padding-top:0;margin-top:0}@media all and (min-width: 640px){#media-queries-1{background-color:#0f0}}@media screen and (max-width: 2000px){#media-queries-2{background-color:#0f0}} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/subsilver.css b/release_2.1.3/min_unit_tests/_test_files/css/subsilver.css deleted file mode 100644 index 79d34ec..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/subsilver.css +++ /dev/null @@ -1,434 +0,0 @@ -/* Based on the original Style Sheet for the fisubsilver v2 Theme for phpBB version 2+ -Edited by Daz - http://www.forumimages.com - last updated 26-06-03 */ -/* The content of the posts (body of text) */ -/* General page style */ - - - - /* begin suggest post */ - .float-l{ - float: left; - } - - .form-suggest{ - height:200px; - background:#DEE2D0; - vertical-align: top; - } - - .form-input input{ - font-size: 10px; - } - - .hide{ - display:none; - } - - .form-input textarea{ - font-size: 11px; - width: 350px; - } - - .form-label{ - font-size: 10px; - font-weight: bold; - line-height: 25px; - padding-right: 10px; - text-align: right; - width: 100px; - color: #39738F; - } - - .font-9{ - font-size: 9px; - } - - .form-topic{ - font-weight:bold; - - } - - .form-error{ - color:red; - } - - .inline{ - display: inline; - } - - .space-10{ - clear: both; - font-size: 10px; - height: 10px; - line-height: 10px; - } - - .suggest-success{ - color:green; - padding-left:10px; - font-size:11px; - font-weight:bold; - } - - .top{ - vertical-align: top; - } - /* end suggest post */ - -table td{ - padding:3px; -} - -a:link,a:active,a:visited,a.postlink{ - color: #006699; - text-decoration: none; -} - -a:hover{ - color: #DD6900; -} - -a.admin:hover,a.mod:hover{ - color: #DD6900; -} - -a.but,a.but:hover,a.but:visited{ - color: #000000; - text-decoration: none; -} - -a.topictitle:visited{ - color: #5493B4; -} - -a.topictitle:hover{ - color: #DD6900; -} - - - -body{ - color: #000000; - font: 11px Verdana,Arial,Helvetica,sans-serif; - margin: 0 10px 10px 10px; - padding: 0; - overflow:auto; -} - -/* General font families for common tags */ -font,th,td,p{ - font: 12px Verdana,Arial,Helvetica,sans-serif; -} - -/* Form elements */ -form{ - display: inline; -} - -hr{ - border: 0px solid #FFFFFF; - border-top-width: 1px; - height: 0px; -} - -/* Gets rid of the need for border="0" on hyperlinked images */ -img{ - border: 0 solid; -} - -input{ - font: 11px Verdana,Arial,Helvetica,sans-serif; -} - -input.button,input.liteoption,.fakebut{ - background: #FAFAFA; - border: 1px solid #000000; - font-size: 11px; -} - -input.catbutton{ - background: #FAFAFA; - border: 1px solid #000000; - font-size: 10px; -} - -input.mainoption{ - background: #FAFAFA; - border: 1px solid #000000; - font-size: 11px; - font-weight: bold; -} - -input.post,textarea.post{ - background: #FFFFFF; - border: 1px solid #000000; - font: 11px Verdana,Arial,Helvetica,sans-serif; - padding-bottom: 2px; - padding-left: 2px; -} - -select{ - background: #FFFFFF; - font: 11px Verdana,Arial,Helvetica,sans-serif; -} - -table{ - text-align: left; -} - -td{ - vertical-align: middle; -} - -/* Category gradients*/ -td.cat{ - background-color: #C2C6BA; - font-weight: bold; - height: 20px; - letter-spacing: 1px; - text-indent: 4px; -} - -td.genmed,.genmed{ - font-size: 11px; -} - -/* This is for the table cell above the Topics,Post & Last posts on the index.php */ -td.rowpic{ - background: #C2C6BA; -} - -td.spacerow{ - background: #E5E6E2; -} - -/* Table Header cells */ -th{ - background-color: #FADD31; - background-image: url(images/cellpic3.gif); - background-repeat: repeat-x; - color: #68685E; - font-size: 11px; - font-weight: bold; - line-height:16px; - height: 16px; - padding-left: 8px; - padding-right: 8px; - text-align: center; - white-space: nowrap; -} - -/* Admin & Moderator Colours MODification */ -.admin,.mod{ - font-size: 11px; - font-weight: bold; -} - -.admin,a.admin,a.admin:visited{ - color: #FFA34F; -} - -/* This is the border line & background colour round the entire page */ -.bodyline{ - background: #FFFFFF; - border: 1px solid #98AAB1; -} - -.center{ - text-align: center; -} - -/* Code blocks */ -.code{ - background: #FAFAFA; - border: 1px solid #D1D7DC; - color: #006600; - font: 12px Courier,"Courier New",sans-serif; - padding: 5px; -} - -/* This is for the error messages that pop up */ -.errorline{ - background: #E5E6E2; - border: 1px solid #8F8B8B; - color:#D92A2A; -} - -.explaintitle{ - color: #5C81B1; - font-size: 11px; - font-weight: bold; -} - -/* This is the outline round the main forum tables */ -.forumline{ - background: #FFFFFF; -} - -/* General text */ -.gensmall{ - font-size: 10px; -} - -.h1-font{ - color: #006699; - display: inline; - font: bold 13px Verdana, Arial, Helvetica, sans-serif; - margin: 0; - text-decoration: none; -} - -.h2-font{ - display: inline; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; -} - -.height1{ - height: 1px; -} - -.height22{ - height: 22px; -} - -.height25{ - height: 25px; -} - -.height28{ - height: 28px; -} - -.height30{ - height: 30px; -} - -.height40{ - height: 40px; -} - -/* This is the line in the posting page which shows the rollover -help line. Colour value in row2 */ -.helpline{ - border: 0 solid; - font-size: 10px; -} - -.imgfolder{ - margin: 1px 4px 1px 4px; -} - -.imgspace{ - margin-left: 1px; - margin-right: 2px; -} - -/* Specify the space around images */ -.imgtopic,.imgicon{ - margin-left: 3px; -} - -.left{ - text-align: left; -} - -/* The largest text used in the index page title and toptic title etc. */ -.maintitle,h1,h2{ - color: #5C81B1; - font: bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif; - text-decoration: none; -} - -.maxwidth{ - width: 100%; -} - -.mod,a.mod,a.mod:visited{ - color: #006600; -} - -/* Name of poster in viewmsg.php and viewtopic.php and other places */ -.name{ - font-size: 11px; - font-weight: bold; -} - -/* Used for the navigation text,(Page 1,2,3 etc) and the navigation bar when in a forum */ -.nav{ - font-size: 11px; - font-weight: bold; -} - -.nowrap{ - white-space: nowrap; -} - -.postbody{ - font-size: 12px; - line-height: 125%; -} - -.postbody a{ - text-decoration: underline; -} - -/* Location,number of posts,post date etc */ -.postdetails{ - color: #00396A; - font-size: 10px; -} - -/* Quote blocks */ -.quote{ - background: #F3F3EF; - border: 1px solid #C2C6BA; - color: #006699; - font-size: 11px; - line-height: 125%; -} - -.right{ - text-align: right; -} - -/* Main table cell colours and backgrounds */ -.row1{ - background: #F0F0EB; -} - -.row2,.helpline{ - background: #E5E6E2; -} - -.row3{ - background: #DBDBD4; -} - -.subtitle,h2{ - font: bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif; - text-decoration: none; -} - -/* titles for the topics:could specify viewed link colour too */ -.topictitle { - color: #000000; - font-size: 11px; - font-weight: bold; -} - -.underline{ - text-decoration: underline; -} - -.top{ -vertical-align:top; -} - -.image-hspace{ -margin-right:3px; -} - -.clear{ -clear:both; -} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/subsilver.min.css b/release_2.1.3/min_unit_tests/_test_files/css/subsilver.min.css deleted file mode 100644 index f59b15a..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/subsilver.min.css +++ /dev/null @@ -1,18 +0,0 @@ -.float-l{float:left}.form-suggest{height:200px;background:#DEE2D0;vertical-align:top}.form-input -input{font-size:10px}.hide{display:none}.form-input -textarea{font-size:11px;width:350px}.form-label{font-size:10px;font-weight:bold;line-height:25px;padding-right:10px;text-align:right;width:100px;color:#39738F}.font-9{font-size:9px}.form-topic{font-weight:bold}.form-error{color:red}.inline{display:inline}.space-10{clear:both;font-size:10px;height:10px;line-height:10px}.suggest-success{color:green;padding-left:10px;font-size:11px;font-weight:bold}.top{vertical-align:top}table -td{padding:3px}a:link,a:active,a:visited,a.postlink{color:#069;text-decoration:none}a:hover{color:#DD6900}a.admin:hover,a.mod:hover{color:#DD6900}a.but,a.but:hover,a.but:visited{color:#000;text-decoration:none}a.topictitle:visited{color:#5493B4}a.topictitle:hover{color:#DD6900}body{color:#000;font:11px Verdana,Arial,Helvetica,sans-serif;margin:0 -10px 10px 10px;padding:0;overflow:auto}font,th,td,p{font:12px Verdana,Arial,Helvetica,sans-serif}form{display:inline}hr{border:0px -solid #FFF;border-top-width:1px;height:0px}img{border:0 -solid}input{font:11px Verdana,Arial,Helvetica,sans-serif}input.button,input.liteoption,.fakebut{background:#FAFAFA;border:1px -solid #000;font-size:11px}input.catbutton{background:#FAFAFA;border:1px -solid #000;font-size:10px}input.mainoption{background:#FAFAFA;border:1px -solid #000;font-size:11px;font-weight:bold}input.post,textarea.post{background:#FFF;border:1px -solid #000;font:11px Verdana,Arial,Helvetica,sans-serif;padding-bottom:2px;padding-left:2px}select{background:#FFF;font:11px Verdana,Arial,Helvetica,sans-serif}table{text-align:left}td{vertical-align:middle}td.cat{background-color:#C2C6BA;font-weight:bold;height:20px;letter-spacing:1px;text-indent:4px}td.genmed,.genmed{font-size:11px}td.rowpic{background:#C2C6BA}td.spacerow{background:#E5E6E2}th{background-color:#FADD31;background-image:url(images/cellpic3.gif);background-repeat:repeat-x;color:#68685E;font-size:11px;font-weight:bold;line-height:16px;height:16px;padding-left:8px;padding-right:8px;text-align:center;white-space:nowrap}.admin,.mod{font-size:11px;font-weight:bold}.admin,a.admin,a.admin:visited{color:#FFA34F}.bodyline{background:#FFF;border:1px -solid #98AAB1}.center{text-align:center}.code{background:#FAFAFA;border:1px -solid #D1D7DC;color:#060;font:12px Courier,"Courier New",sans-serif;padding:5px}.errorline{background:#E5E6E2;border:1px -solid #8F8B8B;color:#D92A2A}.explaintitle{color:#5C81B1;font-size:11px;font-weight:bold}.forumline{background:#FFF}.gensmall{font-size:10px}.h1-font{color:#069;display:inline;font:bold 13px Verdana,Arial,Helvetica,sans-serif;margin:0;text-decoration:none}.h2-font{display:inline;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.height1{height:1px}.height22{height:22px}.height25{height:25px}.height28{height:28px}.height30{height:30px}.height40{height:40px}.helpline{border:0 -solid;font-size:10px}.imgfolder{margin:1px -4px 1px 4px}.imgspace{margin-left:1px;margin-right:2px}.imgtopic,.imgicon{margin-left:3px}.left{text-align:left}.maintitle,h1,h2{color:#5C81B1;font:bold 20px/120% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.maxwidth{width:100%}.mod,a.mod,a.mod:visited{color:#060}.name{font-size:11px;font-weight:bold}.nav{font-size:11px;font-weight:bold}.nowrap{white-space:nowrap}.postbody{font-size:12px;line-height:125%}.postbody -a{text-decoration:underline}.postdetails{color:#00396A;font-size:10px}.quote{background:#F3F3EF;border:1px -solid #C2C6BA;color:#069;font-size:11px;line-height:125%}.right{text-align:right}.row1{background:#F0F0EB}.row2,.helpline{background:#E5E6E2}.row3{background:#DBDBD4}.subtitle,h2{font:bold 18px/180% "Trebuchet MS",Verdana,Arial,Helvetica,sans-serif;text-decoration:none}.topictitle{color:#000;font-size:11px;font-weight:bold}.underline{text-decoration:underline}.top{vertical-align:top}.image-hspace{margin-right:3px}.clear{clear:both} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.css b/release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.css deleted file mode 100644 index 69fa756..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.css +++ /dev/null @@ -1,10 +0,0 @@ -/* test unusual, but valid strings in CSS */ - -foo[attr="multiple spaces"] { - content: "Hello World!"; -} - -foo[attr="Hel\ -lo"] { - content: " \"World\""; -} diff --git a/release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.min.css b/release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.min.css deleted file mode 100644 index 4b7d97e..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/unusual_strings.min.css +++ /dev/null @@ -1,2 +0,0 @@ -foo[attr="multiple spaces"]{content:"Hello World!"}foo[attr="Hel\ -lo"]{content:" \"World\""} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/vladmirated.css b/release_2.1.3/min_unit_tests/_test_files/css/vladmirated.css deleted file mode 100644 index 819835e..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/vladmirated.css +++ /dev/null @@ -1,658 +0,0 @@ -/* from http://www.vladimirated.com/web-development-minify-css-using-php-and-cssmin-class */ - - #comments_inviter #close_me { - clear: both; - text-align: center; - border-top: 1px solid #eeeeee; - padding-top: 10px; - } - - #comments_inviter #close_me span { - color: #108eed; - cursor: pointer; - font-weight: bold; - } - - #comments_inviter img { - float: left; - margin-right: 3px; - margin-bottom: 10px; - } - - #comments_inviter { - width: 200px; - background-color: #FFFFFF; - border: 4px solid #eeeeee; - font-size: 10px; - font-family: verdana; - padding: 10px; - color: #333333; - } - - .one_com { - background-color: #FAFAFA; - padding: 10px; - margin-bottom: 20px; - border: 1px solid #EEEEEE; - } - - .one_com .com_says, .one_com .com_det { - text-transform: lowercase; - color: #333333; - padding: 0px; - font-family: verdana; - margin: 0px; - font-size: 13px; - font-weight: bold; - } - - .flvPlayer { - text-align: center; - border: 5px solid #dddddd; - width: 320px; - } - - .one_com .com_det { - font-size: 10px; - font-weight: normal; - margin-bottom: 20px; - padding-bottom: 10px; - border-bottom: 8px solid #eeeeee; - } - - .one_com .com_det a { - text-decoration: none; - } - - .one_com .com_txt { - background-color: #ffffff; - margin-bottom: 10px; - border-bottom: 2px solid #eeeeee - } - - .one_com .com_txt p { - font-family: verdana; - font-size: 13px; - color: #777777; - margin: 0px; - padding: 5px; - padding-bottom: 10px; - text-transform: lowercase; - } - - .one_com .com_says a { - color: #333333; - } - - .one_com .com_det a { - color: #333333; - } - - .post_box .related_posts { - - } - - .post_box .related_posts p { - padding: 0px; - margin: 0px; - padding-bottom: 20px; - padding-left: 35px; - font-family: verdana; - - } - - .post_box .related_posts a { - color: #108eed; - } - - .post_nav_2 p { - - text-align: center; - color: #cccccc; - font-family: verdana; - } - - .post_box .related_posts h3, #comments_box #respond, .comments_posted h3 { - padding: 0px; - margin: 0px; - font-size: 18px; - color: #FF8000; - padding-top: 30px; - margin-bottom: 20px; - width: 300px; - border-bottom: 5px solid #e0e0e0; - } - - .comments_posted { - - margin-bottom: 50px; - - } - - .comments_posted h3 { - padding: 0px; - margin: 0px; - margin-bottom: 20px; - - } - - .cmt_txtarea { - width: 300px; - height: 100px; - - } - - #comments_box #respond { - - padding-top: 0px; - margin-bottom: 0px; - - } - - .pagetitle { - color: #65DA33; - text-align: center; - } - - #searchform { - padding: 0px; - margin: 0px; - } - - .si { - background-color: #FFFFEE; - border: 1px solid #e0e0e0; - } - - #rightcol #r_news, #rightcol #linksbro, #rightcol #quick_tags { - margin-top: 30px; - padding-bottom: 10px; - } - - #post_nav p { - padding: 0px; - margin: 0px; - padding-bottom: 5px; - } - - #post_nav { - text-align: left; - padding-bottom: 15px; - } - - #post_nav a, .post_nav_2 p a { - text-decoration: none; - font-family: Verdana; - font-size: 12px; - color: #108eed; - } - - #post_nav a:hover, .post_nav_2 p a:hover { - text-decoration: underline; - color: #FF8000; - } - - #rightcol #about { - padding-bottom: 10px; - } - - #rightcol #r_news input { - color: #333333; - font-size: 12px; - } - - #header { - height: 200px; - width: 100%; - background-image: url('images/header_bg.jpg'); - background-repeat: x-repeat; - } - - #header img { - - float: right; - margin-right: -3px; - z-index: 100; - - } - - .tags { - text-transform: lowercase; - color: #333333; - font-family: arial; - font-size: 12px; - border-top: 2px dotted #EEEEEE; - width: 300px; - padding-top: 20px; - padding-bottom: 0px; - margin-top: 0px; - padding-left: 20px; - padding-right: 20px; - } - - .tags a { - color: #108eed; - } - - .tags p { - text-align: left; - margin: 0px; - padding: 0px; - } - - blockquote strong { - font-family: verdana; - display: block; - margin-top: 10px; - color: #FF0000; - font-style: italic; - text-align: right; - } - - blockquote { - margin: 0px; - background-color: #eeeeee; - border: 2px solid #dddddd; - padding: 24px; - padding-top: 10px; - padding-left: 60px; - padding-bottom: 10px; - font-size: 13px; - color: #333333; - margin-bottom: 30px; - margin-top: 10px; - } - - - html>body #header img { margin-right: 0px; } - - #subscribe h3 { - color: #ff0000; - margin-top: 30px; - padding: 20px; - } - - .post_actions a{ - color: #108eed; - } - - .post_actions { - border-top: 4px solid #DDDDDD; - border-bottom: 1px solid #EEEEEE; - text-align: center; - background-color: #FFFFDd; - color: #dddddd; - white-space: no-wrap; - padding-left: 20px; - padding-bottom: 5px; - text-transform: capitalize; - } - - #subscribe td { - color: #333333; - font-size: 12px; - text-transform: lowercase; - } - - #subscribe input { - font-size: 13px; - color: #333333; - } - - .post_content { - font-size: 13px; - margin-top: 10px; - padding-bottom: 10px; - text-align: justify; - font-family: verdana; - } - - .post_content p { - margin: 0px; - padding: 0px; - padding-bottom: 20px; - line-height: 20px; - } - - #header h1 { - z-index: 200; - margin: 0px; - position: absolute; - float: left; - text-transform: lowercase; - padding: 0px; - font-size: 45px; - margin-top: 70px; - margin-left: 40px; - - } - - #header h1 a { - white-space: no-wrap; - text-decoration: none; - color: #FAFAFA; - display: block - } - - #header h1 a:hover { - color: #FAFAFA; - border-bottom: 3px dotted #FAFAFA; - } - - html>body #header h1 { margin-left: 60px; } - - body { - margin: 0px; - padding: 0px; - height: 100%; - width: 100%; - font-family: 'Lucida Sans Unicode', 'Lucida Grande', Sans-Serif, Verdana, Arial; - font-size: 12px; - } - - #leftcol { - float: left; - width: 200px; - margin-left: 0px; - margin-top: 17px; - color: #000; - padding: 3px; - height: 100%; - } - - #leftcol .box_head h3 { - text-transform: uppercase; - padding: 0px; - margin: 0px; - font-family: georgia; - font-size: 18px; - color: #dddddd; - border-top: 4px solid #dddddd; - border-bottom: 4px solid #cccccc; - padding-left: 10px; - padding-top: 10px; - padding-bottom: 10px; - background-image: url('images/stripesbg.png'); - margin-bottom: 10px; - } - - #leftcol .box_head input { - text-transform: lowercase; - color: #333333; - } - - #leftcol .box_head { - margin-left: 7px; - background-color: #ffefd4; - border-bottom: 2px solid #eeeeee; - padding-bottom: 20px; - margin-bottom: 30px; - } - - #leftcol .box_head p a { - color: #0a2d4d; - display: block; - text-decoration: none; - border-bottom: 3px solid #fefefe; - padding-top: 20px; - text-transform: lowercase; - padding-bottom: 20px; - padding-left: 5px; - padding-right: 5px; - } - - #leftcol .box_head p a:hover { - background-color: #fafafa; - border-bottom: 3px solid #eeeeee; - color: #000000; - } - - #leftcol .box_head p { - text-align: left; - margin: 0px; - width: 170px; - padding-bottom: 0px; - padding-top: 0px; - font-size: 11px; - } - - #rightcol { - position: absolute; - left: 77%; - top: 278px; - border: 3px solid #eeeeee; - width: 200px; - z-index: 3; - color: #333333; - padding: 10px; - text-transform: lowercase; - - } - - #rightcol p { - padding: 0px; - marging: 0px; - text-align: justify; - } - - #rightcol #about img, #rightcol #linksbro img { - border: 5px solid #eeeeee; - } - - #rightcol #about h3, #rightcol #r_news h3, #rightcol #linksbro h3, #rightcol #quick_tags h3 { - background-color: #fafafa; - border: 1px dotted #e0e0e0; - font-size: 14px; - color: #104bbc; - padding: 5px; - padding-top: 10px; - font-family: Arial; - padding-bottom: 10px; - } - - #rightcol #about p a, #rightcol #r_news p a, #rightcol #linksbro p a { - color: #108eed; - } - - #rightcol #about p, #rightcol #r_news p, #rightcol #linksbro p { - font-size: 12px; - text-align: left; - } - - #content_warp { - margin: 20px 25% 0 215px; - padding: 3px; - color: #000; - background-color: #ededed; - } - - #content { - margin: 5px; - background-color: #FFFFFF; - padding: 10px; - } - - - #footer { - width: 99%; - margin-top: 30px; - height: 98px; - background-color: #101b1d; - } - - #footer td a { - color: #FF8000; - } - - #footer td a img { - border: 2px solid #108eed; - } - - #footer td p { - font-family: Verdana; - font-size: 10px; - color: #c0c0c0; - padding: 0px; - margin: 0px; - text-align: center; - padding-bottom: 10px; - } - - .s_offer { - color: #65DA33; - font-size: 20px; - font-weight: bold; - font-style: normal; - } - - .post_box { - text-transform: lowercase; - margin-bottom: 40px; - } - - #newsletter_box { - text-transform: lowercase; - margin-bottom: 10px; - margin-top: 30px; - font-style: normal; - background-color: #ffffff; - border: 5px solid #dddddd; - } - - #newsletter_head { - color: #EEEEEE; - font-family: Georgia; - background-image: url('images/stripesbg.png'); - padding: 10px; - padding-left: 30px; - border-bottom: 5px solid #dddddd; - } - - #newsletter_body { - color: #333333; - font-family: Verdana; - text-align: justify; - background-color: #FFFFFF; - padding: 10px; - font-size: 13px; - } - - .s_offer { - color: #65DA33; - font-size: 26px; - font-weight: bold; - font-style: normal; - } - - .post_title a { - color: #EEEEEE; - text-decoration: none; - } - - .post_title a:hover { - color: #c0c0c0; - } - - .post_title { - background-image: url('images/stripe_post.png'); - text-transform: uppercase; - font-size: 18px; - font-family: georgia; - padding: 10px; - border-top: 4px solid #c0c0c0; - margin: 0px; - border-bottom: 2px solid #ffffdd; - } - - .post_det { - text-transform: none; - margin: 0px; - border-top: 1px solid #f0f0f0; - padding: 0px; - padding-top: 5px; - color: #999999; - font-size: 10px; - font-family: verdana; - margin-bottom: 20px; - background-color: #eeeeee; - padding-bottom: 5px; - padding-left: 10px; - text-align: left; - border-bottom: 2px solid #dddddd; - } - - .post_det a { - color: #999999; - text-decoration: none; - } - - - .subtle { - text-transform: lowercase; - font-size: 10px; - font-family: verdana; - color: #108eed; - text-align: justify; - } - - #top_menu #navlist, #top_menu #navlist li { - padding:0px; - margin: 0px; - padding-top: 14px; - text-transform: lowercase; - padding-bottom: 17px; - padding-left: 30px; - border-left: 1px solid #65cdef; - } - - #top_menu #navlist, #top_menu #navlist li #first { - - border-left: 0px; - - } - - #top_menu #navlist { - padding-left: 30px; - background-color: #1dabd9; - border-top: 5px solid #0e96c3; - border-bottom: 5px solid #0e96c3; - } - - #top_menu #navlist li { - color: #444444; - font-size: 10px; - display: inline; - list-style-type: none; - padding-right: 30px; - } - - #top_menu #navlist li a { - text-decoration: none; - font-family: Verdana; - color: #fafafa; - font-size: 12px; - font-weight: bold; - } - - #top_menu #navlist li a:hover { - color: #333333; - } - - .post_content a { - color: #108eed; - } - - ul#tagcloud { padding:0; margin:0; text-align:center; list-style:none; } - ul#tagcloud li { display:inline; font-size:70%; color:#ccc; background: none; padding: 0;} - ul#tagcloud li a, ul#tagcloud li a:link { text-decoration:none; } - ul#tagcloud li a:hover { text-decoration:underline; } - ul#tagcloud li.t1 a { color:#797979; font-size: 120%; } - ul#tagcloud li.t2 a { color:#6d6d6d; font-size: 160%; } - ul#tagcloud li.t3 a { color:#616161; font-size: 190%; } - ul#tagcloud li.t4 a { color:#555555; font-size: 210%; } - ul#tagcloud li.t5 a { color:#484848; font-size: 230%; } - ul#tagcloud li.t6 a { color:#3c3c3c; font-size: 250%; } - ul#tagcloud li.t7 a { color:#303030; font-size: 270%; } - ul#tagcloud li.t8 a { color:#242424; font-size: 290%; } - ul#tagcloud li.t9 a { color:#181818; font-size: 310%; } - ul#tagcloud li.t10 a { color:#0c0c0c; font-size: 330%; } \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css/vladmirated.min.css b/release_2.1.3/min_unit_tests/_test_files/css/vladmirated.min.css deleted file mode 100644 index eaffaee..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css/vladmirated.min.css +++ /dev/null @@ -1,79 +0,0 @@ -#comments_inviter -#close_me{clear:both;text-align:center;border-top:1px solid #eee;padding-top:10px}#comments_inviter #close_me -span{color:#108eed;cursor:pointer;font-weight:bold}#comments_inviter -img{float:left;margin-right:3px;margin-bottom:10px}#comments_inviter{width:200px;background-color:#FFF;border:4px -solid #eee;font-size:10px;font-family:verdana;padding:10px;color:#333}.one_com{background-color:#FAFAFA;padding:10px;margin-bottom:20px;border:1px -solid #EEE}.one_com .com_says, .one_com -.com_det{text-transform:lowercase;color:#333;padding:0px;font-family:verdana;margin:0px;font-size:13px;font-weight:bold}.flvPlayer{text-align:center;border:5px -solid #ddd;width:320px}.one_com -.com_det{font-size:10px;font-weight:normal;margin-bottom:20px;padding-bottom:10px;border-bottom:8px solid #eee}.one_com .com_det -a{text-decoration:none}.one_com -.com_txt{background-color:#fff;margin-bottom:10px;border-bottom:2px solid #eee}.one_com .com_txt -p{font-family:verdana;font-size:13px;color:#777;margin:0px;padding:5px;padding-bottom:10px;text-transform:lowercase}.one_com .com_says -a{color:#333}.one_com .com_det -a{color:#333}.post_box -.related_posts{}.post_box .related_posts -p{padding:0px;margin:0px;padding-bottom:20px;padding-left:35px;font-family:verdana}.post_box .related_posts -a{color:#108eed}.post_nav_2 -p{text-align:center;color:#ccc;font-family:verdana}.post_box .related_posts h3, #comments_box #respond, .comments_posted -h3{padding:0px;margin:0px;font-size:18px;color:#FF8000;padding-top:30px;margin-bottom:20px;width:300px;border-bottom:5px solid #e0e0e0}.comments_posted{margin-bottom:50px}.comments_posted -h3{padding:0px;margin:0px;margin-bottom:20px}.cmt_txtarea{width:300px;height:100px}#comments_box -#respond{padding-top:0px;margin-bottom:0px}.pagetitle{color:#65DA33;text-align:center}#searchform{padding:0px;margin:0px}.si{background-color:#FFE;border:1px -solid #e0e0e0}#rightcol #r_news, #rightcol #linksbro, #rightcol -#quick_tags{margin-top:30px;padding-bottom:10px}#post_nav -p{padding:0px;margin:0px;padding-bottom:5px}#post_nav{text-align:left;padding-bottom:15px}#post_nav a, .post_nav_2 p -a{text-decoration:none;font-family:Verdana;font-size:12px;color:#108eed}#post_nav a:hover, .post_nav_2 p a:hover{text-decoration:underline;color:#FF8000}#rightcol -#about{padding-bottom:10px}#rightcol #r_news -input{color:#333;font-size:12px}#header{height:200px;width:100%;background-image:url('images/header_bg.jpg');background-repeat:x-repeat}#header -img{float:right;margin-right: -3px;z-index:100}.tags{text-transform:lowercase;color:#333;font-family:arial;font-size:12px;border-top:2px dotted #EEE;width:300px;padding-top:20px;padding-bottom:0px;margin-top:0px;padding-left:20px;padding-right:20px}.tags -a{color:#108eed}.tags -p{text-align:left;margin:0px;padding:0px}blockquote -strong{font-family:verdana;display:block;margin-top:10px;color:#F00;font-style:italic;text-align:right}blockquote{margin:0px;background-color:#eee;border:2px -solid #ddd;padding:24px;padding-top:10px;padding-left:60px;padding-bottom:10px;font-size:13px;color:#333;margin-bottom:30px;margin-top:10px}html>body #header -img{margin-right:0px}#subscribe -h3{color:#f00;margin-top:30px;padding:20px}.post_actions -a{color:#108eed}.post_actions{border-top:4px solid #DDD;border-bottom:1px solid #EEE;text-align:center;background-color:#FFD;color:#ddd;white-space:no-wrap;padding-left:20px;padding-bottom:5px;text-transform:capitalize}#subscribe -td{color:#333;font-size:12px;text-transform:lowercase}#subscribe -input{font-size:13px;color:#333}.post_content{font-size:13px;margin-top:10px;padding-bottom:10px;text-align:justify;font-family:verdana}.post_content -p{margin:0px;padding:0px;padding-bottom:20px;line-height:20px}#header -h1{z-index:200;margin:0px;position:absolute;float:left;text-transform:lowercase;padding:0px;font-size:45px;margin-top:70px;margin-left:40px}#header h1 -a{white-space:no-wrap;text-decoration:none;color:#FAFAFA;display:block}#header h1 a:hover{color:#FAFAFA;border-bottom:3px dotted #FAFAFA}html>body #header -h1{margin-left:60px}body{margin:0px;padding:0px;height:100%;width:100%;font-family:'Lucida Sans Unicode','Lucida Grande',Sans-Serif,Verdana,Arial;font-size:12px}#leftcol{float:left;width:200px;margin-left:0px;margin-top:17px;color:#000;padding:3px;height:100%}#leftcol .box_head -h3{text-transform:uppercase;padding:0px;margin:0px;font-family:georgia;font-size:18px;color:#ddd;border-top:4px solid #ddd;border-bottom:4px solid #ccc;padding-left:10px;padding-top:10px;padding-bottom:10px;background-image:url('images/stripesbg.png');margin-bottom:10px}#leftcol .box_head -input{text-transform:lowercase;color:#333}#leftcol -.box_head{margin-left:7px;background-color:#ffefd4;border-bottom:2px solid #eee;padding-bottom:20px;margin-bottom:30px}#leftcol .box_head p -a{color:#0a2d4d;display:block;text-decoration:none;border-bottom:3px solid #fefefe;padding-top:20px;text-transform:lowercase;padding-bottom:20px;padding-left:5px;padding-right:5px}#leftcol .box_head p a:hover{background-color:#fafafa;border-bottom:3px solid #eee;color:#000}#leftcol .box_head -p{text-align:left;margin:0px;width:170px;padding-bottom:0px;padding-top:0px;font-size:11px}#rightcol{position:absolute;left:77%;top:278px;border:3px -solid #eee;width:200px;z-index:3;color:#333;padding:10px;text-transform:lowercase}#rightcol -p{padding:0px;marging:0px;text-align:justify}#rightcol #about img, #rightcol #linksbro -img{border:5px -solid #eee}#rightcol #about h3, #rightcol #r_news h3, #rightcol #linksbro h3, #rightcol #quick_tags -h3{background-color:#fafafa;border:1px -dotted #e0e0e0;font-size:14px;color:#104bbc;padding:5px;padding-top:10px;font-family:Arial;padding-bottom:10px}#rightcol #about p a, #rightcol #r_news p a, #rightcol #linksbro p -a{color:#108eed}#rightcol #about p, #rightcol #r_news p, #rightcol #linksbro -p{font-size:12px;text-align:left}#content_warp{margin:20px -25% 0 215px;padding:3px;color:#000;background-color:#ededed}#content{margin:5px;background-color:#FFF;padding:10px}#footer{width:99%;margin-top:30px;height:98px;background-color:#101b1d}#footer td -a{color:#FF8000}#footer td a -img{border:2px -solid #108eed}#footer td -p{font-family:Verdana;font-size:10px;color:#c0c0c0;padding:0px;margin:0px;text-align:center;padding-bottom:10px}.s_offer{color:#65DA33;font-size:20px;font-weight:bold;font-style:normal}.post_box{text-transform:lowercase;margin-bottom:40px}#newsletter_box{text-transform:lowercase;margin-bottom:10px;margin-top:30px;font-style:normal;background-color:#fff;border:5px -solid #ddd}#newsletter_head{color:#EEE;font-family:Georgia;background-image:url('images/stripesbg.png');padding:10px;padding-left:30px;border-bottom:5px solid #ddd}#newsletter_body{color:#333;font-family:Verdana;text-align:justify;background-color:#FFF;padding:10px;font-size:13px}.s_offer{color:#65DA33;font-size:26px;font-weight:bold;font-style:normal}.post_title -a{color:#EEE;text-decoration:none}.post_title a:hover{color:#c0c0c0}.post_title{background-image:url('images/stripe_post.png');text-transform:uppercase;font-size:18px;font-family:georgia;padding:10px;border-top:4px solid #c0c0c0;margin:0px;border-bottom:2px solid #ffd}.post_det{text-transform:none;margin:0px;border-top:1px solid #f0f0f0;padding:0px;padding-top:5px;color:#999;font-size:10px;font-family:verdana;margin-bottom:20px;background-color:#eee;padding-bottom:5px;padding-left:10px;text-align:left;border-bottom:2px solid #ddd}.post_det -a{color:#999;text-decoration:none}.subtle{text-transform:lowercase;font-size:10px;font-family:verdana;color:#108eed;text-align:justify}#top_menu #navlist, #top_menu #navlist -li{padding:0px;margin:0px;padding-top:14px;text-transform:lowercase;padding-bottom:17px;padding-left:30px;border-left:1px solid #65cdef}#top_menu #navlist, #top_menu #navlist li -#first{border-left:0px}#top_menu -#navlist{padding-left:30px;background-color:#1dabd9;border-top:5px solid #0e96c3;border-bottom:5px solid #0e96c3}#top_menu #navlist -li{color:#444;font-size:10px;display:inline;list-style-type:none;padding-right:30px}#top_menu #navlist li -a{text-decoration:none;font-family:Verdana;color:#fafafa;font-size:12px;font-weight:bold}#top_menu #navlist li a:hover{color:#333}.post_content -a{color:#108eed}ul#tagcloud{padding:0;margin:0;text-align:center;list-style:none}ul#tagcloud -li{display:inline;font-size:70%;color:#ccc;background:none;padding:0}ul#tagcloud li a, ul#tagcloud li a:link{text-decoration:none}ul#tagcloud li a:hover{text-decoration:underline}ul#tagcloud li.t1 -a{color:#797979;font-size:120%}ul#tagcloud li.t2 -a{color:#6d6d6d;font-size:160%}ul#tagcloud li.t3 -a{color:#616161;font-size:190%}ul#tagcloud li.t4 -a{color:#555;font-size:210%}ul#tagcloud li.t5 -a{color:#484848;font-size:230%}ul#tagcloud li.t6 -a{color:#3c3c3c;font-size:250%}ul#tagcloud li.t7 -a{color:#303030;font-size:270%}ul#tagcloud li.t8 -a{color:#242424;font-size:290%}ul#tagcloud li.t9 -a{color:#181818;font-size:310%}ul#tagcloud li.t10 -a{color:#0c0c0c;font-size:330%} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/exp.css b/release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/exp.css deleted file mode 100644 index d749295..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/exp.css +++ /dev/null @@ -1,14 +0,0 @@ -@import "/_test_files/css_uriRewriter/foo.css"; -@import '/_test_files/css_uriRewriter/bar/foo.css' print; -@import '/_test_files/bar/foo.css' print; -@import '/foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(/_test_files/foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('/_test_files/css_uriRewriter/bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/in.css b/release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/in.css deleted file mode 100644 index aa41d0a..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/css_uriRewriter/in.css +++ /dev/null @@ -1,14 +0,0 @@ -@import "foo.css"; -@import 'bar/foo.css' print; -@import '../bar/foo.css' print; -@import '../../foo.css' print; -@import '/css/foo.css'; /* abs, should not alter */ -@import 'http://foo.com/css/foo.css'; /* abs, should not alter */ -@import url(../foo.css) tv, projection; -@import url("/css/foo.css"); /* abs, should not alter */ -@import url(/css2/foo.css); /* abs, should not alter */ -@import url(data:image/gif;base64,AAAA); /* data, should not alter */ -foo {background:url('bar/foo.png')} -foo {background:url('http://foo.com/css/foo.css');} /* abs, should not alter */ -foo {background:url("//foo.com/css/foo.css");} /* protocol relative, should not alter */ -foo {background:url(data:image/gif;base64,AAAA);} /* data, should not alter */ \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/html/before.html b/release_2.1.3/min_unit_tests/_test_files/html/before.html deleted file mode 100644 index c22cc8f..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/html/before.html +++ /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/release_2.1.3/min_unit_tests/_test_files/html/before.min.html b/release_2.1.3/min_unit_tests/_test_files/html/before.min.html deleted file mode 100644 index 58ba2bb..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/html/before.min.html +++ /dev/null @@ -1,36 +0,0 @@ -css Zen Garden: The Beauty in CSS Design

    Browser != IE

    css Zen Garden

    The Beauty of CSS Design

    -	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/release_2.1.3/min_unit_tests/_test_files/html/before2.html b/release_2.1.3/min_unit_tests/_test_files/html/before2.html deleted file mode 100644 index 4ca7f19..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/html/before2.html +++ /dev/null @@ -1,95 +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

    -
    - -Preserve at least 1 char of whitespace near scripts in case of document.write(). -
    - - \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/html/before2.min.html b/release_2.1.3/min_unit_tests/_test_files/html/before2.min.html deleted file mode 100644 index ae28465..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/html/before2.min.html +++ /dev/null @@ -1,36 +0,0 @@ -css Zen Garden: The Beauty in CSS Design

    Browser != IE

    css Zen Garden

    The Beauty of CSS Design

    -	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

    Preserve at least 1 char of whitespace near scripts in case of document.write().
    \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/importProcessor/1/adjacent.css b/release_2.1.3/min_unit_tests/_test_files/importProcessor/1/adjacent.css deleted file mode 100644 index da52c69..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/importProcessor/1/adjacent.css +++ /dev/null @@ -1,3 +0,0 @@ -/* @import url('bad.css' ) bad; */ -adjacent2 foo { background: red url(/red.gif); } -adjacent2 bar { background: url('../green.gif') } \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/importProcessor/1/tv.css b/release_2.1.3/min_unit_tests/_test_files/importProcessor/1/tv.css deleted file mode 100644 index 69fa2f5..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/importProcessor/1/tv.css +++ /dev/null @@ -1,4 +0,0 @@ -@import url( adjacent.css ) all; -@import '../input.css'; -tv foo { background: red url(/red.gif); } -tv bar { background: url('../green.gif') } \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/importProcessor/adjacent.css b/release_2.1.3/min_unit_tests/_test_files/importProcessor/adjacent.css deleted file mode 100644 index b452f47..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/importProcessor/adjacent.css +++ /dev/null @@ -1,4 +0,0 @@ -@import url(../css/styles.css); -@import url(http://example.com/hello.css); -adjacent foo { background: red url(/red.gif); } -adjacent bar { background: url('../green.gif') } \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/importProcessor/input.css b/release_2.1.3/min_unit_tests/_test_files/importProcessor/input.css deleted file mode 100644 index bb7b959..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/importProcessor/input.css +++ /dev/null @@ -1,4 +0,0 @@ -@import url( adjacent.css ) screen; -@import "1/tv.css" tv, projection; -input foo { background: red url(/red.gif); } -input bar { background: url('../green.gif') } \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/importProcessor/output.css b/release_2.1.3/min_unit_tests/_test_files/importProcessor/output.css deleted file mode 100644 index 1e4358c..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/importProcessor/output.css +++ /dev/null @@ -1,48 +0,0 @@ -@media screen { -/* some CSS to try to exercise things in general */ - -@import url(/more.css); - - body, td, th { - font-family: Verdana , "Bitstream Vera Sans" , sans-serif ; - - font-size : 12px; -} - -.nav { - margin-left: 20%; -} -#main-nav { - background-color: red; - border: 1px solid #00ff77; -} - -div#content -h1 + p { - padding-top: 0; - margin-top: 0; -} - -@media all and (min-width: 640px) { - #media-queries-1 { background-color: #0f0; } -} - -@media screen and (max-width: 2000px) { - #media-queries-2 { background-color: #0f0; } -} -@import url(http://example.com/hello.css); -adjacent foo { background: red url(/red.gif); } -adjacent bar { background: url('%TEST_FILES_URI%/green.gif') } -} - -@media tv,projection { -/* @import url('%TEST_FILES_URI%/importProcessor/1/bad.css') bad; */ -adjacent2 foo { background: red url(/red.gif); } -adjacent2 bar { background: url('%TEST_FILES_URI%/importProcessor/green.gif') } -@import '../input.css'; -tv foo { background: red url(/red.gif); } -tv bar { background: url('%TEST_FILES_URI%/importProcessor/green.gif') } -} - -input foo { background: red url(/red.gif); } -input bar { background: url('%TEST_FILES_URI%/green.gif') } \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/js/before.js b/release_2.1.3/min_unit_tests/_test_files/js/before.js deleted file mode 100644 index cccdb97..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/before.js +++ /dev/null @@ -1,57 +0,0 @@ -/*! is.js - - (c) 2001 Douglas Crockford - 2001 June 3 -*/ - -// is - -// The -is- object is used to identify the browser. Every browser edition -// identifies itself, but there is no standard way of doing it, and some of -// the identification is deceptive. This is because the authors of web -// browsers are liars. For example, Microsoft's IE browsers claim to be -// Mozilla 4. Netscape 6 claims to be version 5. - -var is = { - ie: navigator.appName == 'Microsoft Internet Explorer', - java: navigator.javaEnabled(), - ns: navigator.appName == 'Netscape', - ua: navigator.userAgent.toLowerCase(), - version: parseFloat(navigator.appVersion.substr(21)) || - parseFloat(navigator.appVersion), - win: navigator.platform == 'Win32' -} -/*!* - * preserve this comment, too - */ -is.mac = is.ua.indexOf('mac') >= 0; -if (is.ua.indexOf('opera') >= 0) { - is.ie = is.ns = false; - is.opera = true; -} -if (is.ua.indexOf('gecko') >= 0) { - is.ie = is.ns = false; - is.gecko = true; -} - -/*@cc_on - /*@if (@_win32) - if (is.ie && is.win) - document.write("PASS: IE/win honored conditional comment.
    "); - @else @*/ - if (is.ie && is.win) - document.write("FAIL: IE/win did not honor multi-line conditional comment.
    "); - else - document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.
    "); - /*@end -@*/ - -var recognizesCondComm = true; -//@cc_on/* -recognizesCondComm = false; -//@cc_on*/ - -if ((is.ie && is.win) == recognizesCondComm) - document.write("PASS: IE/win honored single-line conditional comment.
    "); -else - document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.
    "); diff --git a/release_2.1.3/min_unit_tests/_test_files/js/before.min.js b/release_2.1.3/min_unit_tests/_test_files/js/before.min.js deleted file mode 100644 index 6f06c6e..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/before.min.js +++ /dev/null @@ -1,22 +0,0 @@ -/* is.js - - (c) 2001 Douglas Crockford - 2001 June 3 -*/ -var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'} -/** - * preserve this comment, too - */ -is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;} -if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}/*@cc_on - /*@if (@_win32) - if (is.ie && is.win) - document.write("PASS: IE/win honored conditional comment.
    "); - @else @*/if(is.ie&&is.win) -document.write("FAIL: IE/win did not honor multi-line conditional comment.
    ");else -document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.
    ");/*@end -@*/var recognizesCondComm=true;//@cc_on/* -recognizesCondComm=false;//@cc_on*/ -if((is.ie&&is.win)==recognizesCondComm) -document.write("PASS: IE/win honored single-line conditional comment.
    ");else -document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.
    "); \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/js/before.min_plus.js b/release_2.1.3/min_unit_tests/_test_files/js/before.min_plus.js deleted file mode 100644 index 6f06c6e..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/before.min_plus.js +++ /dev/null @@ -1,22 +0,0 @@ -/* is.js - - (c) 2001 Douglas Crockford - 2001 June 3 -*/ -var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'} -/** - * preserve this comment, too - */ -is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;} -if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}/*@cc_on - /*@if (@_win32) - if (is.ie && is.win) - document.write("PASS: IE/win honored conditional comment.
    "); - @else @*/if(is.ie&&is.win) -document.write("FAIL: IE/win did not honor multi-line conditional comment.
    ");else -document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.
    ");/*@end -@*/var recognizesCondComm=true;//@cc_on/* -recognizesCondComm=false;//@cc_on*/ -if((is.ie&&is.win)==recognizesCondComm) -document.write("PASS: IE/win honored single-line conditional comment.
    ");else -document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.
    "); \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/js/condcomm.js b/release_2.1.3/min_unit_tests/_test_files/js/condcomm.js deleted file mode 100644 index 28aa126..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/condcomm.js +++ /dev/null @@ -1,14 +0,0 @@ -var isWin; -/*@cc_on - @if (@_win32) - isWin = true; - @else @*/ isWin = false; - /*@end -@*/ - -isWin = /*@cc_on!*/!1; - -var recognizesCondComm = true; -//@cc_on/* -recognizesCondComm = false; -//@cc_on*/ diff --git a/release_2.1.3/min_unit_tests/_test_files/js/condcomm.min_plus.js b/release_2.1.3/min_unit_tests/_test_files/js/condcomm.min_plus.js deleted file mode 100644 index d8c1ed3..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/condcomm.min_plus.js +++ /dev/null @@ -1,13 +0,0 @@ -var isWin; -/*@cc_on - @if (@_win32) - isWin = true; - @else @*/ - isWin = false; - /*@end -@*/ - -var recognizesCondComm = true; -//@cc_on/* -recognizesCondComm = false; -//@cc_on*/ \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/js/issue74.js b/release_2.1.3/min_unit_tests/_test_files/js/issue74.js deleted file mode 100644 index e12eaeb..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/issue74.js +++ /dev/null @@ -1,4 +0,0 @@ - -function testIssue74() { - return /'/; -} diff --git a/release_2.1.3/min_unit_tests/_test_files/js/issue74.min.js b/release_2.1.3/min_unit_tests/_test_files/js/issue74.min.js deleted file mode 100644 index 3442a73..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/issue74.min.js +++ /dev/null @@ -1 +0,0 @@ -function testIssue74(){return /'/;} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/js/issue74.min_plus.js b/release_2.1.3/min_unit_tests/_test_files/js/issue74.min_plus.js deleted file mode 100644 index 9caaa89..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/issue74.min_plus.js +++ /dev/null @@ -1 +0,0 @@ -function testIssue74(){return /'/} \ No newline at end of file diff --git a/release_2.1.3/min_unit_tests/_test_files/js/jquery-1.2.3.js b/release_2.1.3/min_unit_tests/_test_files/js/jquery-1.2.3.js deleted file mode 100644 index c5a3337..0000000 --- a/release_2.1.3/min_unit_tests/_test_files/js/jquery-1.2.3.js +++ /dev/null @@ -1,3408 +0,0 @@ -(function(){ -/*! - * jQuery 1.2.3 - New Wave Javascript - * - * Copyright (c) 2008 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $ - * $Rev: 4663 $ - */ - -// Map over jQuery in case of overwrite -if ( window.jQuery ) - var _jQuery = window.jQuery; - -var jQuery = window.jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.prototype.init( selector, context ); -}; - -// Map over the $ in case of overwrite -if ( window.$ ) - var _$ = window.$; - -// Map the jQuery namespace to the '$' one -window.$ = jQuery; - -// A simple way to check for HTML strings or ID strings -// (both of which we optimize for) -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\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 + ">"; - }); - - // 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 \ No newline at end of file