aboutsummaryrefslogtreecommitdiff
path: root/mod/minify/vendors/min/builder
diff options
context:
space:
mode:
Diffstat (limited to 'mod/minify/vendors/min/builder')
-rw-r--r--mod/minify/vendors/min/builder/_index.js242
-rw-r--r--mod/minify/vendors/min/builder/bm.js36
-rw-r--r--mod/minify/vendors/min/builder/index.php182
-rw-r--r--mod/minify/vendors/min/builder/ocCheck.php36
-rw-r--r--mod/minify/vendors/min/builder/rewriteTest.js1
5 files changed, 497 insertions, 0 deletions
diff --git a/mod/minify/vendors/min/builder/_index.js b/mod/minify/vendors/min/builder/_index.js
new file mode 100644
index 000000000..8e5313a3b
--- /dev/null
+++ b/mod/minify/vendors/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">&uarr;</button>'
+ + ' <button title="Include Later">&darr;</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('&#x2713;');
+ 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(/</, '&lt;').replace(/>/, '&gt;').replace(/&/, '&amp;');
+ $('#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/mod/minify/vendors/min/builder/bm.js b/mod/minify/vendors/min/builder/bm.js
new file mode 100644
index 000000000..10d194381
--- /dev/null
+++ b/mod/minify/vendors/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/mod/minify/vendors/min/builder/index.php b/mod/minify/vendors/min/builder/index.php
new file mode 100644
index 000000000..1b2098222
--- /dev/null
+++ b/mod/minify/vendors/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 &amp; 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/mod/minify/vendors/min/builder/ocCheck.php b/mod/minify/vendors/min/builder/ocCheck.php
new file mode 100644
index 000000000..c47baa33d
--- /dev/null
+++ b/mod/minify/vendors/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/mod/minify/vendors/min/builder/rewriteTest.js b/mod/minify/vendors/min/builder/rewriteTest.js
new file mode 100644
index 000000000..56a6051ca
--- /dev/null
+++ b/mod/minify/vendors/min/builder/rewriteTest.js
@@ -0,0 +1 @@
+1 \ No newline at end of file