mirror of
https://github.com/mrclay/minify.git
synced 2025-08-07 22:56:33 +02:00
Issue 129 : Minify HTML page by prepending pageBuffer.php. Kind of a souped up http://www.mnot.net/cgi_buffer/
This commit is contained in:
92
min/pageBuffer.php
Normal file
92
min/pageBuffer.php
Normal file
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
/**
|
||||
* Include for serving HTML pages through Minify
|
||||
*
|
||||
* DO NOT EDIT! Configure this utility via pageConfig.php
|
||||
*
|
||||
* @package Minify
|
||||
*/
|
||||
|
||||
$_min_preIncludedFiles = get_included_files();
|
||||
|
||||
function ob_minify_page($content) {
|
||||
global $min_serveOptions, $min_cacheMaxAge;
|
||||
|
||||
$includedFiles = array_diff(
|
||||
$GLOBALS['_min_preIncludedFiles'], get_included_files()
|
||||
);
|
||||
$includedFiles[] = realpath($_SERVER['SCRIPT_FILENAME']);
|
||||
$mtime = 0;
|
||||
foreach ($includedFiles as $file) {
|
||||
$mtime = max($mtime, filemtime($file));
|
||||
}
|
||||
|
||||
define('MINIFY_MIN_DIR', dirname(__FILE__));
|
||||
|
||||
// load config
|
||||
require MINIFY_MIN_DIR . '/pageConfig.php';
|
||||
|
||||
// setup include path
|
||||
set_include_path($min_libPath . PATH_SEPARATOR . get_include_path());
|
||||
|
||||
require $min_libPath . '/Minify.php';
|
||||
|
||||
Minify::$uploaderHoursBehind = $min_uploaderHoursBehind;
|
||||
Minify::setCache(
|
||||
isset($min_cachePath) ? $min_cachePath : ''
|
||||
,$min_cacheFileLocking
|
||||
);
|
||||
|
||||
if ($min_errorLogger) {
|
||||
require_once $min_libPath . '/Minify/Logger.php';
|
||||
if (true === $min_errorLogger) {
|
||||
require_once $min_libPath . '/FirePHP.php';
|
||||
Minify_Logger::setLogger(FirePHP::getInstance(true));
|
||||
} else {
|
||||
Minify_Logger::setLogger($min_errorLogger);
|
||||
}
|
||||
}
|
||||
|
||||
// some array keys may already be set in globals
|
||||
$min_serveOptions['id'] = $_SERVER['SCRIPT_FILENAME'];
|
||||
$min_serveOptions['content'] = $content;
|
||||
$min_serveOptions['lastModified'] = $mtime;
|
||||
$min_serveOptions['minifyAll'] = true;
|
||||
$min_serveOptions['quiet'] = true;
|
||||
|
||||
// page option: $min_lastModified
|
||||
if (isset($GLOBALS['min_lastModified'])) {
|
||||
$min_serveOptions['lastModified'] = $GLOBALS['min_lastModified'];
|
||||
}
|
||||
|
||||
if ($min_cacheMaxAge) {
|
||||
$min_serveOptions['lastModified'] = _steppedTime(
|
||||
$min_cacheMaxAge, $_SERVER['SCRIPT_FILENAME']);
|
||||
}
|
||||
|
||||
$out = Minify::serve('Page', $min_serveOptions);
|
||||
|
||||
foreach ($out['headers'] as $prop => $value) {
|
||||
header($prop === '_responseCode' ? $value : "{$prop}: {$value}");
|
||||
}
|
||||
return $out['content'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a stepped version of time with a random-like constistent offset
|
||||
*
|
||||
* This emulates the mtime() of a file being modified regularly. The offset
|
||||
* allows you to use the same period in several instances without them all
|
||||
* stepping up simultaneously. Offsets should be evenly distributed.
|
||||
*
|
||||
* @param int $period in seconds
|
||||
* @param string $instanceId
|
||||
* @return int
|
||||
*/
|
||||
function _steppedTime($period, $instanceId = '') {
|
||||
$hashInt = hexdec(substr(md5($instanceId), 0, 8));
|
||||
$t = $_SERVER['REQUEST_TIME'];
|
||||
return $t - ($t % $period) - ($hashInt % $period);
|
||||
}
|
||||
|
||||
ob_start('ob_minify_page');
|
82
min/pageConfig.php
Normal file
82
min/pageConfig.php
Normal file
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
/**
|
||||
* Configuration for pageBuffer.php
|
||||
* @package Minify
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Set to true to log messages to FirePHP (Firefox Firebug addon).
|
||||
* Set to false for no error logging (Minify may be slightly faster).
|
||||
* @link http://www.firephp.org/
|
||||
*
|
||||
* If you want to use a custom error logger, set this to your logger
|
||||
* instance. Your object should have a method log(string $message).
|
||||
*
|
||||
* @todo cache system does not have error logging yet.
|
||||
*/
|
||||
$min_errorLogger = false;
|
||||
|
||||
|
||||
/**
|
||||
* For best performance, specify your temp directory here. Otherwise Minify
|
||||
* will have to load extra code to guess. Some examples below:
|
||||
*/
|
||||
//$min_cachePath = 'c:\\WINDOWS\\Temp';
|
||||
//$min_cachePath = '/tmp';
|
||||
//$min_cachePath = preg_replace('/^\\d+;/', '', session_save_path());
|
||||
|
||||
|
||||
/**
|
||||
* Cache file locking. Set to false if filesystem is NFS. On at least one
|
||||
* NFS system flock-ing attempts stalled PHP for 30 seconds!
|
||||
*/
|
||||
$min_cacheFileLocking = true;
|
||||
|
||||
|
||||
/**
|
||||
* Maximum age of browser cache in seconds. After this period, the browser
|
||||
* will send another conditional GET. Use a longer period for lower traffic
|
||||
* but you may want to shorten this before making changes if it's crucial
|
||||
* those changes are seen immediately.
|
||||
*/
|
||||
$min_serveOptions['maxAge'] = 1800;
|
||||
|
||||
|
||||
/**
|
||||
* By default Minify will check the mtime of the loaded page and any pages it
|
||||
* includes to determine the last modified time. If you would rather have it
|
||||
* regularly rebuild the cache, set this to the period, in seconds, that the
|
||||
* cache should be rebuilt (note this only occurs if a request is made).
|
||||
*/
|
||||
$min_cacheMaxAge = false;
|
||||
|
||||
|
||||
/**
|
||||
* If you upload files from Windows to a non-Windows server, Windows may report
|
||||
* incorrect mtimes for the files. This may cause Minify to keep serving stale
|
||||
* cache files when source file changes are made too frequently (e.g. more than
|
||||
* once an hour).
|
||||
*
|
||||
* Immediately after modifying and uploading a file, use the touch command to
|
||||
* update the mtime on the server. If the mtime jumps ahead by a number of hours,
|
||||
* set this variable to that number. If the mtime moves back, this should not be
|
||||
* needed.
|
||||
*
|
||||
* In the Windows SFTP client WinSCP, there's an option that may fix this
|
||||
* issue without changing the variable below. Under login > environment,
|
||||
* select the option "Adjust remote timestamp with DST".
|
||||
* @link http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time
|
||||
*/
|
||||
$min_uploaderHoursBehind = 0;
|
||||
|
||||
|
||||
/**
|
||||
* Path to Minify's lib folder. If you happen to move it, change
|
||||
* this accordingly.
|
||||
*/
|
||||
$min_libPath = dirname(__FILE__) . '/lib';
|
||||
|
||||
|
||||
// try to disable output_compression (may not have an effect)
|
||||
ini_set('zlib.output_compression', '0');
|
96
min/test/pageBuffer.php
Normal file
96
min/test/pageBuffer.php
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
require '../pageBuffer.php';
|
||||
?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
|
||||
<head>
|
||||
<!-- comments get removed -->
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
|
||||
<meta name="author" content="Dave Shea" />
|
||||
<!-- also whitespace around block or undisplayed elements -->
|
||||
<meta name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display" />
|
||||
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design." />
|
||||
<meta name="robots" content="all" />
|
||||
<title>css Zen Garden: The Beauty in CSS Design</title>
|
||||
|
||||
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
|
||||
<script type="text/javascript"><!--
|
||||
// js comment inside SCRIPT element
|
||||
var is = {
|
||||
ie: navigator.appName == 'Microsoft Internet Explorer',
|
||||
java: navigator.javaEnabled(),
|
||||
ns: navigator.appName == 'Netscape',
|
||||
ua: navigator.userAgent.toLowerCase(),
|
||||
version: parseFloat(navigator.appVersion.substr(21)) ||
|
||||
parseFloat(navigator.appVersion),
|
||||
win: navigator.platform == 'Win32'
|
||||
}
|
||||
is.mac = is.ua.indexOf('mac') >= 0;
|
||||
if (is.ua.indexOf('opera') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.opera = true;
|
||||
}
|
||||
if (is.ua.indexOf('gecko') >= 0) {
|
||||
is.ie = is.ns = false;
|
||||
is.gecko = true;
|
||||
}
|
||||
// --></script>
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
var i = 0;
|
||||
while (++i < 10)
|
||||
{
|
||||
// ...
|
||||
}
|
||||
//]]>
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
/* <![CDATA[ */ i = 1; /* ]]> */
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
(i < 1); /* CDATA needed */
|
||||
</script>
|
||||
<!--[if IE 6]>
|
||||
<style type="text/css">
|
||||
/*! copyright: you'll need CDATA for this < & */
|
||||
body {background:white;}
|
||||
</style>
|
||||
<![endif]-->
|
||||
<style type="text/css" title="currentStyle" media="screen">
|
||||
@import "/001/001.css";
|
||||
/*\*/ css hack {} /* */
|
||||
/* normal CSS comment */
|
||||
/*/*/ css hack {} /* */
|
||||
css hack {
|
||||
display/**/:/**/none;
|
||||
display:none;
|
||||
}
|
||||
</style>
|
||||
<link
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
title="RSS"
|
||||
href="http://www.csszengarden.com/zengarden.xml" />
|
||||
</head>
|
||||
<body id="css-zen-garden">
|
||||
<!--[if !IE]>--><p>Browser != IE</p><!--<![endif]-->
|
||||
<div id="container">
|
||||
<div id="pageHeader">
|
||||
<h1><span>css Zen Garden</span></h1>
|
||||
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
|
||||
Design</span></h2>
|
||||
</div>
|
||||
<pre>
|
||||
White space is important here!
|
||||
</pre>
|
||||
<div id="quickSummary">
|
||||
<p class="p1"><span>A demonstration of what can be accomplished visually through <acronym title="Cascading Style Sheets">CSS</acronym>-based design. Select any style sheet from the list to load it into this page.</span></p>
|
||||
<p class="p2"><span>Download the sample <a href="/zengarden-sample.html" title="This page's source HTML code, not to be modified.">html file</a> and <a href="/zengarden-sample.css" title="This page's sample CSS, the file you may modify.">css file</a></span></p>
|
||||
</div>
|
||||
<textarea name="comment" id="comment" rows="6" class="maxwidth" cols="80">66666
|
||||
|
||||
1234567890</textarea>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user