From 93182120002fdb03155f7ea07a9b66346b3eb0d7 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 7 Aug 2012 15:59:09 +0000 Subject: [PATCH] Plugins para comprimir js/css/html git-svn-id: https://192.168.0.254/svn/Proyectos.ASong2U_Web/trunk@68 cd1a4ea2-8c7f-e448-aada-19d1fee9e1d6 --- .../plugins/html-compress/html-compress.php | 40 + .../lib/html-compress/Compress.class.php | 126 ++ .../lib/html-compress/baseCompress.class.php | 36 + .../lib/html-compress/cssCompress.class.php | 57 + .../lib/html-compress/htmlCompress.class.php | 29 + .../lib/html-compress/jsCompress.class.php | 81 + .../lib/html-compress/tests/CompressTest.php | 103 + .../html-compress/tests/baseCompressTest.php | 73 + .../html-compress/tests/cssCompressTest.php | 41 + .../html-compress/tests/htmlCompressTest.php | 56 + .../html-compress/tests/jsCompressTest.php | 246 +++ .../lib/html-compress/tests/readme.txt | 5 + .../lib/html-compress/tests/testSuite.php | 22 + wp-content/plugins/html-compress/readme.txt | 31 + .../plugins/html-compress/screenshot-1.png | Bin 0 -> 42343 bytes wp-content/plugins/wp-minify/common.php | 284 +++ .../plugins/wp-minify/css/style-admin.css | 12 + .../plugins/wp-minify/http_build_url.php | 104 + .../plugins/wp-minify/js/easySlider1.5.js | 175 ++ .../plugins/wp-minify/lang/wp-minify-it_IT.mo | Bin 0 -> 7152 bytes .../plugins/wp-minify/lang/wp-minify-it_IT.po | 273 +++ .../plugins/wp-minify/lang/wp-minify-uk.mo | Bin 0 -> 7280 bytes .../plugins/wp-minify/lang/wp-minify-uk.po | 286 +++ .../plugins/wp-minify/lang/wp-minify.pot | 264 +++ wp-content/plugins/wp-minify/min/.htaccess | 4 + wp-content/plugins/wp-minify/min/README.txt | 132 ++ .../plugins/wp-minify/min/builder/_index.js | 242 +++ .../plugins/wp-minify/min/builder/bm.js | 36 + .../plugins/wp-minify/min/builder/index.php | 182 ++ .../plugins/wp-minify/min/builder/ocCheck.php | 36 + .../wp-minify/min/builder/rewriteTest.js | 1 + wp-content/plugins/wp-minify/min/config.php | 165 ++ .../plugins/wp-minify/min/groupsConfig.php | 34 + wp-content/plugins/wp-minify/min/index.php | 66 + .../plugins/wp-minify/min/lib/FirePHP.php | 1370 ++++++++++++ .../wp-minify/min/lib/HTTP/ConditionalGet.php | 348 +++ .../wp-minify/min/lib/HTTP/Encoder.php | 326 +++ .../plugins/wp-minify/min/lib/JSMin.php | 314 +++ .../plugins/wp-minify/min/lib/JSMinPlus.php | 1872 +++++++++++++++++ .../plugins/wp-minify/min/lib/Minify.php | 532 +++++ .../wp-minify/min/lib/Minify/Build.php | 103 + .../plugins/wp-minify/min/lib/Minify/CSS.php | 83 + .../min/lib/Minify/CSS/Compressor.php | 250 +++ .../min/lib/Minify/CSS/UriRewriter.php | 270 +++ .../wp-minify/min/lib/Minify/Cache/APC.php | 130 ++ .../wp-minify/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 ++ .../plugins/wp-minify/min/lib/Minify/HTML.php | 245 +++ .../min/lib/Minify/ImportProcessor.php | 157 ++ .../wp-minify/min/lib/Minify/Lines.php | 131 ++ .../wp-minify/min/lib/Minify/Logger.php | 45 + .../wp-minify/min/lib/Minify/Packer.php | 37 + .../wp-minify/min/lib/Minify/Source.php | 187 ++ .../min/lib/Minify/YUICompressor.php | 139 ++ .../plugins/wp-minify/min/lib/Solar/Dir.php | 199 ++ wp-content/plugins/wp-minify/min/utils.php | 90 + .../plugins/wp-minify/options-generic.php | 197 ++ .../plugins/wp-minify/options-sidebar.php | 1 + wp-content/plugins/wp-minify/readme.txt | 256 +++ wp-content/plugins/wp-minify/screenshot-1.png | Bin 0 -> 13800 bytes wp-content/plugins/wp-minify/screenshot-2.png | Bin 0 -> 23086 bytes wp-content/plugins/wp-minify/screenshot-3.png | Bin 0 -> 8342 bytes wp-content/plugins/wp-minify/wp-minify.php | 932 ++++++++ 70 files changed, 12514 insertions(+) create mode 100644 wp-content/plugins/html-compress/html-compress.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/Compress.class.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/baseCompress.class.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/cssCompress.class.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/htmlCompress.class.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/jsCompress.class.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/tests/CompressTest.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/tests/baseCompressTest.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/tests/cssCompressTest.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/tests/htmlCompressTest.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/tests/jsCompressTest.php create mode 100644 wp-content/plugins/html-compress/lib/html-compress/tests/readme.txt create mode 100644 wp-content/plugins/html-compress/lib/html-compress/tests/testSuite.php create mode 100644 wp-content/plugins/html-compress/readme.txt create mode 100644 wp-content/plugins/html-compress/screenshot-1.png create mode 100644 wp-content/plugins/wp-minify/common.php create mode 100644 wp-content/plugins/wp-minify/css/style-admin.css create mode 100644 wp-content/plugins/wp-minify/http_build_url.php create mode 100644 wp-content/plugins/wp-minify/js/easySlider1.5.js create mode 100644 wp-content/plugins/wp-minify/lang/wp-minify-it_IT.mo create mode 100644 wp-content/plugins/wp-minify/lang/wp-minify-it_IT.po create mode 100644 wp-content/plugins/wp-minify/lang/wp-minify-uk.mo create mode 100644 wp-content/plugins/wp-minify/lang/wp-minify-uk.po create mode 100644 wp-content/plugins/wp-minify/lang/wp-minify.pot create mode 100644 wp-content/plugins/wp-minify/min/.htaccess create mode 100644 wp-content/plugins/wp-minify/min/README.txt create mode 100644 wp-content/plugins/wp-minify/min/builder/_index.js create mode 100644 wp-content/plugins/wp-minify/min/builder/bm.js create mode 100644 wp-content/plugins/wp-minify/min/builder/index.php create mode 100644 wp-content/plugins/wp-minify/min/builder/ocCheck.php create mode 100644 wp-content/plugins/wp-minify/min/builder/rewriteTest.js create mode 100644 wp-content/plugins/wp-minify/min/config.php create mode 100644 wp-content/plugins/wp-minify/min/groupsConfig.php create mode 100644 wp-content/plugins/wp-minify/min/index.php create mode 100644 wp-content/plugins/wp-minify/min/lib/FirePHP.php create mode 100644 wp-content/plugins/wp-minify/min/lib/HTTP/ConditionalGet.php create mode 100644 wp-content/plugins/wp-minify/min/lib/HTTP/Encoder.php create mode 100644 wp-content/plugins/wp-minify/min/lib/JSMin.php create mode 100644 wp-content/plugins/wp-minify/min/lib/JSMinPlus.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Build.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/CSS.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/CSS/Compressor.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/CSS/UriRewriter.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Cache/APC.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Cache/File.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Cache/Memcache.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/CommentPreserver.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Controller/Base.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Controller/Files.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Controller/Groups.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Controller/MinApp.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Controller/Page.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Controller/Version1.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/HTML.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/ImportProcessor.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Lines.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Logger.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Packer.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/Source.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Minify/YUICompressor.php create mode 100644 wp-content/plugins/wp-minify/min/lib/Solar/Dir.php create mode 100644 wp-content/plugins/wp-minify/min/utils.php create mode 100644 wp-content/plugins/wp-minify/options-generic.php create mode 100644 wp-content/plugins/wp-minify/options-sidebar.php create mode 100644 wp-content/plugins/wp-minify/readme.txt create mode 100644 wp-content/plugins/wp-minify/screenshot-1.png create mode 100644 wp-content/plugins/wp-minify/screenshot-2.png create mode 100644 wp-content/plugins/wp-minify/screenshot-3.png create mode 100644 wp-content/plugins/wp-minify/wp-minify.php diff --git a/wp-content/plugins/html-compress/html-compress.php b/wp-content/plugins/html-compress/html-compress.php new file mode 100644 index 0000000..3d30f76 --- /dev/null +++ b/wp-content/plugins/html-compress/html-compress.php @@ -0,0 +1,40 @@ +. +*/ + +include_once 'lib/html-compress/Compress.class.php'; + +function wp_finish($html) +{ + return Compress::Compress($html); +} + + +function wp_start() +{ + ob_start('wp_finish'); +} + +add_action('get_header', 'wp_start'); diff --git a/wp-content/plugins/html-compress/lib/html-compress/Compress.class.php b/wp-content/plugins/html-compress/lib/html-compress/Compress.class.php new file mode 100644 index 0000000..60a6b07 --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/Compress.class.php @@ -0,0 +1,126 @@ + $jsCode) + { + self::$jsCodes[$key] = jsCompress::Compress( $jsCode ); + } + + // css txikitu + foreach(self::$cssCodes as $key => $cssCode) + { + self::$cssCodes[$key] = cssCompress::Compress( $cssCode ); + } + + // kodea batu + $html = self::mergeCode( $html ); + + return $html; + } + + /** + * Batu js eta css guztiak htmlarekin. + * @param string $html + * @return string $html + */ + static public function mergeCode( $html ) + { + // merge js + foreach(self::$jsCodes as $key => $jsCode) + { + $html = str_replace("__JAVASCRIPTCOMPRESS[$key]__", $jsCode, $html); + } + + // merge js + foreach(self::$cssCodes as $key => $cssCode) + { + $html = str_replace("__CSSCOMPRESS[$key]__", $cssCode, $html); + } + + return $html; + } + + /** + * html, css, js banatzen ditu gero procesatzeko. + * + * @param string $html + * @return array + */ + static public function splitCode( $html ) + { + // aurrekoak ustu + self::emptyVars(); + + // javascript kodeak atera. + $html = preg_replace_callback('/(]*>)(.*?)(\<\/script>)/si','self::addJsCode', $html); + + // Css kodeak atera. + $html = preg_replace_callback('/(]*>)(.*?)(<\/style>)/si','self::addCssCode', $html); + + // return split result + return $html; + } + + static private function addJsCode( $js ) + { + $count = count(self::$jsCodes); + self::$jsCodes[] = $js[2]; + + return "{$js[1]}__JAVASCRIPTCOMPRESS[$count]__{$js[3]}"; + } + + static private function addCssCode( $css ) + { + $count = count(self::$cssCodes); + self::$cssCodes[] = $css[2]; + + return "{$css[1]}__CSSCOMPRESS[$count]__{$css[3]}"; + } + + /** + * Hasierako bariableak ustu. + */ + static private function emptyVars() + { + self::$cssCodes = array(); + self::$jsCodes = array(); + } +} \ No newline at end of file diff --git a/wp-content/plugins/html-compress/lib/html-compress/baseCompress.class.php b/wp-content/plugins/html-compress/lib/html-compress/baseCompress.class.php new file mode 100644 index 0000000..9aa14ab --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/baseCompress.class.php @@ -0,0 +1,36 @@ +[ ]+/', '> ', $html); + $html = preg_replace('/[ ]+--).*?-->/si', '', $html); + + return $html; + } +} \ No newline at end of file diff --git a/wp-content/plugins/html-compress/lib/html-compress/jsCompress.class.php b/wp-content/plugins/html-compress/lib/html-compress/jsCompress.class.php new file mode 100644 index 0000000..c1078b4 --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/jsCompress.class.php @@ -0,0 +1,81 @@ + $string) + { + $js = str_replace("__STRINGCOMPRESS[$key]__", $string, $js); + } + + return $js; + } + + static public function delSpace( $js ) + { + // oinarria aprobetsatu + $js = parent::delSpace( $js ); + + // spaces on = ; : , ( ) { } + + $js = preg_replace('/[ \t\n\r]*(=|;|:|,|\(|\)|\{|\}|\+)[ \t\n\r]*/',"$1",$js); + + return $js; + } + + static public function delComments( $js ) + { + // /* */ + $js = preg_replace('/\/\*.*?\*\//ms','',$js); + + // // + $js = preg_replace('/\/\/.*/','',$js); + + return $js; + } +} \ No newline at end of file diff --git a/wp-content/plugins/html-compress/lib/html-compress/tests/CompressTest.php b/wp-content/plugins/html-compress/lib/html-compress/tests/CompressTest.php new file mode 100644 index 0000000..e0c190c --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/tests/CompressTest.php @@ -0,0 +1,103 @@ +html'; + $result = Compress::splitCode($html); + $this->assertEquals($result,'html'); + $this->assertEquals(Compress::$jsCodes[0],'javascript'); + + // css bat + $html = 'html'; + $result = Compress::splitCode($html); + $this->assertEquals($result,'html'); + $this->assertEquals(Compress::$cssCodes[0],'css'); + + // js eta css bat + $html = 'html'; + $result = Compress::splitCode($html); + $this->assertEquals($result,'html'); + $this->assertEquals(Compress::$cssCodes[0],'css'); + $this->assertEquals(Compress::$jsCodes[0],'javascript'); + + // 2 js + $html = 'html'; + $result = Compress::splitCode($html); + $this->assertEquals($result,'html'); + $this->assertEquals(Compress::$jsCodes[0],'javascript'); + $this->assertEquals(Compress::$jsCodes[1],'javascript_2'); + + // 2 css + $html = 'html'; + $result = Compress::splitCode($html); + $this->assertEquals($result,'html'); + $this->assertEquals(Compress::$cssCodes[0],'css'); + $this->assertEquals(Compress::$cssCodes[1],'css_2'); + + // js aukerekin + $html = 'html'; + $result = Compress::splitCode($html); + $this->assertEquals($result,'html'); + $this->assertEquals(Compress::$jsCodes[0],'javascript'); + + // css aukerekin + $html = 'html'; + $result = Compress::splitCode($html); + $this->assertEquals($result,'html'); + $this->assertEquals(Compress::$cssCodes[0],'css'); + } + + function testMergeCode() + { + // batu js bat + compress::$jsCodes = array(); + compress::$jsCodes[] = 'Code A'; + $html_sta = 'html'; + $html_end = 'html'; + $result = Compress::mergeCode($html_sta); + $this->assertEquals($result,$html_end); + + // batu 2 js bat + compress::$jsCodes = array(); + compress::$jsCodes[] = 'Code A'; + compress::$jsCodes[] = 'Code B'; + $html_sta = 'html'; + $html_end = 'html'; + $result = Compress::mergeCode($html_sta); + $this->assertEquals($result,$html_end); + + // batu css bat + compress::$cssCodes = array(); + compress::$cssCodes[] = 'Code A'; + $html_sta = 'html'; + $html_end = 'html'; + $result = Compress::mergeCode($html_sta); + $this->assertEquals($result,$html_end); + + // batu 2 css bat + compress::$cssCodes = array(); + compress::$cssCodes[] = 'Code A'; + compress::$cssCodes[] = 'Code B'; + $html_sta = 'html'; + $html_end = 'html'; + $result = Compress::mergeCode($html_sta); + $this->assertEquals($result,$html_end); + } + + function testCompress() + { + $html_sta = ' '; + $html_end = ''; + $result = compress::Compress($html_sta); + $this->assertEquals($result,$html_end); + + $html_sta = ' '; + $html_end = ''; + $result = compress::Compress($html_sta); + $this->assertEquals($result,$html_end); + } +} \ No newline at end of file diff --git a/wp-content/plugins/html-compress/lib/html-compress/tests/baseCompressTest.php b/wp-content/plugins/html-compress/lib/html-compress/tests/baseCompressTest.php new file mode 100644 index 0000000..dfe2fc0 --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/tests/baseCompressTest.php @@ -0,0 +1,73 @@ +assertEquals($emaitza,$esperotakoa); + + $html = ' a b c d e '; + $esperotakoa = 'a b c d e'; + $emaitza = baseCompress::delSpace($html); + $this->assertEquals($emaitza,$esperotakoa); + + $html = ' a b c d e '; + $esperotakoa = 'a b c d e'; + $emaitza = baseCompress::delSpace($html); + $this->assertEquals($emaitza,$esperotakoa); + } + + /** + * Tabulazioak ezabatu. + */ + public function testDelTab() + { + $html = ' '; + $esperotakoa = ' '; + $emaitza = baseCompress::delTab($html); + $this->assertEquals($emaitza,$esperotakoa); + + $html = '
testu bat
'; + $esperotakoa = '
testu bat
'; + $emaitza = baseCompress::delTab($html); + $this->assertEquals($emaitza,$esperotakoa); + + $html = '
testu bat
'; + $esperotakoa = '
testu bat
'; + $emaitza = baseCompress::delTab($html); + $this->assertEquals($emaitza,$esperotakoa); + } + + /** + * Saltoak ezabatu. + */ + public function testDelNL() + { + $html = <<assertEquals($emaitza,$esperotakoa); + + $html = <<assertEquals($emaitza,$esperotakoa); + } +} \ No newline at end of file diff --git a/wp-content/plugins/html-compress/lib/html-compress/tests/cssCompressTest.php b/wp-content/plugins/html-compress/lib/html-compress/tests/cssCompressTest.php new file mode 100644 index 0000000..78ec4f9 --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/tests/cssCompressTest.php @@ -0,0 +1,41 @@ +assertEquals($css_pro,$css_end); + } + + public function testDelSpace() + { + $css_sta = ' ; '; + $css_end = ';'; + $css_pro = cssCompress::delSpace($css_sta); + $this->assertEquals($css_pro,$css_end); + + $css_sta = ' ( '; + $css_end = '('; + $css_pro = cssCompress::delSpace($css_sta); + $this->assertEquals($css_pro,$css_end); + } + + public function testCompress() + { + $css_sta = <<assertEquals($css_pro,$css_end); + } +} \ No newline at end of file diff --git a/wp-content/plugins/html-compress/lib/html-compress/tests/htmlCompressTest.php b/wp-content/plugins/html-compress/lib/html-compress/tests/htmlCompressTest.php new file mode 100644 index 0000000..4abac13 --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/tests/htmlCompressTest.php @@ -0,0 +1,56 @@ +'; + $esperotakoa = ''; + $emaitza = htmlCompress::delComment($html); + $this->assertEquals($emaitza,$esperotakoa); + + $html = ' b d '; + $esperotakoa = ' b d '; + $emaitza = htmlCompress::delComment($html); + $this->assertEquals($emaitza,$esperotakoa); + + $html = << +HTML; + $esperotakoa = ''; + $emaitza = htmlCompress::delComment($html); + $this->assertEquals($emaitza,$esperotakoa); + } + + /** + * Html ahalik eta txikituen utzi. + */ + public function testCompress() + { + $html = ''; + $emaitza = htmlCompress::compress($html); + $this->assertEquals($emaitza,$html); + + $html = <<This is a heading + +

This is a heading

+ +

This is a heading

+HTML; + $esperotakoa = '

This is a heading

This is a heading

This is a heading

'; + $emaitza = htmlCompress::compress($html); + $this->assertEquals($emaitza,$esperotakoa); + + $html = '| text |'; + $esperotakoa = '| text |'; + $emaitza = htmlCompress::compress($html); + $this->assertEquals($emaitza,$esperotakoa); + } +} \ No newline at end of file diff --git a/wp-content/plugins/html-compress/lib/html-compress/tests/jsCompressTest.php b/wp-content/plugins/html-compress/lib/html-compress/tests/jsCompressTest.php new file mode 100644 index 0000000..08d60b2 --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/tests/jsCompressTest.php @@ -0,0 +1,246 @@ +assertEquals($js_pro,$js_end); + + $arrExpected = array('" string "'); + $this->assertEquals(jsCompress::$jsStrings,$arrExpected); + + $js_sta = ' a = " string " b = " string2 "'; + $js_end = ' a = __STRINGCOMPRESS[0]__ b = __STRINGCOMPRESS[1]__'; + $js_pro = jsCompress::outStrings($js_sta); + $this->assertEquals($js_pro,$js_end); + + $arrExpected = array('" string "','" string2 "'); + $this->assertEquals(jsCompress::$jsStrings,$arrExpected); + + $js_sta = ' a = \' string \''; + $js_end = ' a = __STRINGCOMPRESS[0]__'; + $js_pro = jsCompress::outStrings($js_sta); + $this->assertEquals($js_pro,$js_end); + + $arrExpected = array('\' string \''); + $this->assertEquals(jsCompress::$jsStrings,$arrExpected); + + $js_sta = ' a = \' string \' b = \' string2 \''; + $js_end = ' a = __STRINGCOMPRESS[0]__ b = __STRINGCOMPRESS[1]__'; + $js_pro = jsCompress::outStrings($js_sta); + $this->assertEquals($js_pro,$js_end); + + $arrExpected = array('\' string \'','\' string2 \''); + $this->assertEquals(jsCompress::$jsStrings,$arrExpected); + + $js_sta = ' a = " string " b = \' string2 \''; + $js_end = ' a = __STRINGCOMPRESS[0]__ b = __STRINGCOMPRESS[1]__'; + $js_pro = jsCompress::outStrings($js_sta); + $this->assertEquals($js_pro,$js_end); + + $arrExpected = array('" string "','\' string2 \''); + $this->assertEquals(jsCompress::$jsStrings,$arrExpected); + + # issue 1 + $js_sta = ' a = ""'; + $js_end = ' a = __STRINGCOMPRESS[0]__'; + $js_pro = jsCompress::outStrings($js_sta); + $this->assertEquals($js_pro,$js_end); + + # issue 1 + $js_sta = ' a = \'\''; + $js_end = ' a = __STRINGCOMPRESS[0]__'; + $js_pro = jsCompress::outStrings($js_sta); + $this->assertEquals($js_pro,$js_end); + } + + public function testInStrings() + { + // testuak berrezarri + $js_sta = ' a = " string " b = \' string2 \''; + $js = jsCompress::outStrings($js_sta); + $js_end = jsCompress::inStrings($js); + $this->assertEquals($js_sta,$js_end); + } + + public function testDelSpace() + { + // utsune bat baino gehiago + $js_sta = ' '; + $js_end = ''; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + + // = en atze eta aurrean ez da behar utsunerik + $js_sta = 'a =b'; + $js_end = 'a=b'; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = 'a= b'; + $js_end = 'a=b'; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = 'a = b + c'; + $js_end = 'a=b+c'; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = 'a = b; c = d;'; + $js_end = 'a=b;c=d;'; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = 'a = b ;c = d;'; + $js_end = 'a=b;c=d;'; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = 'array( a, b, c, d);'; + $js_end = 'array(a,b,c,d);'; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = 'if (elem) { action }'; + $js_end = 'if(elem){action}'; + $js_pro = jsCompress::delSpace($js_sta); + $this->assertEquals($js_pro,$js_end); + } + + public function testDelComments() + { + $js_sta = '/* comment */'; + $js_end = ''; + $js_pro = jsCompress::delComments($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = ' string /* comment */'; + $js_end = ' string '; + $js_pro = jsCompress::delComments($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = '/* comment */ string '; + $js_end = ' string '; + $js_pro = jsCompress::delComments($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = <<assertEquals($js_pro,$js_end); + + $js_sta = '// comment'; + $js_end = ''; + $js_pro = jsCompress::delComments($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = ' string // comment'; + $js_end = ' string '; + $js_pro = jsCompress::delComments($js_sta); + $this->assertEquals($js_pro,$js_end); + + $js_sta = <<assertEquals($js_pro,$js_end); + + $js_sta = <<assertEquals($js_pro,$js_end); + + $js_sta = <<assertEquals($js_pro,$js_end); + + $js_sta = <<assertEquals($js_pro,$js_end); + } + + public function testCompress() + { + $js_sta = <<assertEquals($js_pro,$js_end); + + // Issue 1: https://code.google.com/p/html-compress/issues/detail?id=1 + $js_sta = <<assertEquals($js_pro,$js_end); + + // Issue 2: https://code.google.com/p/html-compress/issues/detail?id=2 + $js_sta = << */ +JS; + $js_end = 'var emailL10n={ajax_url:"http://zuzeu/wp-content/plugins/wp-email/wp-email.php",max_allowed:"5"};'; + $js_pro = jsCompress::compress($js_sta); + $this->assertEquals($js_pro,$js_end); + + } + +} diff --git a/wp-content/plugins/html-compress/lib/html-compress/tests/readme.txt b/wp-content/plugins/html-compress/lib/html-compress/tests/readme.txt new file mode 100644 index 0000000..6bdb17c --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/tests/readme.txt @@ -0,0 +1,5 @@ +Launch testSuite +$ phpunit testSuite.class.php + +Launch one test +$ phpunit baseCompressTest.class.php diff --git a/wp-content/plugins/html-compress/lib/html-compress/tests/testSuite.php b/wp-content/plugins/html-compress/lib/html-compress/tests/testSuite.php new file mode 100644 index 0000000..1c56109 --- /dev/null +++ b/wp-content/plugins/html-compress/lib/html-compress/tests/testSuite.php @@ -0,0 +1,22 @@ +addTestSuite('baseCompressTest'); + $suite->addTestSuite('htmlCompressTest'); + $suite->addTestSuite('cssCompressTest'); + $suite->addTestSuite('jsCompressTest'); + $suite->addTestSuite('CompressTest'); + + return $suite; + } +} diff --git a/wp-content/plugins/html-compress/readme.txt b/wp-content/plugins/html-compress/readme.txt new file mode 100644 index 0000000..fecc663 --- /dev/null +++ b/wp-content/plugins/html-compress/readme.txt @@ -0,0 +1,31 @@ +=== Plugin Name === +Contributors: kakrrikas +Tags: html, compress, minify, css, javascript +Requires at least: 3.0 +Tested up to: 3.0 +Stable tag: 0.1 + +Reduce html, css and javascript size on web pages processing the code. + +== Description == + +Clear html of web page. Reduce space, tab,... on all source content, including in line css and javascript. + +== Installation == + +Use the automatic plugin installer of your WordPress admin, or do it manually: + +1. Upload the html-compress directory to the /wp-content/plugins/ directory +2. Activate the plugin through the 'Plugins' menu in WordPress + +== Screenshots == + +1. html compress source + +== Changelog == + += 0.1 = +* Debug, spaces between tags + += 0.0 = +* First release \ No newline at end of file diff --git a/wp-content/plugins/html-compress/screenshot-1.png b/wp-content/plugins/html-compress/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3cee95aaaddefb59193835ebd86d905667e287 GIT binary patch literal 42343 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 x138(EwT-Z6%*_NsztUOoR_p = $plugin; + } + + // admin methods + + function a_check_version() { + // check WP version + global $wp_version; + if (!empty($wp_version) && is_admin() && + version_compare($wp_version, $this->p->required_wp_version, "<") + ) { + add_action('admin_notices', array($this, 'a_notify_version')); + } + + // check plugin version + $options = get_option($this->p->name); + if ($options && array_key_exists('version', $options) && is_admin() && + version_compare($options['version'], $this->p->version, "<") + ) { + if (method_exists($this->p, 'a_upgrade_options')) { + // run plugin's upgrade options function if it exists + $this->p->a_upgrade_options(); + } elseif (method_exists($this->p->a, 'upgrade_options')) { + // another flavor + $this->p->a->upgrade_options(); + } else { + // else run generic upgrade options function + $this->a_upgrade_options(); + } + } + } + + function a_check_dir_writable($dir, $notify_cb) { + if (is_writable($dir)) { + return true; + } + else { + // error and return false + add_action('admin_notices', $notify_cb); + return false; + } + } + + function a_check_orphan_options($notify_cb) { + $options = get_option($this->p->name); + if (!$options) { + $this->a_upgrade_options(); + } + else { + $default_options = $this->p->a_default_options(); + foreach( $default_options as $key => $value ) { + if ( !array_key_exists($key, $options) ) { + add_action('admin_notices', $notify_cb); + } + } + } + } + + function a_notify($message, $error=false) { + if ( !$error ) { + echo '

'.$message.'

'; + } + else { + echo '

'.$message.'

'; + } + } + + function a_notify_version() { + global $wp_version; + $this->a_notify( + sprintf(__('You are using WordPress version %s.', $this->p->name), $wp_version).' '. + sprintf(__('%s recommends that you use WordPress %s or newer.', $this->p->name), + $this->p->name_proper, + $this->p->required_wp_version).' '. + sprintf(__('%sPlease update!%s', $this->p->name), + '
', ''), + true); + } + + function a_notify_updated() { + $this->a_notify( + sprintf(__('%s options has been updated.', $this->p->name), + $this->p->name_proper)); + } + + function a_notify_upgrade() { + $this->a_notify( + sprintf(__('%s options has been upgraded.', $this->p->name), + $this->p->name_proper)); + } + + function a_notify_reset() { + $this->a_notify( + sprintf(__('%s options has been reset.', $this->p->name), + $this->p->name_proper)); + } + + function a_notify_cache_cleared() { + $this->a_notify( + sprintf(__('%s cache has been cleared.', $this->p->name), + $this->p->name_proper)); + } + + function a_notify_imported() { + $this->a_notify( + sprintf(__('%s options imported.', $this->p->name), + $this->p->name_proper)); + } + + function a_notify_import_failed() { + $this->a_notify( + sprintf(__('%s options import failed!', $this->p->name), + $this->p->name_proper), true); + } + + function a_notify_import_failed_missing() { + $this->a_notify( + sprintf(__('Did not receive any file to be imported. %s options import failed!', $this->p->name), + $this->p->name_proper), true); + } + + function a_notify_import_failed_syntax() { + $this->a_notify( + sprintf(__('Found syntax errors in file being imported. %s options import failed!', $this->p->name), + $this->p->name_proper), true); + } + + function a_upgrade_options() { + $options = get_option($this->p->name); + if ( !$options ) { + add_option($this->p->name, $this->p->a_default_options()); + } + else { + $default_options = $this->p->a_default_options(); + + // upgrade regular options + foreach($default_options as $option_name => $option_value) { + if(!isset($options[$option_name])) { + $options[$option_name] = $option_value; + } + } + $options['version'] = $this->p->version; + // get rid of deprecated options if any + foreach($default_options['deprecated'] as $option_name) { + if(isset($options[$option_name])) { + unset($options[$option_name]); + } + } + update_option($this->p->name, $options); + } + add_action('admin_notices', array($this, 'a_notify_upgrade')); + } + + function a_reset_options() { + $options = get_option($this->p->name); + if ( !$options ) { + add_option($this->p->name, $this->p->a_default_options()); + } + else { + update_option($this->p->name, $this->p->a_default_options()); + } + } + + function valid_syntax($code) { + return @eval('return true;'.$code); + } + + function a_import_options($file_var) { + if (isset($_FILES[$file_var]) && !empty($_FILES[$file_var]['name'])) { + $imported_options = join('', file($_FILES[$file_var]['tmp_name'])); + $code = '$imported_options = '.$imported_options.';'; + if ($this->valid_syntax($code)) { + if (eval($code) === null) { + update_option($this->p->name, $imported_options); + add_action('admin_notices', array($this, 'a_notify_imported')); + } else { + add_action('admin_notices', array($this, 'a_notify_import_failed')); + } + } else { + add_action('admin_notices', array($this, 'a_notify_import_failed_syntax')); + } + } else { + add_action('admin_notices', array($this, 'a_notify_import_failed_missing')); + } + } + + function a_export_options($file_name) { + $content = var_export($this->p->o, true); + header('Cache-Control: public'); + header('Content-Description: File Transfer'); + header('Content-disposition: attachment; filename='.$file_name.'.txt'); + header('Content-Type: text/plain'); + header('Content-Transfer-Encoding: binary'); + header('Content-Length: '. mb_strlen($content, 'latin1')); + echo $content; + exit(); + } + + function a_register_scripts() { + } + + function a_enqueue_scripts() { + } + + function a_register_styles() { + if (file_exists($this->get_plugin_dir().'css/style-admin.css')) { + wp_register_style($this->p->name.'_style_admin', + $this->get_plugin_url().'css/style-admin.css'); + } + } + + function a_enqueue_styles() { + wp_enqueue_style($this->p->name.'_style_admin'); + } + + function a_clear_cache() { + $cache_location = $this->get_plugin_dir().'/cache/'; + + if(!$dh = @opendir($cache_location)) + { + return; + } + while (false !== ($obj = readdir($dh))) + { + if($obj == '.' || $obj == '..') + { + continue; + } + @unlink(trailingslashit($cache_location) . $obj); + } + closedir($dh); + + $this->a_clear_super_cache(); + } + + function a_clear_super_cache() { + if ( function_exists('prune_super_cache') ) { + prune_super_cache(WP_CONTENT_DIR.'/cache/', true ); + } + } + + // other methods + + // Localization support + function load_text_domain() { + // get current language + $locale = get_locale(); + + if(!empty($locale)) { + // locate translation file + $mofile = $this->get_plugin_dir().'lang/'.str_replace('_', '-', $this->p->name).'-'.$locale.'.mo'; + // load translation + if(@file_exists($mofile) && is_readable($mofile)) load_textdomain($this->p->name, $mofile); + } + } + + function get_plugin_dir() { + $path = trailingslashit(trailingslashit(WP_PLUGIN_DIR).plugin_basename(dirname(__FILE__))); + $path = preg_replace('/(\/plugins\/[^\/]+?\/).+\//', '\1', $path); + return $path; + } + + function get_plugin_url() { + $url = trailingslashit(trailingslashit(WP_PLUGIN_URL).plugin_basename(dirname(__FILE__))); + $url = preg_replace('/(\/plugins\/[^\/]+?\/).+\//', '\1', $url); + return $url; + } + + function get_current_page_url() { + $isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"); + $port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443"))); + $port = ($port) ? ':'.$_SERVER["SERVER_PORT"] : ''; + $url = ($isHTTPS ? 'https://' : 'http://').$_SERVER["SERVER_NAME"].$port.$_SERVER["REQUEST_URI"]; + return $url; + } + +} +?> diff --git a/wp-content/plugins/wp-minify/css/style-admin.css b/wp-content/plugins/wp-minify/css/style-admin.css new file mode 100644 index 0000000..5755e8e --- /dev/null +++ b/wp-content/plugins/wp-minify/css/style-admin.css @@ -0,0 +1,12 @@ +.omni_admin_content { + width:1055px; +} + +.omni_admin_main { + background-color:#f6f6f6; + border:1px solid #ccc; + float:left; + margin:10px; + padding:10px; + width:760px; +} diff --git a/wp-content/plugins/wp-minify/http_build_url.php b/wp-content/plugins/wp-minify/http_build_url.php new file mode 100644 index 0000000..4086a01 --- /dev/null +++ b/wp-content/plugins/wp-minify/http_build_url.php @@ -0,0 +1,104 @@ + + *
    + *
  • + *
  • + *
  • + *
  • + *
  • + *
+ * + * + */ + +(function($) { + + $.fn.easySlider = function(options){ + + // default configuration properties + var defaults = { + prevId: 'prevBtn', + prevText: 'Previous', + nextId: 'nextBtn', + nextText: 'Next', + controlsShow: true, + controlsBefore: '', + controlsAfter: '', + controlsFade: true, + firstId: 'firstBtn', + firstText: 'First', + firstShow: false, + lastId: 'lastBtn', + lastText: 'Last', + lastShow: false, + vertical: false, + speed: 800, + auto: false, + pause: 2000, + continuous: false + }; + + var options = $.extend(defaults, options); + + this.each(function() { + var obj = $(this); + var s = $("li", obj).length; + var w = $("li", obj).width(); + var h = $("li", obj).height(); + obj.width(w); + obj.height(h); + obj.css("overflow","hidden"); + var ts = s-1; + var t = 0; + $("ul", obj).css('width',s*w); + if(!options.vertical) $("li", obj).css('float','left'); + + if(options.controlsShow){ + var html = options.controlsBefore; + if(options.firstShow) html += ''+ options.firstText +''; + html += ' '+ options.prevText +''; + html += ' '+ options.nextText +''; + if(options.lastShow) html += ' '+ options.lastText +''; + html += options.controlsAfter; + $(obj).after(html); + }; + + $("a","#"+options.nextId).click(function(){ + animate("next",true); + }); + $("a","#"+options.prevId).click(function(){ + animate("prev",true); + }); + $("a","#"+options.firstId).click(function(){ + animate("first",true); + }); + $("a","#"+options.lastId).click(function(){ + animate("last",true); + }); + + function animate(dir,clicked){ + var ot = t; + switch(dir){ + case "next": + t = (ot>=ts) ? (options.continuous ? 0 : ts) : t+1; + break; + case "prev": + t = (t<=0) ? (options.continuous ? ts : 0) : t-1; + break; + case "first": + t = 0; + break; + case "last": + t = ts; + break; + default: + break; + }; + + var diff = Math.abs(ot-t); + var speed = diff*options.speed; + if(!options.vertical) { + p = (t*w*-1); + $("ul",obj).animate( + { marginLeft: p }, + speed + ); + } else { + p = (t*h*-1); + $("ul",obj).animate( + { marginTop: p }, + speed + ); + }; + + if(!options.continuous && options.controlsFade){ + if(t==ts){ + $("a","#"+options.nextId).hide(); + $("a","#"+options.lastId).hide(); + } else { + $("a","#"+options.nextId).show(); + $("a","#"+options.lastId).show(); + }; + if(t==0){ + $("a","#"+options.prevId).hide(); + $("a","#"+options.firstId).hide(); + } else { + $("a","#"+options.prevId).show(); + $("a","#"+options.firstId).show(); + }; + }; + + if(clicked) clearTimeout(timeout); + if(options.auto && dir=="next" && !clicked){; + timeout = setTimeout(function(){ + animate("next",false); + },diff*options.speed+options.pause); + }; + + }; + // init + var timeout; + if(options.auto){; + timeout = setTimeout(function(){ + animate("next",false); + },options.pause); + }; + + if(!options.continuous && options.controlsFade){ + $("a","#"+options.prevId).hide(); + $("a","#"+options.firstId).hide(); + }; + + }); + + }; + +})(jQuery); + + + diff --git a/wp-content/plugins/wp-minify/lang/wp-minify-it_IT.mo b/wp-content/plugins/wp-minify/lang/wp-minify-it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..845693c85a9433a009e72d47f2457263a650d6ad GIT binary patch literal 7152 zcmb`LUyNK;9mfxXB8vioA|UGNDs~H<+1>KTvTZHf-7Q_*ZP)Is1^H9Y+&MFI=$(7V z`)8IZm>7L9J`kTIhQuiHH1mrg$CZeLL@eU7^$__}eS_kJrrGmAVbwSK=}#>&}871fKzK z1)m4s3w|G*2Y(LU2>ug%9K7xwN-cvScmVt!_!#&nQ1&lgtrY*%qx|<_FaWOszXTow zp9K$suYj`uns+MoZtyVpe()ji7O)9^2z(m61AHF*DEJfbPVmp5$ae#We;GUm-VeSE zu7FofDfK?^p%Om}?&tdelyxtHa?kHT(f9A5=yC0}O5F!`L9x#_!Rx^vf$QKez{B8e z?^5a`;2H2e;M1Vo_bfOKz6d@5{tT4!uSQ8Z=XP)r+z(y{MxgBfe2HHL<=huQk@KhE zIq-Eb0MD^W?DVdO zK?4d8p9V$F=fD~8$DqjfDtG|A31f;J$H5oCFM#Xd^vz1;U>_8|yb8*>{|5JhxA3Fb z_W@Au`6BoM@EhP0;19~@x8QuS*JnWS%Mg4R{0ev<_($+A@Kz3&{VO0_l>tTGAt-V1 z?eh26Kso1i@E~|Smtz8T0>rfHu@WP&#`iCPtKfIR5c~)DBxtz|Rn#jW6j!f-xYzFi zypD3e$ToW2!w1ZxpqiIq9=xBo@B=l}mArAEk8{yQ^piWpFLmDX+EakHJ)$UGeiyEY zzX=b|r?-LP_nj}%^-kWx1(91`;?I4&2^r5pz;g-{Dd_3_FR?8zi5Xn4W_goJybV7N z&heI)#9Z|yu{nB)U*vU&_f`JWL||icH%PA3~gPPcEIuo?`2ADGC&kr;)UwDH1!VV(hL%e4=WG1 zPxU!I)ux@X&9ZmspI|1n6!)4UQXzFS&vYyH0u%zPW!ua<9a*{TTK)loS~sxTL_@zz zRBc*4cDDCp$+#WdSaxYYG($bTVLH}3vggj*mTnI9nT^ua(;5?<(+;PiN;{5`SuGbb zwJv*qoh?BQ-7;JnM`|S!V`}k__b6_z{(hpdzP9Uwhs?li28ruuyFT_tD$mk!gv*gO zGGSp(wUQ)pvY?mZJS=S2wpq}{a;-94w@$CAmC>FH$m61dJTAh#g)i!pr4_Npbi34! z#AuUrye&K}`-WH>AF6GHccEFM3-bmh%&qp3)gb~*zfZu*Vu=dB3yJmgcE47LGz-ig zZ66UK=Ic+U`{ly{`B1Od{g;z`nXaqjaS}ioB5or3tSCG_7z&+eG&VNHjKzmOBuUws zBSJdFlTT?Y22F(=auKwHn3u)82W?~%{IV2BZP&?@!uuy2;knovm?(gSrwY=l)xrR+ zI3g2@vt~(4MX;G>OoU`&s(zSbI5knH3?Ynld4azcqq{!tv&Fh(hY=^&O_cj2v?MuP z`vjrdVqn`(}%tCMk5yQCH;Nn(}U$l?pW z>pUV&ranK9((=e|MmO__I3d}O0}2|=)&n+(z^OVFk)$af?L5@3t*5I7yf_f2#Y%Fd z4bIt?+6WC~EViIk#f3twBIBHv5~&y0*2c8h?8e&{lg0nqE0TN3&a9ind8dnO6T5L@ zLv6;rBH6+0QN1A~En!XGhQKrZm=8@f@};6+7KP6jTS~-c-uET8!n-}Hv2D#ccF#8Q zNYeAx=~e1yq_?{c)1BFAXtm(N0$3Z6!XuK0c7K`{eMlU8yTu@6@$y z4-A&;+dwL@-&Eu&jzXd4krV^>P1cpOC(C%^i?%#y6Ty;vJbAQaKqT?0wXjlMxjH#e z`jJX<^DWiv{DHggG0mVQiHtpIW=%_|Sy_nxFCz=8UW}<+)Q(k3Gejq(Hj?;B>V9pt zRr_>dvW1EvunJ8;=u8w(owh=O+Ire?t=h4?lhzvXf}Ywq)u=5c)~B=DGWlvjADEk; zug%?Co4a2hIIwW{J$KE`&&{#0cG?b{c%@u7wPw<+)}XCOLqqGapdaL>$mwNAOBL%G zbIxdPb4?TP(}&AXkDBc9PLE#i(N>&2PD}R*&WSoXxw_V{rnmEyXGTZVBb!aFudc65 zG@Y-{O_7i@s&uU}>?3LmMBcVdYAaC?w;=w4KG<~G z)Wfxn*tT3&JBHJR3=6tmpPl^tNju!8(@fV~nl0$FXAhmVlZPV>7W8Ui@5v)-ca$YV zo-`KM9+~{UNpl$3r9#F9oo8)?91F2Y;tskSh*6tEkSW?(9h$P}zw{lQ(v}#V4)Rz& z_)eU17WdEN9;ee7^UD&e={yo7c2bJoV40ysi)lPAbCJXX*XJ~}Y%32oWg#^pgzr%+ zA|Z2|P0-PI_?0IWVT*2WBt+_TVgeXK1vNU{n`bU`=g-rryB$scg_10mx=734$TN&k zxs8?=Jt^f8Ch}UyrP!*l9O;TVfNYE*wBEE%2R0!qaOEHlE#cQsVro5~j;hsSr*sqJ z!WI{0VW^FkE}uqSI(~wIcuif0Sj^&m>bNu?(!HRVO?{)r(Je2J)B?KN^Q9SQas-vZ zA#oi;E?*NCB$*Wl6s>64JL>1Dm=$BF(oj1Ol^b#hatMvC&b1w(HV?uI)9Z>DDagdkY zmRul}N_1uf8MXW@uS?G#?k)ZQX8c*lUo@o=wk?XSc45)vzK@xbHXJaiH}{Smw3ZvzUWy>NfNnYN+9`p zCesH9xok+QnUox|W#W)&VNAVpw@|R`{ISL^45as#11n9=L+NKZ%F3O62=#>ch?c;qKbKJ z%qY5L-$EA?3&G3L#!AVPJ4b)MtmBj{u}vnDGS5W(p^R!ti&f!7siJ2CPQv*k\n" +"Language-Team: Gianni Diurno | gidibao.net\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Language: Italian\n" +"X-Poedit-Country: ITALY\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-SearchPath-0: .\n" + +#: common.php:77 +#, php-format +msgid "You are using WordPress version %s." +msgstr "Stai utilizzando la versione %s di WordPress." + +#: common.php:78 +#, php-format +msgid "%s recommends that you use WordPress %s or newer." +msgstr "%s si raccomanda l'utilizzo di WordPress %s o superiore." + +#: common.php:81 +#, php-format +msgid "%sPlease update!%s" +msgstr "%sAggiorna!%s" + +#: common.php:88 +#, php-format +msgid "%s options has been updated." +msgstr "%s le opzioni sono state aggiornate." + +#: common.php:94 +#, php-format +msgid "%s options has been upgraded." +msgstr "%s le opzioni sono state aggiornate alla superiore." + +#: common.php:100 +#, php-format +msgid "%s options has been reset." +msgstr "%s le opzioni sono state ripristinate." + +#: common.php:106 +#, php-format +msgid "%s cache has been cleared." +msgstr "%s la cache é stata svuotata." + +#: common.php:112 +#, php-format +msgid "%s options imported." +msgstr "%s le opzioni sono state importate." + +#: common.php:118 +#, php-format +msgid "%s options import failed!" +msgstr "%s la importazione delle opzioni é fallita!" + +#: common.php:124 +#, php-format +msgid "Did not receive any file to be imported. %s options import failed!" +msgstr "Non é stato ricevuto alcun file che possa essere importato. %s l'importazione delle opzioni é fallita!" + +#: common.php:130 +#, php-format +msgid "Found syntax errors in file being imported. %s options import failed!" +msgstr "E' stato riscontrato un errore di sintassi nel file di importazione. %s l'importazione delle opzioni non é avvenuta!" + +#: options-generic.php:3 +msgid "All of options will return to default settings. Are you sure you want to reset all settings?" +msgstr "Tutte le opzioni ritorneranno alla impostazioni predefinite. Sei certo di volere procedere?" + +#: options-generic.php:18 +#: options-generic.php:71 +msgid "Show Advanced Options" +msgstr "Mostra opzioni avanzate" + +#: options-generic.php:35 +#: options-generic.php:66 +msgid "Hide Advanced Options" +msgstr "Nascondi opzioni avanzate" + +#: options-generic.php:88 +msgid "Support this plugin!" +msgstr "Sostieni questo plugin!" + +#: options-generic.php:89 +msgid "Display \"Page optimized by WP Minify\" link in the footer" +msgstr "Mostra nel footer il link \"Ottimizzazione pagina via WP Minify\"" + +#: options-generic.php:90 +msgid "Do not display \"Page optimized by WP Minify\" link." +msgstr "Non mostrare il link \"Ottimizzazione pagina via WP Minify\"." + +#: options-generic.php:91 +msgid "I will donate and/or write about this plugin" +msgstr "Ho scritto e/o donato per questo plugin" + +#: options-generic.php:100 +#: wp-minify.php:370 +msgid "General Configuration" +msgstr "Configurazione generale" + +#: options-generic.php:101 +msgid "Enable JavaScript Minification" +msgstr "Attiva minimizzazione per i JavaScript" + +#: options-generic.php:102 +msgid "Enable CSS Minification" +msgstr "Attiva minimizzazione CSS" + +#: options-generic.php:103 +msgid "Enable HTML Minification" +msgstr "Attiva minimizzazione HTML" + +#: options-generic.php:111 +msgid "Debugging" +msgstr "Debugging" + +#: options-generic.php:112 +msgid "Combine files but do not minify" +msgstr "Unire i file senza minimizzarli" + +#: options-generic.php:113 +msgid "Show minify errors through FirePHP" +msgstr "Mostra errori minimizzazione via FirePHP" + +#: options-generic.php:122 +msgid "Local Files Minification" +msgstr "Minimizzazione file locali" + +#: options-generic.php:123 +msgid "JavaScript files to exclude from minify (line delimited)." +msgstr "File JavaScript da escludere dalla minimizzazione (uno per riga)." + +#: options-generic.php:124 +msgid "CSS files to exclude from minify (line delimited)." +msgstr "File CSS da escludere dalla minimizzazione (uno per riga)." + +#: options-generic.php:125 +msgid "URIs on which WP-Minify parsing will be disabled (line delimited)" +msgstr "URI da escludere dal parsing di WP-Minify (uno per riga)" + +#: options-generic.php:134 +msgid "Non-Local Files Minification" +msgstr "Minimizzazione file non locali" + +#: options-generic.php:135 +msgid "Enable minification on external files" +msgstr "Attiva minimizzazione per i file esterni" + +#: options-generic.php:136 +msgid "Not recommended unless you want to exclude a bunch of external .js/.css files" +msgstr "Non consigliabile a patto che tu non voglia escludere un gruppo di file .js/.css esterni" + +#: options-generic.php:137 +msgid "External JavaScript files to include into minify." +msgstr "File JavaScript esterni da includere alla minimizzazione." + +#: options-generic.php:138 +#: options-generic.php:141 +msgid "Only useful if \"Minification on external files\" is unchecked" +msgstr "Utile solo se \"Minimizzazione file esterni\" non attiva" + +#: options-generic.php:139 +#: options-generic.php:142 +#: options-generic.php:166 +msgid "more info" +msgstr "ulteriori informazioni" + +#: options-generic.php:140 +msgid "External CSS files to include into minify." +msgstr "File CSS esterni da includere alla minimizzazione." + +#: options-generic.php:150 +msgid "Caching" +msgstr "Cache" + +#: options-generic.php:151 +msgid "Cache expires after every" +msgstr "La cache scade ogni " + +#: options-generic.php:152 +msgid "seconds" +msgstr " secondi" + +#: options-generic.php:153 +msgid "Manually Clear Cache" +msgstr "Svuota manualmente la cache" + +#: options-generic.php:161 +msgid "Tweaking/Tuning" +msgstr "Tweaking/Tuning" + +#: options-generic.php:162 +msgid "Use \"pretty\" URL\"" +msgstr "Usa \"pretty\" URL\"" + +#: options-generic.php:163 +msgid "i.e. use \"wp-minify/cache/1234abcd.js\" instead of \"wp-minify/min/?f=file1.js,file2.js,...,fileN.js\"" +msgstr "ad esempio usa \"wp-minify/cache/1234abcd.js\" al posto di \"wp-minify/min/?f=file1.js,file2.js,...,fileN.js\"" + +#: options-generic.php:164 +msgid "Place Minified JavaScript in footer" +msgstr "Posiziona il Minified JavaScript nel footer" + +#: options-generic.php:165 +msgid "Not recommended" +msgstr "Non consigliato" + +#: options-generic.php:172 +msgid "Force all JavaScript/CSS calls to be HTTPS on HTTPS pages" +msgstr "Imponi a tutte le chiamate JavaScript/CSS di essere HTTPS per le pagine HTTPS" + +#: options-generic.php:179 +msgid "Automatically set your Minify base per siteurl setting (recommended)" +msgstr "Imposta in automatico Minify a url del sito (consigliato)" + +#: options-generic.php:180 +msgid "Extra arguments to pass to minify engine. This value will get append to calls to URL \"wp-minify/min/?f=file1.js,file2.js,...,fileN.js\"." +msgstr "Argomenti extra da veicolare nel motore di minimizzazione. Questo valore verrà aggiunto alle chiamate all'URL \"wp-minify/min/?f=file1.js,file2.js,...,fileN.js\"." + +#: options-generic.php:181 +msgid "e.g. You can specify this value to be b=somepath to specify the base path for all files passed into Minify." +msgstr "ad es: specifica il valore b=somepath per definire il percorso di base per tutti i file veicolati in Minify." + +#: options-generic.php:192 +msgid "Update Options" +msgstr "Aggiorna le opzioni" + +#: options-generic.php:193 +msgid "Reset ALL Options" +msgstr "Ripristina TUTTE le opzioni" + +#: wp-minify.php:331 +msgid "Cache directory is not writable. Please grant your server write permissions to the directory" +msgstr "La cartella Cache non é scrivibile. Apporta le modifiche ai permessi chmod del file" + +#: wp-minify.php:339 +msgid "Minify Engine config.php is not writable. Please grant your server write permissions to file" +msgstr "Il Minify Engine config.php non é scrivibile. Apporta le modifiche ai permessi chmod del file" + +#: wp-minify.php:346 +msgid "Some option settings are missing (possibly from plugin upgrade)." +msgstr "Mancano alcune opzioni di impostazione (causa aggiornamento plugin)." + +#: wp-minify.php:350 +msgid "Minify Engine config.php was configured automatically." +msgstr "Il Minify Engine config.php é stato configurato automaticamente." + +#: wp-minify.php:369 +msgid "WP Minify Options" +msgstr "Opzioni WP Minify" + +#: wp-minify.php:371 +msgid "Documentation" +msgstr "Documentazione" + +#: wp-minify.php:418 +msgid "Error: Could not fetch and cache URL" +msgstr "Errore: impossibile elaborazione e cache URL" + +#: wp-minify.php:419 +msgid "You might need to exclude this file in WP Minify options." +msgstr "Potrebbe essere necessario escludere questo file nelle opzioni WP Minify." + +#~ msgid "Debug mode" +#~ msgstr "Modalità debug" diff --git a/wp-content/plugins/wp-minify/lang/wp-minify-uk.mo b/wp-content/plugins/wp-minify/lang/wp-minify-uk.mo new file mode 100644 index 0000000000000000000000000000000000000000..2b3fb46ab0634b35a8a1ff89845726064b5c0921 GIT binary patch literal 7280 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 LSWazxP+0!~H(L;7 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-minify/lang/wp-minify-uk.po b/wp-content/plugins/wp-minify/lang/wp-minify-uk.po new file mode 100644 index 0000000..e493779 --- /dev/null +++ b/wp-content/plugins/wp-minify/lang/wp-minify-uk.po @@ -0,0 +1,286 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP-minify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-04-24 22:14-0800\n" +"PO-Revision-Date: \n" +"Last-Translator: Jurko Chervony \n" +"Language-Team: UA Wordpress \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Ukrainian\n" +"X-Poedit-Country: UKRAINE\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: common.php:77 +#, php-format +msgid "You are using WordPress version %s." +msgstr "Ви використовуєте WordPress версії %s." + +#: common.php:78 +#, php-format +msgid "%s recommends that you use WordPress %s or newer." +msgstr "%s рекомендує використовувати WordPress %s або більш пізньої версії." + +#: common.php:81 +#, php-format +msgid "%sPlease update!%s" +msgstr "%sБудь ласка, оновіть!%s" + +#: common.php:88 +#, php-format +msgid "%s options has been updated." +msgstr "Опції %s оновлено" + +#: common.php:94 +#, php-format +msgid "%s options has been upgraded." +msgstr "Опції %s оновлено." + +#: common.php:100 +#, php-format +msgid "%s options has been reset." +msgstr "Опції %s скинуто." + +#: common.php:106 +#, php-format +msgid "%s cache has been cleared." +msgstr "Кеш %s очищено." + +#: common.php:112 +#, php-format +msgid "%s options imported." +msgstr "Опції %s імпортовано." + +#: common.php:118 +#, php-format +msgid "%s options import failed!" +msgstr "Імпортування опції %s невдале!" + +#: common.php:124 +#, php-format +msgid "Did not receive any file to be imported. %s options import failed!" +msgstr "Неможливо отримати доступ до файлу. %s опції імпортувати не вдалося!" + +#: common.php:130 +#, php-format +msgid "Found syntax errors in file being imported. %s options import failed!" +msgstr "Знайдено синтаксичні помилки у файлі імпорту. %s параметри імпортувати не вдалося!" + +#: options-generic.php:3 +msgid "All of options will return to default settings. Are you sure you want to reset all settings?" +msgstr "Усі налаштування буде видалено. Ви справді хочете повернутися до стандартних налаштувань?" + +#: options-generic.php:18 +#: options-generic.php:71 +msgid "Show Advanced Options" +msgstr "Показати розширені опції" + +#: options-generic.php:35 +#: options-generic.php:66 +msgid "Hide Advanced Options" +msgstr "Сховати розширені опції" + +#: options-generic.php:88 +msgid "Support this plugin!" +msgstr "Підтримайте цей плаґін!" + +#: options-generic.php:89 +msgid "Display \"Page optimized by WP Minify\" link in the footer" +msgstr "Показувати в підвалі «Page optimized by WP Minify»" + +#: options-generic.php:90 +msgid "Do not display \"Page optimized by WP Minify\" link." +msgstr "Не показувати «Page optimized by WP Minify»" + +#: options-generic.php:91 +msgid "I will donate and/or write about this plugin" +msgstr "Я хочу зробити благодійний внесок чи написати про плаґін" + +#: options-generic.php:100 +#: wp-minify.php:370 +msgid "General Configuration" +msgstr "Загальні опції" + +#: options-generic.php:101 +msgid "Enable JavaScript Minification" +msgstr "Включити мінімізацію JavaScript" + +#: options-generic.php:102 +msgid "Enable CSS Minification" +msgstr "Включити мінімізацію CSS" + +#: options-generic.php:103 +msgid "Enable HTML Minification" +msgstr "Включити мінімізацію HTML" + +#: options-generic.php:112 +msgid "Debugging" +msgstr "Режим відлагодження" + +#: options-generic.php:113 +msgid "Don't use \"pretty\" URL\"" +msgstr "Не використовувати «гарні» URL" + +#: options-generic.php:114 +msgid "Combine files but do not minify" +msgstr "Об’єднати файли, але не мінімізувати" + +#: options-generic.php:115 +msgid "Show minify errors through FirePHP" +msgstr "Показувати помилки мінімізації у FirePHP" + +#: options-generic.php:124 +msgid "Local Files Minification" +msgstr "Мінімізація локальних файлів" + +#: options-generic.php:125 +msgid "JavaScript files to exclude from minify (line delimited)." +msgstr "Файли Javascript для виключення (у кожному рядку по файлу)." + +#: options-generic.php:126 +msgid "CSS files to exclude from minify (line delimited)." +msgstr "CSS файли для виключення (у кожному рядку по файлу)." + +#: options-generic.php:127 +msgid "URIs on which WP-Minify parsing will be disabled (line delimited)" +msgstr "Адреси URI, на яких WP-Minify буде відключено (у кожному рядку по файлу)" + +#: options-generic.php:136 +msgid "Non-Local Files Minification" +msgstr "Мінімізація НЕ локальних файлів" + +#: options-generic.php:137 +msgid "Enable minification on external files" +msgstr "Включити мінімізацію сторонніх файлів" + +#: options-generic.php:138 +msgid "Not recommended unless you want to exclude a bunch of external .js/.css files" +msgstr "Не рекомендується, якщо ви хочете виключити купу зовнішніх .js /.css файлів" + +#: options-generic.php:139 +msgid "External JavaScript files to include into minify." +msgstr "Сторонні файли JavaScript для включення в мінімізацію." + +#: options-generic.php:140 +#: options-generic.php:143 +msgid "Only useful if \"Minification on external files\" is unchecked" +msgstr "Має сенс тільки тоді, коли «Включити мінімізацію сторонніх файлів» НЕ увімкнено" + +#: options-generic.php:141 +#: options-generic.php:144 +#: options-generic.php:164 +msgid "more info" +msgstr "більше інформації" + +#: options-generic.php:142 +msgid "External CSS files to include into minify." +msgstr "Зовнішні CSS-файли, які будуть включені в мінімізацію." + +#: options-generic.php:151 +msgid "Caching" +msgstr "Кешування" + +#: options-generic.php:152 +msgid "Cache expires after every" +msgstr "Видаляти кеш кожні" + +#: options-generic.php:153 +msgid "seconds" +msgstr "секунд" + +#: options-generic.php:154 +msgid "Manually Clear Cache" +msgstr "Очистити кеш вручну" + +#: options-generic.php:161 +msgid "Tweaking/Tuning" +msgstr "Тонка настройка/Тюнінґ" + +#: options-generic.php:162 +msgid "Place Minified JavaScript in footer" +msgstr "Розмістити мінімізовані файли JavaScript у підвалі" + +#: options-generic.php:163 +msgid "Not recommended" +msgstr "Не рекомендовано" + +#: options-generic.php:170 +msgid "Force all JavaScript/CSS calls to be HTTPS on HTTPS pages" +msgstr "" + +#: options-generic.php:177 +msgid "Automatically set your Minify base per siteurl setting (recommended)" +msgstr "" + +#: options-generic.php:178 +msgid "Extra arguments to pass to minify engine. This value will get append to calls to URL \"wp-minify/min/?f=file1.js,file2.js,...,fileN.js\"." +msgstr "" + +#: options-generic.php:179 +msgid "e.g. You can specify this value to be b=somepath to specify the base path for all files passed into Minify." +msgstr "" + +#: options-generic.php:190 +msgid "Update Options" +msgstr "Оновити опції" + +#: options-generic.php:191 +msgid "Reset ALL Options" +msgstr "Скинути ВСІ опції" + +#: wp-minify.php:331 +msgid "Cache directory is not writable. Please grant your server write permissions to the directory" +msgstr "Директорія кешу не має прав на запис. Поставте права на запис." + +#: wp-minify.php:339 +msgid "Minify Engine config.php is not writable. Please grant your server write permissions to file" +msgstr "Файл налаштувань config.php не має прав на запис. Будь ласка, надайте права на запис" + +#: wp-minify.php:346 +msgid "Some option settings are missing (possibly from plugin upgrade)." +msgstr "Деякі параметри налаштування відсутні (можливо, через оновлення плаґіну)." + +#: wp-minify.php:350 +msgid "Minify Engine config.php was configured automatically." +msgstr "Файл config.php налаштовано автоматично." + +#: wp-minify.php:369 +msgid "WP Minify Options" +msgstr "Опції WP Minify" + +#: wp-minify.php:371 +msgid "Documentation" +msgstr "Документація" + +#: wp-minify.php:418 +msgid "Error: Could not fetch and cache URL" +msgstr "Помилка: не вдалося отримати і закешувати URL" + +#: wp-minify.php:419 +msgid "You might need to exclude this file in WP Minify options." +msgstr "Вам може знадобитися виключити цей файл в опціях WP Minify." + +#~ msgid "Debug mode" +#~ msgstr "Режим розробника" + +#~ msgid "" +#~ "WordPress path from web root (e.g. Use \"blog/wordpress\" if your blog is " +#~ "installed under \"http://example.com/blog/wordpress\". Leave empty if " +#~ "your blog is installed in the web root.)" +#~ msgstr "" +#~ "Шлях до теки WordPress (наприклад, використайте \"blog/wordpress\", якщо " +#~ "Ваш сайт розміщено за адресою \"http://example.com/blog/wordpress\". " +#~ "Нічого не вказуйте, якщо сайт розміщено у кореневій теці.)" + +#~ msgid "Additional Javascript files to minify (line delimited)" +#~ msgstr "" +#~ "Додаткові файли Javascript для мінімізації (у кожному рядку по файлу)" + +#~ msgid "Additional CSS files to minify (line delimited)" +#~ msgstr "Додаткові файли CSS для мінімізації (у кожному рядку по файлу)" + +#~ msgid "Reactivate" +#~ msgstr "Повторно активувати" diff --git a/wp-content/plugins/wp-minify/lang/wp-minify.pot b/wp-content/plugins/wp-minify/lang/wp-minify.pot new file mode 100644 index 0000000..d8edad3 --- /dev/null +++ b/wp-content/plugins/wp-minify/lang/wp-minify.pot @@ -0,0 +1,264 @@ +msgid "" +msgstr "" +"Project-Id-Version: wp_minify\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-04-24 22:14-0800\n" +"PO-Revision-Date: \n" +"Last-Translator: Thaya Kareeson \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Basepath: ../\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-SearchPath-0: .\n" + +#: common.php:77 +#, php-format +msgid "You are using WordPress version %s." +msgstr "" + +#: common.php:78 +#, php-format +msgid "%s recommends that you use WordPress %s or newer." +msgstr "" + +#: common.php:81 +#, php-format +msgid "%sPlease update!%s" +msgstr "" + +#: common.php:88 +#, php-format +msgid "%s options has been updated." +msgstr "" + +#: common.php:94 +#, php-format +msgid "%s options has been upgraded." +msgstr "" + +#: common.php:100 +#, php-format +msgid "%s options has been reset." +msgstr "" + +#: common.php:106 +#, php-format +msgid "%s cache has been cleared." +msgstr "" + +#: common.php:112 +#, php-format +msgid "%s options imported." +msgstr "" + +#: common.php:118 +#, php-format +msgid "%s options import failed!" +msgstr "" + +#: common.php:124 +#, php-format +msgid "Did not receive any file to be imported. %s options import failed!" +msgstr "" + +#: common.php:130 +#, php-format +msgid "Found syntax errors in file being imported. %s options import failed!" +msgstr "" + +#: options-generic.php:3 +msgid "All of options will return to default settings. Are you sure you want to reset all settings?" +msgstr "" + +#: options-generic.php:18 +#: options-generic.php:71 +msgid "Show Advanced Options" +msgstr "" + +#: options-generic.php:35 +#: options-generic.php:66 +msgid "Hide Advanced Options" +msgstr "" + +#: options-generic.php:88 +msgid "Support this plugin!" +msgstr "" + +#: options-generic.php:89 +msgid "Display \"Page optimized by WP Minify\" link in the footer" +msgstr "" + +#: options-generic.php:90 +msgid "Do not display \"Page optimized by WP Minify\" link." +msgstr "" + +#: options-generic.php:91 +msgid "I will donate and/or write about this plugin" +msgstr "" + +#: options-generic.php:100 +#: wp-minify.php:370 +msgid "General Configuration" +msgstr "" + +#: options-generic.php:101 +msgid "Enable JavaScript Minification" +msgstr "" + +#: options-generic.php:102 +msgid "Enable CSS Minification" +msgstr "" + +#: options-generic.php:103 +msgid "Enable HTML Minification" +msgstr "" + +#: options-generic.php:112 +msgid "Debugging" +msgstr "" + +#: options-generic.php:113 +msgid "Don't use \"pretty\" URL\"" +msgstr "" + +#: options-generic.php:114 +msgid "Combine files but do not minify" +msgstr "" + +#: options-generic.php:115 +msgid "Show minify errors through FirePHP" +msgstr "" + +#: options-generic.php:124 +msgid "Local Files Minification" +msgstr "" + +#: options-generic.php:125 +msgid "JavaScript files to exclude from minify (line delimited)." +msgstr "" + +#: options-generic.php:126 +msgid "CSS files to exclude from minify (line delimited)." +msgstr "" + +#: options-generic.php:127 +msgid "URIs on which WP-Minify parsing will be disabled (line delimited)" +msgstr "" + +#: options-generic.php:136 +msgid "Non-Local Files Minification" +msgstr "" + +#: options-generic.php:137 +msgid "Enable minification on external files" +msgstr "" + +#: options-generic.php:138 +msgid "Not recommended unless you want to exclude a bunch of external .js/.css files" +msgstr "" + +#: options-generic.php:139 +msgid "External JavaScript files to include into minify." +msgstr "" + +#: options-generic.php:140 +#: options-generic.php:143 +msgid "Only useful if \"Minification on external files\" is unchecked" +msgstr "" + +#: options-generic.php:141 +#: options-generic.php:144 +#: options-generic.php:164 +msgid "more info" +msgstr "" + +#: options-generic.php:142 +msgid "External CSS files to include into minify." +msgstr "" + +#: options-generic.php:151 +msgid "Caching" +msgstr "" + +#: options-generic.php:152 +msgid "Cache expires after every" +msgstr "" + +#: options-generic.php:153 +msgid "seconds" +msgstr "" + +#: options-generic.php:154 +msgid "Manually Clear Cache" +msgstr "" + +#: options-generic.php:161 +msgid "Tweaking/Tuning" +msgstr "" + +#: options-generic.php:162 +msgid "Place Minified JavaScript in footer" +msgstr "" + +#: options-generic.php:163 +msgid "Not recommended" +msgstr "" + +#: options-generic.php:170 +msgid "Force all JavaScript/CSS calls to be HTTPS on HTTPS pages" +msgstr "" + +#: options-generic.php:177 +msgid "Automatically set your Minify base per siteurl setting (recommended)" +msgstr "" + +#: options-generic.php:178 +msgid "Extra arguments to pass to minify engine. This value will get append to calls to URL \"wp-minify/min/?f=file1.js,file2.js,...,fileN.js\"." +msgstr "" + +#: options-generic.php:179 +msgid "e.g. You can specify this value to be b=somepath to specify the base path for all files passed into Minify." +msgstr "" + +#: options-generic.php:190 +msgid "Update Options" +msgstr "" + +#: options-generic.php:191 +msgid "Reset ALL Options" +msgstr "" + +#: wp-minify.php:331 +msgid "Cache directory is not writable. Please grant your server write permissions to the directory" +msgstr "" + +#: wp-minify.php:339 +msgid "Minify Engine config.php is not writable. Please grant your server write permissions to file" +msgstr "" + +#: wp-minify.php:346 +msgid "Some option settings are missing (possibly from plugin upgrade)." +msgstr "" + +#: wp-minify.php:350 +msgid "Minify Engine config.php was configured automatically." +msgstr "" + +#: wp-minify.php:369 +msgid "WP Minify Options" +msgstr "" + +#: wp-minify.php:371 +msgid "Documentation" +msgstr "" + +#: wp-minify.php:418 +msgid "Error: Could not fetch and cache URL" +msgstr "" + +#: wp-minify.php:419 +msgid "You might need to exclude this file in WP Minify options." +msgstr "" + diff --git a/wp-content/plugins/wp-minify/min/.htaccess b/wp-content/plugins/wp-minify/min/.htaccess new file mode 100644 index 0000000..42f13eb --- /dev/null +++ b/wp-content/plugins/wp-minify/min/.htaccess @@ -0,0 +1,4 @@ + +RewriteEngine on +RewriteRule ^([a-z]=.*) index.php?$1 [L,NE] + \ No newline at end of file diff --git a/wp-content/plugins/wp-minify/min/README.txt b/wp-content/plugins/wp-minify/min/README.txt new file mode 100644 index 0000000..a7cf774 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/README.txt @@ -0,0 +1,132 @@ +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/wp-content/plugins/wp-minify/min/builder/_index.js b/wp-content/plugins/wp-minify/min/builder/_index.js new file mode 100644 index 0000000..8e5313a --- /dev/null +++ b/wp-content/plugins/wp-minify/min/builder/_index.js @@ -0,0 +1,242 @@ +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/wp-content/plugins/wp-minify/min/builder/bm.js b/wp-content/plugins/wp-minify/min/builder/bm.js new file mode 100644 index 0000000..10d1943 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/builder/bm.js @@ -0,0 +1,36 @@ +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/wp-content/plugins/wp-minify/min/builder/index.php b/wp-content/plugins/wp-minify/min/builder/index.php new file mode 100644 index 0000000..1b20982 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/builder/index.php @@ -0,0 +1,182 @@ + + + + + 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/wp-content/plugins/wp-minify/min/builder/ocCheck.php b/wp-content/plugins/wp-minify/min/builder/ocCheck.php new file mode 100644 index 0000000..c47baa3 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/builder/ocCheck.php @@ -0,0 +1,36 @@ + 'World!' + ,'method' => 'deflate' + )); + $he->encode(); + $he->sendAll(); + +} else { + // echo status "0" or "1" + header('Content-Type: text/plain'); + echo (int)$_oc; +} diff --git a/wp-content/plugins/wp-minify/min/builder/rewriteTest.js b/wp-content/plugins/wp-minify/min/builder/rewriteTest.js new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/builder/rewriteTest.js @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/wp-content/plugins/wp-minify/min/config.php b/wp-content/plugins/wp-minify/min/config.php new file mode 100644 index 0000000..94cbdc1 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/config.php @@ -0,0 +1,165 @@ + + * 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 ha \ No newline at end of file diff --git a/wp-content/plugins/wp-minify/min/groupsConfig.php b/wp-content/plugins/wp-minify/min/groupsConfig.php new file mode 100644 index 0000000..9e2514d --- /dev/null +++ b/wp-content/plugins/wp-minify/min/groupsConfig.php @@ -0,0 +1,34 @@ + 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/wp-content/plugins/wp-minify/min/index.php b/wp-content/plugins/wp-minify/min/index.php new file mode 100644 index 0000000..51c3525 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/index.php @@ -0,0 +1,66 @@ + + * @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/wp-content/plugins/wp-minify/min/lib/HTTP/ConditionalGet.php b/wp-content/plugins/wp-minify/min/lib/HTTP/ConditionalGet.php new file mode 100644 index 0000000..823db05 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/HTTP/ConditionalGet.php @@ -0,0 +1,348 @@ + + * 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/wp-content/plugins/wp-minify/min/lib/HTTP/Encoder.php b/wp-content/plugins/wp-minify/min/lib/HTTP/Encoder.php new file mode 100644 index 0000000..66c2678 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/HTTP/Encoder.php @@ -0,0 +1,326 @@ + + * // 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/wp-content/plugins/wp-minify/min/lib/JSMin.php b/wp-content/plugins/wp-minify/min/lib/JSMin.php new file mode 100644 index 0000000..770e1c6 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/JSMin.php @@ -0,0 +1,314 @@ + (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/wp-content/plugins/wp-minify/min/lib/JSMinPlus.php b/wp-content/plugins/wp-minify/min/lib/JSMinPlus.php new file mode 100644 index 0000000..31a1a5c --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/JSMinPlus.php @@ -0,0 +1,1872 @@ + + * + * 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/wp-content/plugins/wp-minify/min/lib/Minify/CSS.php b/wp-content/plugins/wp-minify/min/lib/Minify/CSS.php new file mode 100644 index 0000000..2220cf2 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/CSS.php @@ -0,0 +1,83 @@ + + * @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/wp-content/plugins/wp-minify/min/lib/Minify/CSS/Compressor.php b/wp-content/plugins/wp-minify/min/lib/Minify/CSS/Compressor.php new file mode 100644 index 0000000..a348286 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/CSS/Compressor.php @@ -0,0 +1,250 @@ + + * @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/wp-content/plugins/wp-minify/min/lib/Minify/CSS/UriRewriter.php b/wp-content/plugins/wp-minify/min/lib/Minify/CSS/UriRewriter.php new file mode 100644 index 0000000..824c6bb --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/CSS/UriRewriter.php @@ -0,0 +1,270 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/Cache/APC.php b/wp-content/plugins/wp-minify/min/lib/Minify/Cache/APC.php new file mode 100644 index 0000000..ca84d29 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Cache/APC.php @@ -0,0 +1,130 @@ + + * 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/wp-content/plugins/wp-minify/min/lib/Minify/Cache/File.php b/wp-content/plugins/wp-minify/min/lib/Minify/Cache/File.php new file mode 100644 index 0000000..8744a7e --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Cache/File.php @@ -0,0 +1,125 @@ +_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/wp-content/plugins/wp-minify/min/lib/Minify/Cache/Memcache.php b/wp-content/plugins/wp-minify/min/lib/Minify/Cache/Memcache.php new file mode 100644 index 0000000..2b81e7a --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Cache/Memcache.php @@ -0,0 +1,137 @@ + + * // 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/wp-content/plugins/wp-minify/min/lib/Minify/CommentPreserver.php b/wp-content/plugins/wp-minify/min/lib/Minify/CommentPreserver.php new file mode 100644 index 0000000..f56eb34 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/CommentPreserver.php @@ -0,0 +1,90 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Base.php b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Base.php new file mode 100644 index 0000000..84889b3 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Base.php @@ -0,0 +1,202 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Files.php b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Files.php new file mode 100644 index 0000000..83f028a --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Files.php @@ -0,0 +1,78 @@ + + * 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/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Groups.php b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Groups.php new file mode 100644 index 0000000..1ac5770 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Groups.php @@ -0,0 +1,94 @@ + + * 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/wp-content/plugins/wp-minify/min/lib/Minify/Controller/MinApp.php b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/MinApp.php new file mode 100644 index 0000000..9582d29 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/MinApp.php @@ -0,0 +1,132 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Page.php b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Page.php new file mode 100644 index 0000000..fa4599a --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Page.php @@ -0,0 +1,82 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Version1.php b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Version1.php new file mode 100644 index 0000000..1861aab --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Controller/Version1.php @@ -0,0 +1,118 @@ + + * 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/wp-content/plugins/wp-minify/min/lib/Minify/HTML.php b/wp-content/plugins/wp-minify/min/lib/Minify/HTML.php new file mode 100644 index 0000000..fb5c1e9 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/HTML.php @@ -0,0 +1,245 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/ImportProcessor.php b/wp-content/plugins/wp-minify/min/lib/Minify/ImportProcessor.php new file mode 100644 index 0000000..0d6d90a --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/ImportProcessor.php @@ -0,0 +1,157 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/Lines.php b/wp-content/plugins/wp-minify/min/lib/Minify/Lines.php new file mode 100644 index 0000000..6f94fb6 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Lines.php @@ -0,0 +1,131 @@ + + * @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/wp-content/plugins/wp-minify/min/lib/Minify/Logger.php b/wp-content/plugins/wp-minify/min/lib/Minify/Logger.php new file mode 100644 index 0000000..7844eea --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Logger.php @@ -0,0 +1,45 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/Packer.php b/wp-content/plugins/wp-minify/min/lib/Minify/Packer.php new file mode 100644 index 0000000..949c3ee --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Packer.php @@ -0,0 +1,37 @@ +pack()); + } +} diff --git a/wp-content/plugins/wp-minify/min/lib/Minify/Source.php b/wp-content/plugins/wp-minify/min/lib/Minify/Source.php new file mode 100644 index 0000000..5a85d10 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/Source.php @@ -0,0 +1,187 @@ + + */ +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/wp-content/plugins/wp-minify/min/lib/Minify/YUICompressor.php b/wp-content/plugins/wp-minify/min/lib/Minify/YUICompressor.php new file mode 100644 index 0000000..7cb61ad --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Minify/YUICompressor.php @@ -0,0 +1,139 @@ + + * 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/wp-content/plugins/wp-minify/min/lib/Solar/Dir.php b/wp-content/plugins/wp-minify/min/lib/Solar/Dir.php new file mode 100644 index 0000000..37f7169 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/lib/Solar/Dir.php @@ -0,0 +1,199 @@ + + * + * @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/wp-content/plugins/wp-minify/min/utils.php b/wp-content/plugins/wp-minify/min/utils.php new file mode 100644 index 0000000..c735941 --- /dev/null +++ b/wp-content/plugins/wp-minify/min/utils.php @@ -0,0 +1,90 @@ + + * + * + * + * + * 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/wp-content/plugins/wp-minify/options-generic.php b/wp-content/plugins/wp-minify/options-generic.php new file mode 100644 index 0000000..9c13620 --- /dev/null +++ b/wp-content/plugins/wp-minify/options-generic.php @@ -0,0 +1,197 @@ + +
    +name); + $advanced_toggle_state = 'visible'; + } + else { + $advanced_style = 'style="display:none"'; + $advanced_toggle_text = __('Show Advanced Options', $this->name); + $advanced_toggle_state = 'hidden'; + } + + if ($wpm_options['cache_external']) { + $include_style = 'style="display:none"'; + $include_toggle_state = 'on'; + } else { + $include_style = ''; + $include_toggle_state = 'off'; + } + + printf(' +

    %s

    +

    +

    + ', + __('Support this plugin!', $this->name), + __('Display "Page optimized by WP Minify" link in the footer', $this->name), + __('Do not display "Page optimized by WP Minify" link.', $this->name), + __('Donations are appreciated!', $this->name) + ); + + printf(' +

    %s

    +

    +

    +

    + ', + __('General Configuration', $this->name), + __('Enable JavaScript Minification', $this->name), + __('Enable CSS Minification', $this->name), + __('Enable HTML Minification', $this->name) + ); + + printf(' +

    %s

    +

    +

    + ', + __('Debugging', $this->name), + __('Combine files but do not minify', $this->name), + __('Show minify errors through FirePHP', $this->name) + ); + + printf(' +

    %s

    +

    +

    +

    + ', + __('Local Files Minification', $this->name), + __('JavaScript files to exclude from minify (line delimited).', $this->name), + __('CSS files to exclude from minify (line delimited).', $this->name), + __('URIs on which WP-Minify parsing will be disabled (line delimited)', $this->name) + ); + + printf(' +

    %s

    +

    +

    +

    + ', + __('Non-Local Files Minification', $this->name), + __('Enable minification on external files', $this->name), + __('Not recommended unless you want to exclude a bunch of external .js/.css files', $this->name), + __('External JavaScript files to include into minify.', $this->name), + __('Only useful if "Minification on external files" is unchecked', $this->name), + __('more info', $this->name), + __('External CSS files to include into minify.', $this->name), + __('Only useful if "Minification on external files" is unchecked', $this->name), + __('more info', $this->name) + ); + + printf(' +

    %s

    +

    + ', + __('Caching', $this->name), + __('Cache expires after every', $this->name), + __('seconds', $this->name), + __('Manually Clear Cache', $this->name) + ); + + printf(' +

    %s

    +

    +

    + ', + __('Tweaking/Tuning', $this->name), + __('Use "pretty" URL"', $this->name), + __('i.e. use "wp-minify/cache/1234abcd.js" instead of "wp-minify/min/?f=file1.js,file2.js,...,fileN.js"', $this->name), + __('Place Minified JavaScript in footer', $this->name), + __('Not recommended', $this->name), + __('more info', $this->name) + ); + + printf(' +

    + ', + __('Force all JavaScript/CSS calls to be HTTPS on HTTPS pages', $this->name) + ); + + printf(' +

    +

    + ', + __('Automatically set your Minify base per siteurl setting (recommended)', $this->name), + __('Extra arguments to pass to minify engine. This value will get append to calls to URL "wp-minify/min/?f=file1.js,file2.js,...,fileN.js".', $this->name), + __('e.g. You can specify this value to be b=somepath to specify the base path for all files passed into Minify.', $this->name) + ); + + if ( function_exists( 'wp_nonce_field' ) && wp_nonce_field( $this->name ) ) { + printf(' +

    + + + +

    + ', + __('Update Options', $this->name), + __('Reset ALL Options', $this->name) + ); + } +?> +
    diff --git a/wp-content/plugins/wp-minify/options-sidebar.php b/wp-content/plugins/wp-minify/options-sidebar.php new file mode 100644 index 0000000..85fb743 --- /dev/null +++ b/wp-content/plugins/wp-minify/options-sidebar.php @@ -0,0 +1 @@ + diff --git a/wp-content/plugins/wp-minify/readme.txt b/wp-content/plugins/wp-minify/readme.txt new file mode 100644 index 0000000..8344ee0 --- /dev/null +++ b/wp-content/plugins/wp-minify/readme.txt @@ -0,0 +1,256 @@ +=== WP Minify === +Tags: minify, js, css, html, javascript, cascading style sheets, optimize, performance, speed, http request, phpspeedy +Contributors: madeinthayaland +Donate link: http://omninoggin.com/donate/ +Requires at least: 2.7 +Tested up to: 3.3.2 +Stable Tag: 1.2.0 + +This plugin uses the Minify engine to combine and compress JS and CSS files +to improve page load time. + +== Description == +This plugin integrates the [Minify engine](http://code.google.com/p/minify/) +into your WordPress blog. Once enabled, this plugin will combine and compress +JS and CSS files to improve page load time. + += How Does it Work? = + +WP Minify grabs JS/CSS files in your generated WordPress page and passes that +list to the Minify engine. The Minify engine then returns a consolidated, +minified, and compressed script or style for WP Minify to reference in the +WordPress header. + += Features = + +* Easily integrate Minify into your WordPress blog. +* Minifies JavaScript, CSS, and HTML. +* Debug tools to help you debug your issues. +* Ability to include extra JS and CSS files for Minifying. +* Ability to exclude certain JS and CSS files for Minifying. +* Minified JS and CSS files can be placed wherever you want. +* Support for to minifying external files via caching. +* Ability to pass extra arguments to Minify engine. +* Expire headers for minified JS and CSS files. +* Detection and elimination of duplicate sources. +* Plugin hooks! + +== Changelog == + += 1.2.0 = +* Tested with 3.3.2 +* No longer showing attribution link by default. +* Changed donation phrasing. + += 1.1.8 = +* Removed unnecessary error_log line. + += 1.1.7 = +* Set User Agent as "WP-Minify" when curling things. +* Cleaned up some old code. +* Added last modified time to pretty URLs. +* Updating it_IT translation (thanks Gianni Diiurno!). +* Added uk translation (thanks Jurko Chervony!). + += 1.1.6 = +* Extra precautions when printing last modified time variable (?m= vs. &m=) + += 1.1.5 = +* Fixed documentation. + += 1.1.4 = +* Made pretty URL off by default since it doesn't work for everybody. + += 1.1.3 = +* Added it_IT translation (thanks Gianni Diurno!) + += 1.1.2 = +* Re-did options page and documentation to make things a bit more clear. + += 1.1.1 = +* Fixed incomplete /min/config.php file. + += 1.1 = +* Fixed "Class 'WPMinifyCommon' not found" errors that some are seeing. +* Added pretty URL for minified files so now you can stick it on a CDN. +* Organized options page. + += 1.0.4 = +* Fixed conflict with W3 Total Cache. + += 1.0.3 = +* Fixed "Invalid argument supplied for foreach()" error that some are having. + += 1.0.2 = +* Adding options for excluding certain URIs from WP Minify parsing. + += 1.0.1 = +* Reverting bbpress fix since it causs Minify to not even run. + += 1.0.0 = +* Added option to minify HTML. +* Added ability to NOT minify when "wp-minify-off=1" is in URL. +* Added option to report errors through FirePHP. +* Added "wp_minify_js_url" filter +* Added "wp_minify_css_url" filter +* Added "wp_minify_content" filter +* Enhanced "JavaScript files to include" feature. +* Enhanced "CSS files to include" feature. +* Fixed persistent SSL issue (Thanks belg4mit!) +* Fixed bbpress issue (Thanks foobar!) + += 0.9.3 = +* Fixed removing trailing slash in base path. + += 0.9.2 = +* Fixed "delimiter" error. +* Fixed admin sidebar. + += 0.9.1 = +* Automatically set far future expiration headers in Minify config (30 days). +* Automatically detect subdirectory from siteurl for passing as base path + for Minify engine. + += 0.9.0 = +* Added SSL option to force http -> https on secured pages. +* Updated common.php and some other maintenance. + += 0.8.1 = +* Fixed WPMU subdirectory bug. + += 0.8.0 = +* Added ability to de-dupe sources +* Added ability to manually specify location of minified JS and CSS files. +* Fixed XHTML compliance bugs +* Cleaned empty lines in HTML output + += 0.7.4 = +* Fixed detecting if script is local or not. + += 0.7.3 = +* Fixed corner case on expire headers implementation. + += 0.7.2 = +* Add expire headers to combined JS and CSS files (Thanks Jan Seidl!). + += 0.7.1 = +* Fixed extra arguments for Minify engine. + += 0.7.0 = +* Added advanced options: + - Minification on external files + - Place JavaScript in footer + - Extra arguments for Minify engine +* Removed wp_path option (Thanks Jan Seidl!) +* Fixed Output Buffer conflicts with other plugins that use output buffering + such as All-in-One SEO and Anarchy Media Player. + += 0.6.5 = +* Fixed URL building (bug introduced by last release). +* Brought back WordPress path settings as some people with .htaccess issues + may still need this. + += 0.6.4 = +* Fixed CSS regex to catch "media=''" case. (Thanks forum user bobmarkl33!) +* Modified minified JavaScript injection to the end of (Thanks forum + user bobmarl33!) +* Fixed WP Minify working with blogs installed in subdirectory of webroot. + (Thanks forum user Luke!) +* Removed WordPress path settings as this is no longer needed per Luke's fix. + += 0.6.3 = +* Fixed JavaScript minification failure for large number of files. + += 0.6.2 = +* Fixed admin array_keys() bug +* Updated .pot file. + += 0.6.1 = +* Added .pot file. + += 0.6 = +* Upgraded to Minify engine 2.1.3. +* Added automatic Minify engine cache configuration. +* Fixed HTML5
    conflict. +* Fixed bug from blog installed in subdirectory. +* Fixed localization. + += 0.5 = +* Added option to disable JS or CSS minification. +* Fixed a few bugs. +* Admin facelift + += 0.4.1 = +* Fixed non-replaced tag for valid XHTML usage. + += 0.4 = +* Automatically exclude CSS conditionals. +* Automatically exclude CSS media != all, or screen. +* Automatically exclude https URLs. +* Added sanity checking for buffer start & stop. +* Moved buffer start to init with priority 99999. +* Fixed "strpos()" warnings when settings have empty lines. + += 0.3.1 = +* Fixed "URL file-access disabled" errors. +* Fixed "implode()" warnings. + += 0.3 = +* WP 2.8 Compatibility + += 0.2.1 = +* Fixed another CSS exclusion bug (src_match -> href_match). +* Fixed JS WP Minify bug passing double forward slashes when not needed. +* Added media="screen" for minified CSS reference. + += 0.2 = +* Changed the way CSS and JS files are picked up. No more wp_enqueue_* + requirements! +* Fixed exclusion bug where specified files are not excluded from + minification. +* Removed OMNINOGGIN dashboard widget. + += 0.1.1 = +* Fixed array_slice() warning in the admin dashboard. +* Fixed version check to not break page when $wp_version is empty. + += 0.1 = +* Initial release + += Credits = +This plugin utilizes the [Minify engine](http://code.google.com/p/minify/) +coded by [Steve Clay](http://mrclay.org/) and [Ryan Grove](http://wonko.com) +to perform all JS & CSS Minifying. + +== Installation == + +1. Upload the plugin to your plugins folder: 'wp-content/plugins/' +2. Make sure 'wp-content/plugins/wp-minify/cache' is writeable by the + web server. (try 'chmod 777 wp-content/plugins/wp-minify/cache') +3. Activate the 'WP Minify' plugin from the Plugins admin panel. + +== Frequently Asked Questions == + += Where is the documentation? = +If you are having problems with this plugin, please first take a look at the +various links under the "Documentation" section of the +[plugin page](http://omninoggin.com/wordpress-plugins/wp-minify-wordpress-plugin/). + += I still can't get it to work after reading the documentation! = +Please take a look at documentation available on the +[plugin page](http://omninoggin.com/wordpress-plugins/wp-minify-wordpress-plugin/). +to see if any of them can help you. If not, feel free to post your issues +on the appropriate [plugin support forum](http://omninoggin.com/forum). +I will try my best to help you resolve any issues that you are having. + +== License == +All contents under the wp-minify/min/ directory is licensed under +[New BSD License](http://www.opensource.org/licenses/bsd-license.php) (which is +[GPL](http://www.gnu.org/copyleft/gpl.html) compatible). All other +contents within this package is licensed under GPLv3. + +== Screenshots == + +1. Options +2. Before WP Minify (11 JS requests @ 111KB) +3. After WP Minify (1 JS request @ 30KB) diff --git a/wp-content/plugins/wp-minify/screenshot-1.png b/wp-content/plugins/wp-minify/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a20366acebbe2afdb7417d8445b04a602c6b8811 GIT binary patch literal 13800 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-minify/screenshot-2.png b/wp-content/plugins/wp-minify/screenshot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b3084b08164044da74812fb6010d0c0b7b51453a GIT binary patch literal 23086 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 iJoT^N_t4~(A5b8!T$lgB^Y%8 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/wp-minify/screenshot-3.png b/wp-content/plugins/wp-minify/screenshot-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ac117177c4d93e982bcaf260df4a0d315d9baa42 GIT binary patch literal 8342 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. +*/ + +class WPMinify { + + var $author_homepage = 'http://omninoggin.com/'; + var $homepage = 'http://omninoggin.com/wordpress-plugins/wp-minify-wordpress-plugin/'; + var $name = 'wp_minify'; + var $name_dashed = 'wp-minify'; + var $name_proper = 'WP Minify'; + var $required_wp_version = '2.7'; + var $version = '1.2.0'; + + var $c = null; + var $debug = false; + var $cache_location = 'wp-content/plugins/wp-minify/cache/'; + var $url_len_limit = 2000; + var $minify_limit = 50; + var $buffer_started = false; + var $default_exclude = array(); + + function WPMinify() { + // initialize common functions + $this->c = new WPMinifyCommon($this); + + // load translation + $this->c->load_text_domain(); + + // register admin scripts + add_action('admin_init', array($this->c, 'a_register_scripts')); + add_action('admin_init', array($this->c, 'a_register_styles')); + + // check wp version + add_action('admin_head', array($this->c, 'a_check_version')); + + // load admin menu + add_action('admin_menu', array($this, 'a_menu')); + + // register ajax handler + add_action('wp_ajax_wpm', array($this, 'a_ajax_handler')); + + // No need to minify admin stuff + if (!is_admin() && !is_feed() && !defined('XMLRPC_REQUEST')) { + // Don't minify if if user passes wp-minify-off=1 in GET parameter + if (!(isset($_GET['wp-minify-off']) && $_GET['wp-minify-off'])) { + add_action('init', array($this, 'pre_content'), 99999); + add_action('wp_footer', array($this, 'post_content')); + } + // advertise hook + add_action('wp_footer', array($this, 'advertise')); + } + } + + // admin functions + + function a_default_options() { + return array( + 'cache_external' => false, + 'cache_interval' => 900, + 'css_exclude' => array(), + 'css_include' => array(), + 'debug_nominify' => false, + 'debug_firephp' => false, + 'enable_css' => true, + 'enable_js' => true, + 'enable_html' => true, + 'auto_base' => true, + 'extra_minify_options' => '', + 'js_exclude' => array(), + 'js_include' => array(), + 'js_in_footer' => false, + 'force_https' => false, + 'pretty_url' => false, + 'show_link' => false, + 'show_advanced' => false, + 'uri_exclude' => array(), + 'version' => $this->version, + 'deprecated' => array( + 'wp_path', 'debug', 'debug_noprettyurl' + ) + ); + } + + function a_update_options() { + // new options + $wpm_new_options = stripslashes_deep($_POST['wpm_options_update']); + + // current options + $wpm_current_options = get_option($this->name); + + // convert "on" to true and "off" to false for checkbox fields + // and set defaults for fields that are left blank + if (isset($wpm_new_options['show_link']) && $wpm_new_options['show_link'] == "on") + $wpm_new_options['show_link'] = true; + else + $wpm_new_options['show_link'] = false; + + if (isset($wpm_new_options['enable_js'])) + $wpm_new_options['enable_js'] = true; + else + $wpm_new_options['enable_js'] = false; + + if (isset($wpm_new_options['enable_css'])) + $wpm_new_options['enable_css'] = true; + else + $wpm_new_options['enable_css'] = false; + + if (isset($wpm_new_options['enable_html'])) + $wpm_new_options['enable_html'] = true; + else + $wpm_new_options['enable_html'] = false; + + if (isset($wpm_new_options['auto_base'])) + $wpm_new_options['auto_base'] = true; + else + $wpm_new_options['auto_base'] = false; + + if (isset($wpm_new_options['cache_external'])) + $wpm_new_options['cache_external'] = true; + else + $wpm_new_options['cache_external'] = false; + + if (isset($wpm_new_options['js_in_footer'])) + $wpm_new_options['js_in_footer'] = true; + else + $wpm_new_options['js_in_footer'] = false; + + if (isset($wpm_new_options['pretty_url'])) + $wpm_new_options['pretty_url'] = true; + else + $wpm_new_options['pretty_url'] = false; + + if (isset($wpm_new_options['debug_nominify'])) + $wpm_new_options['debug_nominify'] = true; + else + $wpm_new_options['debug_nominify'] = false; + + if (isset($wpm_new_options['debug_firephp'])) + $wpm_new_options['debug_firephp'] = true; + else + $wpm_new_options['debug_firephp'] = false; + + $this->a_set_minify_config($wpm_new_options['debug_nominify'], $wpm_new_options['debug_firephp']); + + if ( isset($wpm_new_options['force_https']) ) + $wpm_new_options['force_https'] = true; + else + $wpm_new_options['force_https'] = false; + + if (strlen(trim($wpm_new_options['js_include'])) > 0) + $wpm_new_options['js_include'] = $this->array_trim(split(chr(10), str_replace(chr(13), '', $wpm_new_options['js_include']))); + else + $wpm_new_options['js_include'] = array(); + + if (strlen(trim($wpm_new_options['js_exclude'])) > 0) + $wpm_new_options['js_exclude'] = $this->array_trim(split(chr(10), str_replace(chr(13), '', $wpm_new_options['js_exclude']))); + else + $wpm_new_options['js_exclude'] = array(); + + if (strlen(trim($wpm_new_options['css_include'])) > 0) + $wpm_new_options['css_include'] = $this->array_trim(split(chr(10), str_replace(chr(13), '', $wpm_new_options['css_include']))); + else + $wpm_new_options['css_include'] = array(); + + if (strlen(trim($wpm_new_options['css_exclude'])) > 0) + $wpm_new_options['css_exclude'] = $this->array_trim(split(chr(10), str_replace(chr(13), '', $wpm_new_options['css_exclude']))); + else + $wpm_new_options['css_exclude'] = array(); + + if ( strlen(trim($wpm_new_options['uri_exclude'])) > 0 ) + $wpm_new_options['uri_exclude'] = $this->array_trim(split(chr(10), str_replace(chr(13), '', $wpm_new_options['uri_exclude']))); + else + $wpm_new_options['uri_exclude'] = array(); + + // Update options + foreach ($wpm_new_options as $key => $value) { + $wpm_current_options[$key] = $value; + } + + update_option($this->name, $wpm_current_options); + } + + function a_set_advanced_options($val) { + $wpm_options = get_option($this->name); + $wpm_options['show_advanced'] = $val; + update_option($this->name, $wpm_options); + } + + function a_ajax_handler() { + check_ajax_referer($this->name); + if (isset($_POST['wpm_action'])) { + if (strtolower($_POST['wpm_action']) == 'show_advanced') { + $this->a_set_advanced_options(true); + } + elseif (strtolower($_POST['wpm_action']) == 'hide_advanced') { + $this->a_set_advanced_options(false); + } + else { + echo 'Invalid wpm_action.'; + } + } + exit(); + } + + function a_request_handler() { + if (isset($_POST['wpm_options_update_submit'])) { + check_admin_referer($this->name); + $this->a_update_options(); + add_action('admin_notices', array($this->c, 'a_notify_updated')); + } + elseif (isset($_POST['wpm_options_clear_cache_submit'])) { + // if user wants to regenerate nonce + check_admin_referer($this->name); + $this->c->a_clear_cache(); + add_action('admin_notices', array($this->c, 'a_notify_cache_cleared')); + } + elseif (isset($_POST['wpm_options_upgrade_submit'])) { + // if user wants to upgrade options (for new options on version upgrades) + check_admin_referer($this->name); + $this->c->a_upgrade_options(); + add_action('admin_notices', array($this->c, 'a_notify_upgraded')); + } + elseif (isset($_POST['wpm_options_reset_submit'])) { + // if user wants to reset all options + check_admin_referer($this->name); + $this->c->a_reset_options(); + add_action('admin_notices', array($this->c, 'a_notify_reset')); + } + + // only check these on plugin settings page + $this->c->a_check_dir_writable($this->c->get_plugin_dir().'cache/', array($this, 'a_notify_cache_not_writable')); + $this->c->a_check_orphan_options(array($this, 'a_notify_orphan_options')); + if ($this->c->a_check_dir_writable($this->c->get_plugin_dir().'min/config.php', array($this, 'a_notify_config_not_writable'))) { + $this->a_check_minify_config(); + } + } + + function a_check_minify_config() { + $fname = $this->c->get_plugin_dir().'min/config.php'; + $fhandle = fopen($fname,'r'); + $content = fread($fhandle,filesize($fname)); + + $config_modified = false; + + preg_match('/\/\/###WPM-CACHE-PATH-BEFORE###(.*)\/\/###WPM-CACHE-PATH-AFTER###/s', $content, $matches); + $cache_path_code = $matches[1]; + if (!preg_match('/\$min_cachePath.*?/', $cache_path_code)) { + $content = preg_replace( + '/\/\/###WPM-CACHE-PATH-BEFORE###(.*)\/\/###WPM-CACHE-PATH-AFTER###/s', + "//###WPM-CACHE-PATH-BEFORE###\n".'$min_cachePath = \''.$this->c->get_plugin_dir()."cache/';\n//###WPM-CACHE-PATH-AFTER###", + $content); + $config_modified = true; + } + + preg_match('/\/\/###WPM-CACHE-AGE-BEFORE###(.*)\/\/###WPM-CACHE-AGE-AFTER###/s', $content, $matches); + $cache_age_code = $matches[1]; + if (!preg_match('/\$min_serveOptions\[\'maxAge\'].*?/', $cache_age_code)) { + $content = preg_replace( + '/\/\/###WPM-CACHE-AGE-BEFORE###(.*)\/\/###WPM-CACHE-AGE-AFTER###/s', + "//###WPM-CACHE-AGE-BEFORE###\n".'$min_serveOptions[\'maxAge\'] = 2592000;'."\n//###WPM-CACHE-AGE-AFTER###", + $content); + $config_modified = true; + } + + if ($config_modified) { + $this->a_notify_modified_minify_config(); + } + + $fhandle = fopen($fname,"w"); + fwrite($fhandle,$content); + fclose($fhandle); + } + + function a_set_minify_config($nominify = false, $firephp = false) { + if ($nominify) { + $nominify = 'true'; + } else { + $nominify = 'false'; + } + if ($firephp) { + $firephp = 'true'; + } else { + $firephp = 'false'; + } + $fname = $this->c->get_plugin_dir().'min/config.php'; + $fhandle = fopen($fname,'r'); + $content = fread($fhandle,filesize($fname)); + + $content = preg_replace( + '/\/\/###WPM-DEBUG-FLAG-BEFORE###(.*)\/\/###WPM-DEBUG-FLAG-AFTER###/s', + "//###WPM-DEBUG-FLAG-BEFORE###\n".'$min_allowDebugFlag = '.$nominify.";\n//###WPM-DEBUG-FLAG-AFTER###", + $content); + + $content = preg_replace( + '/\/\/###WPM-ERROR-LOGGER-BEFORE###(.*)\/\/###WPM-ERROR-LOGGER-AFTER###/s', + "//###WPM-ERROR-LOGGER-BEFORE###\n".'$min_errorLogger = '.$firephp.";\n//###WPM-ERROR-LOGGER-AFTER###", + $content); + + $fhandle = fopen($fname,"w"); + fwrite($fhandle,$content); + fclose($fhandle); + } + + function a_notify_cache_not_writable() { + $this->c->a_notify( + sprintf('%s: %s', + __('Cache directory is not writable. Please grant your server write permissions to the directory', $this->name), + $this->c->get_plugin_dir().'cache/'), + true); + } + + function a_notify_config_not_writable() { + $this->c->a_notify( + sprintf('%s: %s', + __('Minify Engine config.php is not writable. Please grant your server write permissions to file', $this->name), + $this->c->get_plugin_dir().'min/config.php')); + } + + function a_notify_orphan_options() { + $this->c->a_notify( + sprintf('%s', + __('Some option settings are missing (possibly from plugin upgrade).', $this->name))); + } + + function a_notify_modified_minify_config() { + $this->c->a_notify(__('Minify Engine config.php was configured automatically.', $this->name)); + } + + function a_menu() { + $options_page = add_options_page($this->name_proper, $this->name_proper, 'manage_options', 'wp-minify', array($this, 'a_page')); + add_action('admin_head-'.$options_page, array($this, 'a_request_handler')); + add_action('admin_print_scripts-'.$options_page, array($this->c, 'a_enqueue_scripts')); + add_action('admin_print_styles-'.$options_page, array($this->c, 'a_enqueue_styles')); + } + + function a_page() { + $wpm_options = get_option($this->name); + printf(' +
    +

    %s

    +
    + %s |  + %s +
    ', + __('WP Minify Options', $this->name), + __('General Configuration', $this->name), + __('Documentation', $this->name) + ); + printf('
    '); + if (isset($_GET['wpm-page'])) { + if ($_GET['wpm-page'] || !$_GET['wpm-page']) { + require_once('options-generic.php'); + } + } + else { + require_once('options-generic.php'); + } + printf('
    '); // omni_admin_main + require_once('options-sidebar.php'); + printf('
    '); // wrap + + } // admin_page() + + // other functions + + function fetch_and_cache($url, $cache_file) { + $ch = curl_init(); + $timeout = 5; // set to zero for no timeout + curl_setopt ($ch, CURLOPT_URL, $url); + curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt ($ch, CURLOPT_USERAGENT, 'WP-Minify'); + $content = curl_exec($ch); + curl_close($ch); + if ($content) { + if (is_array($content)) { + $content = implode($content); + } + + // save cache file + $fh = fopen($cache_file, 'w'); + if ($fh) { + fwrite($fh, $content); + fclose($fh); + } + else { + // cannot open for write. no error b/c something else is probably writing to the file. + } + + return $content; + } + else { + printf( + '%s: '.$url.'. %s
    ', + __('Error: Could not fetch and cache URL'), + __('You might need to exclude this file in WP Minify options.') + ); + return ''; + } + } + + function refetch_cache_if_expired($url, $cache_file) { + $wpm_options = get_option($this->name); + $cache_file_mtime = filemtime($cache_file); + if ((time() - $cache_file_mtime) > $wpm_options['cache_interval']) { + $this->fetch_and_cache($url, $cache_file); + } + } + + function tiny_filename($str) { + $f = __FILE__; + // no fancy shortening for Windows + return ('/' === $f[0]) ? strtr(base64_encode(md5($str, true)), '+/=', '-_(') : md5($str); + } + + function array_trim($arr, $charlist=null) { + foreach ($arr as $key => $value) { + if (is_array($value)) $result[$key] = array_trim($value, $charlist); + else $result[$key] = trim($value, $charlist); + } + return $result; + } + + function check_and_split_url($url, $latest_modified = 0) { + $url_chunk = explode('?f=', $url); + $base_url = array_shift($url_chunk); + $files = explode(',', array_shift($url_chunk)); + $num_files = sizeof($files); + + if ($this->url_needs_splitting($url, $files)) { + $first_half = $this->check_and_split_url($base_url . '?f=' . implode(',', array_slice($files, 0, $num_files/2)), $latest_modified); + $second_half = $this->check_and_split_url($base_url . '?f=' . implode(',', array_slice($files, $num_files/2)), $latest_modified); + return $first_half + $second_half; + } + else { + $wpm_options = get_option($this->name); + + // append &debug if we need to + if ($wpm_options['debug_nominify']) { + $debug_string = '&debug=true'; + } else { + $debug_string = ''; + } + + // append base directory if needed + $base = $this->get_base(); + if ($base != '') { + $base_string = '&b='.$base; + } else { + $base_string = ''; + } + + // get rid of any base directory specification in extra options + $extra_minify_options = preg_replace('/(&|&|\b)b=[^&]*/', '', trim($wpm_options['extra_minify_options'])); + if (trim($extra_minify_options) != '') { + $extra_string = '&'.$extra_minify_options; + } else { + $extra_string = ''; + } + + // append last modified time + $latest_modified_string = '&m='.$latest_modified; + + return array($base_url . '?f=' . implode(',', $files) . $debug_string . $base_string . $extra_string . $latest_modified_string); + } + } + + function fetch_content($url, $type = '') { + $cache_file = $this->c->get_plugin_dir().'cache/'.md5($url).$type; + $content = ''; + if (file_exists($cache_file)) { + // check cache expiration + $this->refetch_cache_if_expired($url, $cache_file); + + $fh = fopen($cache_file, 'r'); + if ($fh && filesize($cache_file) > 0) { + $content = fread($fh, filesize($cache_file)); + fclose($fh); + } + else { + // cannot open cache file so fetch it + $content = $this->fetch_and_cache($url, $cache_file); + } + } + else { + // no cache file. fetch from internet and save to local cache + $content = $this->fetch_and_cache($url, $cache_file); + } + return $content; + } + + function local_version($url) { + $site_url = trailingslashit(get_option('siteurl')); + $url = str_replace($site_url, '', $url); // relative paths only for local urls + $url = preg_replace('/^\//', '', $url); // strip front / if any + $url = preg_replace('/\?.*/i', '', $url); // throws away parameters, if any + return $url; + } + + function is_external($url, $localize=true) { + if ($localize) { + $url = $this->local_version($url); + } + + if (substr($url, 0, 4) != 'http' + && (substr($url, -3, 3) == '.js' || substr($url, -4, 4) == '.css')) { + return false; + } else { + return true; + } + } + + function get_js_location($src) { + if ($this->debug) + echo 'Script URL:'.$src."
    \n"; + + $script_path = $this->local_version($src); + if ($this->is_external($script_path, false)) { + // fetch scripts if necessary + $this->fetch_content($src, '.js'); + $location = $this->cache_location . md5($src) . '.js'; + if ($this->debug) + echo 'External script detected, cached as:'. md5($src) . "
    \n"; + } else { + // if script is local to server + $location = $script_path; + if ($this->debug) + echo 'Local script detected:'.$script_path."
    \n"; + } + + return $location; + } + + function get_css_location($src) { + if ($this->debug) + echo 'Style URL:'.$src."
    \n"; + + $css_path = $this->local_version($src); + if ($this->is_external($css_path, false)) { + // fetch scripts if necessary + $this->fetch_content($src, '.css'); + $location = $this->cache_location . md5($src) . '.css'; + if ($this->debug) + echo 'External css detected, cached as:'. md5($src) . "
    \n"; + } else { + $location = $css_path; + // if css is local to server + if ($this->debug) + echo 'Local css detected:'.$css_path."
    \n"; + } + + return $location; + } + + function url_needs_splitting($url, $locations) { + if ($url > $this->url_len_limit || count($locations) > $this->minify_limit) { + return true; + } else { + return false; + } + } + + function build_minify_urls($locations, $type) { + $wpm_options = get_option($this->name); + $minify_url = $this->c->get_plugin_url().'min/?f='; + if ($wpm_options['force_https'] && $_SERVER["HTTPS"] == "on") { + $minify_url = preg_replace('/^http:\/\//', 'https://', $minify_url); + } + $minify_url .= implode(',', $locations); + $latest_modified = $this->get_latest_modified_time($locations); + $minify_urls = $this->check_and_split_url($minify_url, $latest_modified); + + if ($wpm_options['pretty_url']) { + return $this->get_cached_minify_urls($minify_urls, $type); + } else { + return $minify_urls; + } + } + + function get_cached_minify_urls($urls, $type) { + $wpm_options = get_option($this->name); + $cached_urls = array(); + foreach ($urls as $url) { + $cache_file = $this->c->get_plugin_dir().'cache/'.md5($url).$type; + if (file_exists($cache_file)) { + // check cache expiration + $this->refetch_cache_if_expired($url, $cache_file); + + $fh = fopen($cache_file, 'r'); + if ($fh && filesize($cache_file) > 0) { + $content = fread($fh, filesize($cache_file)); + fclose($fh); + } else { + // cannot open cache file so fetch it + $this->fetch_and_cache($url, $cache_file); + } + } else { + // no cache file. fetch it + $this->fetch_and_cache($url, $cache_file); + } + $cache_url = $this->c->get_plugin_url().'cache/'.md5($url).$type.'?m='.filemtime($cache_file); + $cached_urls[] = $cache_url; + } + return $cached_urls; + } + + function get_base_from_minify_args() { + $wpm_options = get_option($this->name); + if (!empty($wpm_options['extra_minify_options'])) { + if (preg_match('/\bb=([^&]*?)(&|$)/', trim($wpm_options['extra_minify_options']), $matches)) { + return rtrim(trim($matches[1]), '\\/'); + } + } + return ''; + } + + function get_base_from_siteurl() { + $site_url = trailingslashit(get_option('siteurl')); + return rtrim(preg_replace('/^https?:\/\/.*?\//', '', $site_url), '\\/'); + } + + function get_base() { + $base_from_min_args = $this->get_base_from_minify_args(); + if ($base_from_min_args != '') { + return $base_from_min_args; + } + + $wpm_options = get_option($this->name); + if ($wpm_options['auto_base']) { + return $this->get_base_from_siteurl(); + } else { + return ''; + } + } + + function get_latest_modified_time($locations = array()) { + $latest_modified = 0; + if (!empty($locations)) { + $base_path = trailingslashit($_SERVER['DOCUMENT_ROOT']); + $base_path .= trailingslashit($this->get_base()); + + foreach ($locations as $location) { + $path = $base_path.$location; + $mtime = filemtime($path); + if ($latest_modified < $mtime) { + $latest_modified = $mtime; + } + } + } + return $latest_modified; + } + + function extract_css($content) { + $wpm_options = get_option($this->name); + $css_locations = array(); + + preg_match_all('/]*?)>/i', $content, $link_tags_match); + + foreach ($link_tags_match[0] as $link_tag) { + if (strpos(strtolower($link_tag), 'stylesheet')) { + // check CSS media type + if (!strpos(strtolower($link_tag), 'media=') + || preg_match('/media=["\'](?:["\']|[^"\']*?(all|screen)[^"\']*?["\'])/', $link_tag) + ) { + preg_match('/href=[\'"]([^\'"]+)/', $link_tag, $href_match); + if ($href_match[1]) { + // include it if it is in the include list + $include = false; + $inclusions = $wpm_options['css_include']; + foreach ($inclusions as $include_pat) { + $include_pat = trim($include_pat); + if (strlen($include_pat) > 0 && strpos($src_match[1], $include_pat) !== false) { + $include = true; + break; + } + } + + if (!$include) { + // support external files? + if (!$wpm_options['cache_external'] && $this->is_external($href_match[1])) { + continue; // skip if we don't cache externals and this file is external + } + + // do not include anything in excluded list + $skip = false; + $exclusions = array_merge($this->default_exclude, $wpm_options['css_exclude']); + foreach ($exclusions as $exclude_pat) { + $exclude_pat = trim($exclude_pat); + if (strlen($exclude_pat) > 0 && strpos($href_match[1], $exclude_pat) !== false) { + $skip = true; + break; + } + } + if ($skip) continue; + } + + $content = str_replace($link_tag . '', '', $content); + $content = str_replace($link_tag, '', $content); + $css_locations[] = $this->get_css_location($href_match[1]); + } + } + } + } + + $css_locations = array_unique($css_locations); + + return array($content, $css_locations); + } + + function inject_css($content, $css_locations) { + if (count($css_locations) > 0) { + $wpm_options = get_option($this->name); + // build minify URLS + $css_tags = ''; + $minify_urls = $this->build_minify_urls($css_locations, '.css'); + + foreach ($minify_urls as $minify_url) { + $minify_url = apply_filters('wp_minify_css_url', $minify_url); // Allow plugins to modify final minify URL + $css_tags .= ""; + } + + $matches = preg_match('//', $content); + + if ($matches) { + $content = preg_replace('//', "$css_tags", $content, 1); // limit 1 replacement + } else { + // HTML5 has
    tags so account for those in regex + $content = preg_replace('/|\s[^>]*?>)/', "\\0\n$css_tags", $content, 1); // limit 1 replacement + } + } + return $content; + } + + function extract_conditionals($content) { + preg_match_all('//is', $content, $conditionals_match); + $content = preg_replace('//is', '###WPM-CSS-CONDITIONAL###', $content); + + $conditionals = array(); + foreach ($conditionals_match[0] as $conditional) { + $conditionals[] = $conditional; + } + + return array($content, $conditionals); + } + + function inject_conditionals($content, $conditionals) { + while (count($conditionals) > 0 && strpos($content, '###WPM-CSS-CONDITIONAL###')) { + $conditional = array_shift($conditionals); + $content = preg_replace('/###WPM-CSS-CONDITIONAL###/', $conditional, $content, 1); + } + + return $content; + } + + function extract_js($content) { + $wpm_options = get_option($this->name); + $js_locations = array(); + + preg_match_all('/]*?)><\/script>/i', $content, $script_tags_match); + + foreach ($script_tags_match[0] as $script_tag) { + if (strpos(strtolower($script_tag), 'text/javascript') !== false) { + preg_match('/src=[\'"]([^\'"]+)/', $script_tag, $src_match); + if ($src_match[1]) { + // include it if it is in the include list + $include = false; + $inclusions = $wpm_options['js_include']; + foreach ($inclusions as $include_pat) { + $include_pat = trim($include_pat); + if (strlen($include_pat) > 0 && strpos($src_match[1], $include_pat) !== false) { + $include = true; + break; + } + } + + if (!$include) { + // support external files? + if (!$wpm_options['cache_external'] && $this->is_external($src_match[1])) { + continue; // skip if we don't cache externals and this file is external + } + + // do not include anything in excluded list + $skip = false; + $exclusions = array_merge($this->default_exclude, $wpm_options['js_exclude']); + foreach ($exclusions as $exclude_pat) { + $exclude_pat = trim($exclude_pat); + if (strlen($exclude_pat) > 0 && strpos($src_match[1], $exclude_pat) !== false) { + $skip = true; + break; + } + } + if ($skip) continue; + } + + $content = str_replace($script_tag, '', $content); + $js_locations[] = $this->get_js_location($src_match[1]); + } + } + } + + $js_locations = array_unique($js_locations); + + return array($content, $js_locations); + } + + function inject_js($content, $js_locations) { + if (count($js_locations) > 0) { + // build minify URLS + $js_tags = ''; + $minify_urls = $this->build_minify_urls($js_locations, '.js'); + + foreach ($minify_urls as $minify_url) { + $minify_url = apply_filters('wp_minify_js_url', $minify_url); // Allow plugins to modify final minify URL + $js_tags .= ""; + } + + $matches = preg_match('//', $content); + + if ($matches) { + $content = preg_replace('//', "$js_tags", $content, 1); // limit 1 replacement + } else { + $wpm_options = get_option($this->name); + if ($wpm_options['js_in_footer']) { + $content = preg_replace('/<\/body>/', "$js_tags\n", $content, 1); // limit 1 replacement + } else { + // HTML5 has
    tags so account for those in regex + $content = preg_replace('/|\s[^>]*?>)/', "\\0\n$js_tags", $content, 1); // limit 1 replacement + } + } + } + return $content; + } + + function pre_content() { + $wpm_options = get_option($this->name); + if ($wpm_options['uri_exclude'] && count($wpm_options['uri_exclude'])) { + foreach ($wpm_options['uri_exclude'] as $exclude_pat) { + $exclude_pat = trim($exclude_pat); + if (strlen($exclude_pat) > 0 && strpos($_SERVER['REQUEST_URI'], $exclude_pat) !== false) { + return; + } + } + } + + ob_start(array($this, 'modify_buffer')); + + // variable for sanity checking + $this->buffer_started = true; + } + + function modify_buffer($buffer) { + $wpm_options = get_option($this->name); + + // if we do not want to force http to https then we need to exclude https + if (!($wpm_options['force_https'] && $_SERVER["HTTPS"] == "on")) { + $this->default_exclude[] = 'https://'; + } + + // minify JS + if ($wpm_options['enable_js']) { + list($buffer, $js_locations) = $this->extract_js($buffer); + $buffer= $this->inject_js($buffer, $js_locations); + } + + // minify CSS (make sure to exclude CSS conditionals) + if ($wpm_options['enable_css']) { + list($buffer, $conditionals) = $this->extract_conditionals($buffer); + list($buffer, $css_locations) = $this->extract_css($buffer); + $buffer = $this->inject_css($buffer, $css_locations); + $buffer = $this->inject_conditionals($buffer, $conditionals); + } + + // get rid of empty lines + $buffer = preg_replace('/\s*(\r?\n)(\r?\n)*/', '$1', $buffer); + + // minify HTML + if ($wpm_options['enable_html']) { + if (!class_exists('Minify_HTML')) { + require_once('min/lib/Minify/HTML.php'); + } + $buffer = Minify_HTML::minify($buffer); + } + + $buffer = apply_filters('wp_minify_content', $buffer); // allow plugins to modify buffer + + return $buffer; + } + + function post_content() { + // sanity checking + if ($this->buffer_started) { + ob_end_flush(); + } + } + + function advertise() { + $wpm_options = get_option($this->name); + if ($wpm_options['show_link']) { + printf("

    Page optimized by $this->name_proper WordPress Plugin

    "); + } + } + +} // class WPMinify + +require_once('common.php'); +require_once('http_build_url.php'); +$wp_minify = new WPMinify(); +?>