Version 3.4.5

This commit is contained in:
Neo committed 2025-12-19 00:38:12 -08:00
1 parent fb6b5baabc
commit e4478369d8
1360 files changed
+228921 -179445

No files matched your search

+91 -73
View File
@@ -1,35 +1,38 @@
/*!
* Minify URI Builder
*/
var MUB = {
_uid : 0
,_minRoot : '/min/?'
,checkRewrite : function () {
_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) {
url : '../f=' + testUri + '&' + (new Date()).getTime(),
success : function (data) {
if (data === '1') {
MUB._minRoot = '/min/';
$('span.minRoot').html('/min/');
} else
fail();
}
,error : 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>';/*noLibHook*/
}
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 () {
addLi : function () {
$('#sources').append(MUB.newLi());
var li = $('#li' + MUB._uid)[0];
$('button[title=Remove]', li).click(function () {
@@ -58,22 +61,22 @@ var MUB = {
});
});
++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
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(/^\//, '');
var url = 'http://' + location.host + '/' +
$('input', this)[0].value.replace(/^\//, '');
$.ajax({
url : url
,complete : function (xhr, stat) {
if ('success' == stat)
url : url,
complete : function (xhr, stat) {
if ('success' === stat)
$('span', li).html('&#x2713;');
else {
$('span', li).html('<button><b>404! </b> recheck</button>')
@@ -81,16 +84,16 @@ var MUB = {
MUB.liUpdateTestLink.call(li);
});
}
}
,dataType : 'text'
},
dataType : 'text'
});
}
},
/**
* Check all source URLs
*/
,updateAllTestLinks : function () {
updateAllTestLinks : function () {
$('#sources li').each(MUB.liUpdateTestLink);
}
},
/**
* In a given array of strings, find the character they all have at
* a particular index
@@ -98,25 +101,25 @@ var MUB = {
* @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);
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;
getBestUri : function (sources) {
var pos = 0,
base = '',
c;
while (true) {
c = MUB.getCommonCharAtPos(sources, pos);
if (c === '')
@@ -129,29 +132,28 @@ var MUB = {
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;
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;
uri = uri.length < bUri.length ? uri : bUri;
}
return uri;
}
},
/**
* Create the Minify URI for the sources
*/
,update : function () {
update : function () {
MUB.updateAllTestLinks();
var sources = []
,ext = false
,fail = false;
var sources = [],
ext = false,
fail = false,
markup;
$('#sources input').each(function () {
var m, val;
if (! fail && this.value && (m = this.value.match(/\.(css|js)$/))) {
@@ -163,7 +165,7 @@ var MUB = {
return alert('extensions must match!');
}
this.value = this.value.replace(/^\//, '');
if (-1 != $.inArray(this.value, sources)) {
if (-1 !== $.inArray(this.value, sources)) {
fail = true;
return alert('duplicate file!');
}
@@ -173,35 +175,37 @@ var MUB = {
if (fail || ! sources.length)
return;
$('#groupConfig').val(" 'keyName' => array('//" + sources.join("', '//") + "'),");
var uri = MUB.getBestUri(sources)
,uriH = uri.replace(/</, '&lt;').replace(/>/, '&gt;').replace(/&/, '&amp;');
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 + '" />'
);
if (ext === 'js') {
markup = '<script type="text/javascript" src="' + uriH + '"></script>';
} else {
markup = '<link type="text/css" rel="stylesheet" href="' + uriH + '" />';
}
$('#uriHtml').val(markup);
$('#results').show();
}
},
/**
* Handler for the "Add file +" button
*/
,addButtonClick : function () {
addButtonClick : function () {
$('#results').hide();
MUB.addLi();
MUB.updateAllTestLinks();
$('#update').show().click(MUB.update);
$('#sources li:last input')[0].focus();
}
},
/**
* Runs on DOMready
*/
,init : function () {
init : function () {
$('#jsDidntLoad').remove();
$('#app').show();
$('#sources').html('');
$('#add button').click(MUB.addButtonClick);
// make easier to copy text out of
$('#uriHtml, #groupConfig').click(function () {
$('#uriHtml, #groupConfig, #symlinkOpt').click(function () {
this.select();
}).focus(function () {
this.select();
@@ -210,33 +214,47 @@ var MUB = {
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>'
);
var i = 0, found = location.hash.substr(1).split(','), l = found.length;
$('#bmUris').html('<p><strong>Found by bookmarklet:</strong> /</p>');
var $p = $('#bmUris p');
for (; i < l; i++) {
$p.append($('<a href=#></a>').text(found[i])[0]);
if (i < (l - 1)) {
$p.append(', /');
}
}
$('#bmUris a').click(function () {
MUB.addButtonClick();
$('#sources li:last input').val(this.innerHTML)
$('#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);
// setup bookmarklet 1
$.ajax({
url : '../?f=' + bmUri
,success : function (code) {
url : '../?f=' + location.pathname.replace(/\/[^\/]*$/, '/bm.js').substr(1),
success : function (code) {
$('#bm')[0].href = code
.replace('%BUILDER_URL%', location.href)
.replace(/\n/g, ' ');
}
,dataType : 'text'
},
dataType : 'text'
});
$.browser.msie && $('#getBm p:last').append(' Sorry, not supported in MSIE!');
if ($.browser.msie) {
$('#getBm p:last').append(' Sorry, not supported in MSIE!');
}
MUB.addButtonClick();
}
// setup bookmarklet 2
$.ajax({
url : '../?f=' + location.pathname.replace(/\/[^\/]*$/, '/bm2.js').substr(1),
success : function (code) {
$('#bm2')[0].href = code.replace(/\n/g, ' ');
},
dataType : 'text'
});
MUB.checkRewrite();
}
};
window.onload = MUB.init;
$(MUB.init);
+132 -67
View File
@@ -8,20 +8,55 @@ if (phpversion() < 5) {
$encodeOutput = (function_exists('gzdeflate')
&& !ini_get('zlib.output_compression'));
require dirname(__FILE__) . '/../config.php';/*noLibHook*/
// recommend $min_symlinks setting for Apache UserDir
$symlinkOption = '';
if (0 === strpos($_SERVER["SERVER_SOFTWARE"], 'Apache/')
&& preg_match('@^/\\~(\\w+)/@', $_SERVER['REQUEST_URI'], $m)
) {
$userDir = DIRECTORY_SEPARATOR . $m[1] . DIRECTORY_SEPARATOR;
if (false !== strpos(__FILE__, $userDir)) {
$sm = array();
$sm["//~{$m[1]}"] = dirname(dirname(__FILE__));
$array = str_replace('array (', 'array(', var_export($sm, 1));
$symlinkOption = "\$min_symlinks = $array;";
}
}
require dirname(__FILE__) . '/../config.php';
if (! $min_enableBuilder) {
header('Location: /');
exit();
}
$setIncludeSuccess = set_include_path(dirname(__FILE__) . '/../lib' . PATH_SEPARATOR . get_include_path());
// we do it this way because we want the builder to work after the user corrects
// include_path. (set_include_path returning FALSE is OK).
try {
require_once 'Minify/Cache/File.php';
} catch (Exception $e) {
if (! $setIncludeSuccess) {
echo "Minify: set_include_path() failed. You may need to set your include_path "
."outside of PHP code, e.g., in php.ini.";
} else {
echo $e->getMessage();
}
exit();
}
require 'Minify.php';
$cachePathCode = '';
if (! isset($min_cachePath) && ! function_exists('sys_get_temp_dir')) {
$detectedTmp = Minify_Cache_File::tmp();
$cachePathCode = "\$min_cachePath = " . var_export($detectedTmp, 1) . ';';
}
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">
<!DOCTYPE html>
<title>Minify URI Builder</title>
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
<style>
body {margin:1em 60px;}
h1, h2, h3 {margin-left:-25px; position:relative;}
h1 {margin-top:0;}
@@ -37,12 +72,30 @@ h1 {margin-top:0;}
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>
.topWarning a {color:#fff;}
#jsDidntLoad {display:none;}
</style>
<body>
<?php if ($symlinkOption): ?>
<div class=topNote><strong>Note:</strong> It looks like you're running Minify in a user
directory. You may need the following option in /min/config.php to have URIs
correctly rewritten in CSS output:
<br><textarea id=symlinkOpt rows=3 cols=80 readonly><?php echo htmlspecialchars($symlinkOption); ?></textarea>
</div>
<?php endif; ?>
<?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>
<p class=topWarning id=jsDidntLoad><strong>Uh Oh.</strong> Minify was unable to
serve Javascript for this app. To troubleshoot this,
<a href="http://code.google.com/p/minify/wiki/Debugging">enable FirePHP debugging</a>
and request the <a id=builderScriptSrc href=#>Minify URL</a> directly. Hopefully the
FirePHP console will report the cause of the error.
</p>
<?php if ($cachePathCode): ?>
<p class=topNote><strong>Note:</strong> <code><?php echo
htmlspecialchars($detectedTmp); ?></code> was discovered as a usable temp directory.<br>To
slightly improve performance you can hardcode this in /min/config.php:
<code><?php echo htmlspecialchars($cachePathCode); ?></code></p>
<?php endIf; ?>
<p id=minRewriteFailed class="hide"><strong>Note:</strong> Your webserver does not seem to
@@ -107,76 +160,88 @@ in your list, and move any others to the top of the first file in your list
<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>
<h3>Debug Mode</h3>
<p>When /min/config.php has <code>$min_allowDebugFlag = <strong>true</strong>;</code>
you can get debug output by appending <code>&amp;debug</code> to a Minify URL, or
by sending the cookie <code>minDebug=&lt;match&gt;</code>, where <code>&lt;match&gt;</code>
should be a string in the Minify URIs you'd like to debug. This bookmarklet will allow you to
set this cookie.</p>
<p><a id=bm2>Minify Debug</a> <small>(right-click, add to bookmarks)</small></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>
<p>Need help? Check the <a href="http://code.google.com/p/minify/w/list?can=3">wiki</a>,
or post to the <a class=ext href="http://groups.google.com/group/minify">discussion
list</a>.</p>
<p><small>Powered by Minify <?php echo Minify::VERSION; ?></small></p>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="jquery-1.6.3.min.js"><\/script>')</script>
<script>
(function () {
// workaround required to test when /min isn't child of web root
var src = "../?f=" + location.pathname.replace(/\/[^\/]*$/, '/_index.js').substr(1);
// load script immediately
document.write('<\script src="' + src + '"><\/script>');
$(function () {
$('#builderScriptSrc')[0].href = src;
// give Minify a few seconds to serve _index.js before showing scary red warning
setTimeout(function () {
if (! window.MUB) {
// Minify didn't load
$('#jsDidntLoad').css({display:'block'});
}
}, 3000);
<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>'
);
// 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>
</body>
<?php
$content = ob_get_clean();
$serveOpts = array(
'content' => ob_get_contents()
// setup Minify
Minify::setCache(
isset($min_cachePath) ? $min_cachePath : ''
,$min_cacheFileLocking
);
Minify::$uploaderHoursBehind = $min_uploaderHoursBehind;
Minify::serve('Page', array(
'content' => $content
,'id' => __FILE__
,'lastModifiedTime' => max(
// regenerate cache if either of these change
// regenerate cache if any of these change
filemtime(__FILE__)
,filemtime(dirname(__FILE__) . '/../config.php')
,filemtime(dirname(__FILE__) . '/../lib/Minify.php')
)
,'minifyAll' => true
,'encodeOutput' => $encodeOutput
);
ob_end_clean();
set_include_path(dirname(__FILE__) . '/../lib' . PATH_SEPARATOR . get_include_path());
require 'Minify.php';/*noLibHook*/
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);
));
+2 -2
View File
@@ -8,7 +8,7 @@
$_oc = ini_get('zlib.output_compression');
// allow access only if builder is enabled
require dirname(__FILE__) . '/../config.php';/*noLibHook*/
require dirname(__FILE__) . '/../config.php';
if (! $min_enableBuilder) {
header('Location: /');
exit();
@@ -20,7 +20,7 @@ if (isset($_GET['hello'])) {
// try to prevent double encoding (may not have an effect)
ini_set('zlib.output_compression', '0');
require $min_libPath . '/HTTP/Encoder.php';/*noLibHook*/
require $min_libPath . '/HTTP/Encoder.php';
HTTP_Encoder::$encodeToIe6 = true; // just in case
$he = new HTTP_Encoder(array(
'content' => 'World!'