diff options
author | Craig Andrews <candrews@integralblue.com> | 2009-12-04 18:44:26 -0500 |
---|---|---|
committer | Craig Andrews <candrews@integralblue.com> | 2009-12-04 18:44:26 -0500 |
commit | aab7344002fd390e5b62a3eb82f3a418fd294617 (patch) | |
tree | b214e7d4b3e9f0ca9818fea9e3d9efa0249c00c6 /plugins/Minify/extlib/minify/min/builder | |
parent | 1fd7e5e3794621993b01a5833faa8b6fa26c3847 (diff) | |
parent | 01b089d9be046db1253cb3bb90e8635b50fddd84 (diff) |
Merge branch 'minify' into 0.9.x
Diffstat (limited to 'plugins/Minify/extlib/minify/min/builder')
-rw-r--r-- | plugins/Minify/extlib/minify/min/builder/_index.js | 242 | ||||
-rw-r--r-- | plugins/Minify/extlib/minify/min/builder/bm.js | 36 | ||||
-rw-r--r-- | plugins/Minify/extlib/minify/min/builder/index.php | 182 | ||||
-rw-r--r-- | plugins/Minify/extlib/minify/min/builder/ocCheck.php | 36 | ||||
-rw-r--r-- | plugins/Minify/extlib/minify/min/builder/rewriteTest.js | 1 |
5 files changed, 497 insertions, 0 deletions
diff --git a/plugins/Minify/extlib/minify/min/builder/_index.js b/plugins/Minify/extlib/minify/min/builder/_index.js new file mode 100644 index 000000000..8e5313a3b --- /dev/null +++ b/plugins/Minify/extlib/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 '<li id="li' + MUB._uid + '">http://' + location.host + '/<input type=text size=20>' + + ' <button title="Remove">x</button> <button title="Include Earlier">↑</button>' + + ' <button title="Include Later">↓</button> <span></span></li>'; + } + /** + * 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('<button><b>404! </b> recheck</button>') + .find('button').click(function () { + MUB.liUpdateTestLink.call(li); + }); + } + } + ,dataType : 'text' + }); + } + /** + * Check all source URLs + */ + ,updateAllTestLinks : function () { + $('#sources li').each(MUB.liUpdateTestLink); + } + /** + * In a given array of strings, find the character they all have at + * a particular index + * @param Array arr array of strings + * @param Number pos index to check + * @return mixed a common char or '' if any do not match + */ + ,getCommonCharAtPos : function (arr, pos) { + var i + ,l = arr.length + ,c = arr[0].charAt(pos); + if (c === '' || l === 1) + return c; + for (i = 1; i < l; ++i) + if (arr[i].charAt(pos) !== c) + return ''; + return c; + } + /** + * Get the shortest URI to minify the set of source files + * @param Array sources URIs + */ + ,getBestUri : function (sources) { + var pos = 0 + ,base = '' + ,c; + while (true) { + c = MUB.getCommonCharAtPos(sources, pos); + if (c === '') + break; + else + base += c; + ++pos; + } + base = base.replace(/[^\/]+$/, ''); + var uri = MUB._minRoot + 'f=' + sources.join(','); + if (base.charAt(base.length - 1) === '/') { + // we have a base dir! + var basedSources = sources + ,i + ,l = sources.length; + for (i = 0; i < l; ++i) { + basedSources[i] = sources[i].substr(base.length); + } + base = base.substr(0, base.length - 1); + var bUri = MUB._minRoot + 'b=' + base + '&f=' + basedSources.join(','); + //window.console && console.log([uri, bUri]); + uri = uri.length < bUri.length + ? uri + : bUri; + } + return uri; + } + /** + * Create the Minify URI for the sources + */ + ,update : function () { + MUB.updateAllTestLinks(); + var sources = [] + ,ext = false + ,fail = false; + $('#sources input').each(function () { + var m, val; + if (! fail && this.value && (m = this.value.match(/\.(css|js)$/))) { + var thisExt = m[1]; + if (ext === false) + ext = thisExt; + else if (thisExt !== ext) { + fail = true; + return alert('extensions must match!'); + } + this.value = this.value.replace(/^\//, ''); + if (-1 != $.inArray(this.value, sources)) { + fail = true; + return alert('duplicate file!'); + } + sources.push(this.value); + } + }); + if (fail || ! sources.length) + return; + $('#groupConfig').val(" 'keyName' => array('//" + sources.join("', '//") + "'),"); + var uri = MUB.getBestUri(sources) + ,uriH = uri.replace(/</, '<').replace(/>/, '>').replace(/&/, '&'); + $('#uriA').html(uriH)[0].href = uri; + $('#uriHtml').val( + ext === 'js' + ? '<script type="text/javascript" src="' + uriH + '"></script>' + : '<link type="text/css" rel="stylesheet" href="' + uriH + '" />' + ); + $('#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('<p><strong>Found by bookmarklet:</strong> /<a href=#>' + + location.hash.substr(1).split(',').join('</a> | /<a href=#>') + + '</a></p>' + ); + $('#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/plugins/Minify/extlib/minify/min/builder/bm.js b/plugins/Minify/extlib/minify/min/builder/bm.js new file mode 100644 index 000000000..10d194381 --- /dev/null +++ b/plugins/Minify/extlib/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/plugins/Minify/extlib/minify/min/builder/index.php b/plugins/Minify/extlib/minify/min/builder/index.php new file mode 100644 index 000000000..1b2098222 --- /dev/null +++ b/plugins/Minify/extlib/minify/min/builder/index.php @@ -0,0 +1,182 @@ +<?php + +if (phpversion() < 5) { + exit('Minify requires PHP5 or greater.'); +} + +// check for auto-encoding +$encodeOutput = (function_exists('gzdeflate') + && !ini_get('zlib.output_compression')); + +require dirname(__FILE__) . '/../config.php'; + +if (! $min_enableBuilder) { + header('Location: /'); + exit(); +} + +ob_start(); +?> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<head> + <meta name="ROBOTS" content="NOINDEX, NOFOLLOW"> + <title>Minify URI Builder</title> + <style type="text/css"> +body {margin:1em 60px;} +h1, h2, h3 {margin-left:-25px; position:relative;} +h1 {margin-top:0;} +#sources {margin:0; padding:0;} +#sources li {margin:0 0 0 40px} +#sources li input {margin-left:2px} +#add {margin:5px 0 1em 40px} +.hide {display:none} +#uriTable {border-collapse:collapse;} +#uriTable td, #uriTable th {padding-top:10px;} +#uriTable th {padding-right:10px;} +#groupConfig {font-family:monospace;} +b {color:#c00} +.topNote {background: #ff9; display:inline-block; padding:.5em .6em; margin:0 0 1em;} +.topWarning {background:#c00; color:#fff; padding:.5em .6em; margin:0 0 1em;} + </style> +</head> + +<?php if (! isset($min_cachePath)): ?> +<p class=topNote><strong>Note:</strong> Please set <code>$min_cachePath</code> +in /min/config.php to improve performance.</p> +<?php endIf; ?> + +<p id=minRewriteFailed class="hide"><strong>Note:</strong> Your webserver does not seem to + support mod_rewrite (used in /min/.htaccess). Your Minify URIs will contain "?", which +<a href="http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/" +>may reduce the benefit of proxy cache servers</a>.</p> + +<h1>Minify URI Builder</h1> + +<noscript><p class="topNote">Javascript and a browser supported by jQuery 1.2.6 is required +for this application.</p></noscript> + +<div id=app class=hide> + +<p>Create a list of Javascript or CSS files (or 1 is fine) you'd like to combine +and click [Update].</p> + +<ol id=sources><li></li></ol> +<div id=add><button>Add file +</button></div> + +<div id=bmUris></div> + +<p><button id=update class=hide>Update</button></p> + +<div id=results class=hide> + +<h2>Minify URI</h2> +<p>Place this URI in your HTML to serve the files above combined, minified, compressed and +with cache headers.</p> +<table id=uriTable> + <tr><th>URI</th><td><a id=uriA class=ext>/min</a> <small>(opens in new window)</small></td></tr> + <tr><th>HTML</th><td><input id=uriHtml type=text size=100 readonly></td></tr> +</table> + +<h2>How to serve these files as a group</h2> +<p>For the best performance you can serve these files as a pre-defined group with a URI +like: <code><span class=minRoot>/min/?</span>g=keyName</code></p> +<p>To do this, add a line like this to /min/groupsConfig.php:</p> + +<pre><code>return array( + <span style="color:#666">... your existing groups here ...</span> +<input id=groupConfig size=100 type=text readonly> +);</code></pre> + +<p><em>Make sure to replace <code>keyName</code> with a unique key for this group.</em></p> +</div> + +<div id=getBm> +<h3>Find URIs on a Page</h3> +<p>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.</p> + +<p><a id=bm>Create Minify URIs</a> <small>(right-click, add to bookmarks)</small></p> +</div> + +<h3>Combining CSS files that contain <code>@import</code></h3> +<p>If your CSS files contain <code>@import</code> 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).</p> +<p>If you desire, you can use Minify URIs in imports and they will not be touched +by Minify. E.g. <code>@import "<span class=minRoot>/min/?</span>g=css2";</code></p> + +</div><!-- #app --> + +<hr> +<p>Need help? Search or post to the <a class=ext +href="http://groups.google.com/group/minify">Minify discussion list</a>.</p> +<p><small>This app is minified :) <a class=ext +href="http://code.google.com/p/minify/source/browse/trunk/min/builder/index.php">view +source</a></small></p> + +<script type="text/javascript" +src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script> + +<script type="text/javascript"> +$(function () { + // detection of double output encoding + var msg = '<\p class=topWarning><\strong>Warning:<\/strong> '; + var url = 'ocCheck.php?' + (new Date()).getTime(); + $.get(url, function (ocStatus) { + $.get(url + '&hello=1', function (ocHello) { + if (ocHello != 'World!') { + msg += 'It appears output is being automatically compressed, interfering ' + + ' with Minify\'s own compression. '; + if (ocStatus == '1') + msg += 'The option "zlib.output_compression" is enabled in your PHP configuration. ' + + 'Minify set this to "0", but it had no effect. This option must be disabled ' + + 'in php.ini or .htaccess.'; + else + msg += 'The option "zlib.output_compression" is disabled in your PHP configuration ' + + 'so this behavior is likely due to a server option.'; + $(document.body).prepend(msg + '<\/p>'); + } else + if (ocStatus == '1') + $(document.body).prepend('<\p class=topNote><\strong>Note:</\strong> The option ' + + '"zlib.output_compression" is enabled in your PHP configuration, but has been ' + + 'successfully disabled via ini_set(). If you experience mangled output you ' + + 'may want to consider disabling this option in your PHP configuration.<\/p>' + ); + }); + }); +}); +</script> +<script type="text/javascript"> + // workaround required to test when /min isn't child of web root + var src = location.pathname.replace(/\/[^\/]*$/, '/_index.js').substr(1); + document.write('<\script type="text/javascript" src="../?f=' + src + '"><\/script>'); +</script> + +<?php + +$serveOpts = array( + 'content' => 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/plugins/Minify/extlib/minify/min/builder/ocCheck.php b/plugins/Minify/extlib/minify/min/builder/ocCheck.php new file mode 100644 index 000000000..c47baa33d --- /dev/null +++ b/plugins/Minify/extlib/minify/min/builder/ocCheck.php @@ -0,0 +1,36 @@ +<?php +/** + * AJAX checks for zlib.output_compression + * + * @package Minify + */ + +$_oc = ini_get('zlib.output_compression'); + +// allow access only if builder is enabled +require dirname(__FILE__) . '/../config.php'; +if (! $min_enableBuilder) { + header('Location: /'); + exit(); +} + +if (isset($_GET['hello'])) { + // echo 'World!' + + // try to prevent double encoding (may not have an effect) + ini_set('zlib.output_compression', '0'); + + require $min_libPath . '/HTTP/Encoder.php'; + HTTP_Encoder::$encodeToIe6 = true; // just in case + $he = new HTTP_Encoder(array( + 'content' => 'World!' + ,'method' => 'deflate' + )); + $he->encode();
+ $he->sendAll();
+ +} else { + // echo status "0" or "1" + header('Content-Type: text/plain'); + echo (int)$_oc; +} diff --git a/plugins/Minify/extlib/minify/min/builder/rewriteTest.js b/plugins/Minify/extlib/minify/min/builder/rewriteTest.js new file mode 100644 index 000000000..56a6051ca --- /dev/null +++ b/plugins/Minify/extlib/minify/min/builder/rewriteTest.js @@ -0,0 +1 @@ +1
\ No newline at end of file |