mirror of
https://github.com/mrclay/minify.git
synced 2025-09-06 12:10:45 +02:00
Compare commits
52 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
45463786f8 | ||
|
00e5e20abe | ||
|
9e182a6255 | ||
|
bc1ffdc5fc | ||
|
aa3721156e | ||
|
3047f5c48f | ||
|
104ccd2bfe | ||
|
dc02cdfba7 | ||
|
23f055d3f5 | ||
|
4970127e91 | ||
|
39c37bdd8c | ||
|
4a9d0595e3 | ||
|
ca8fdc6fdd | ||
|
8c69866874 | ||
|
ae5b9f0bfb | ||
|
e74adc4f6b | ||
|
5dee6538be | ||
|
455084b284 | ||
|
5112bb50f4 | ||
|
1962d3614c | ||
|
2226a6add1 | ||
|
8b91de51c3 | ||
|
1c000f9d05 | ||
|
cbda49556e | ||
|
b314554a0f | ||
|
9dac0ac873 | ||
|
c80add80a2 | ||
|
ad732493b8 | ||
|
ad0fb95556 | ||
|
f1572a580a | ||
|
40f9dafe5f | ||
|
c814ff4bae | ||
|
8382fb85d8 | ||
|
efec97278f | ||
|
e9d4db41ac | ||
|
b89bc57164 | ||
|
69e3eb241f | ||
|
b17c00c05c | ||
|
e3fe3001c3 | ||
|
8600312ed1 | ||
|
070c6c0349 | ||
|
b31855f6b8 | ||
|
031e804d08 | ||
|
263381a23f | ||
|
a36bfd50b0 | ||
|
8dba84a2d2 | ||
|
0f607be23a | ||
|
d2a3e8c1d2 | ||
|
e59454bed5 | ||
|
eb5197f9d4 | ||
|
20f336f598 | ||
|
94829874f9 |
44
.php_cs
44
.php_cs
@@ -1,27 +1,23 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$finder = Symfony\CS\Finder\DefaultFinder::create()
|
$rules = array(
|
||||||
->in(__DIR__ . '/lib')
|
'@PSR2' => true,
|
||||||
;
|
);
|
||||||
|
|
||||||
return Symfony\CS\Config\Config::create()
|
$config = PhpCsFixer\Config::create();
|
||||||
->level(Symfony\CS\FixerInterface::PSR2_LEVEL)
|
$finder = $config->getFinder();
|
||||||
->setUsingCache(true)
|
|
||||||
->fixers(array(
|
$finder
|
||||||
'linefeed',
|
->in(array('.', 'builder/', 'lib/', 'tests/', 'min_extras/', 'static/'))
|
||||||
'trailing_spaces',
|
->name('*.php')
|
||||||
'unused_use',
|
->ignoreDotFiles(true)
|
||||||
'short_tag',
|
->ignoreVCS(true);
|
||||||
'return',
|
|
||||||
'visibility',
|
return $config
|
||||||
'php_closing_tag',
|
->setUsingCache(true)
|
||||||
'extra_empty_lines',
|
->setRiskyAllowed(true)
|
||||||
'function_declaration',
|
->setRules($rules)
|
||||||
'include',
|
->setIndent(' ')
|
||||||
'controls_spaces',
|
->setLineEnding("\n");
|
||||||
'elseif',
|
|
||||||
'-eof_ending',
|
// vim:ft=php
|
||||||
'-method_argument_space',
|
|
||||||
))
|
|
||||||
->finder($finder)
|
|
||||||
;
|
|
||||||
|
6
.semver
Normal file
6
.semver
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
:major: 3
|
||||||
|
:minor: 0
|
||||||
|
:patch: 14
|
||||||
|
:special: ''
|
||||||
|
:metadata: ''
|
16
.travis.yml
16
.travis.yml
@@ -5,8 +5,8 @@ dist: trusty
|
|||||||
jobs:
|
jobs:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- php: "7.4snapshot"
|
|
||||||
- php: "nightly"
|
- php: "nightly"
|
||||||
|
- name: "Php CS Fixer"
|
||||||
include:
|
include:
|
||||||
- php: "5.3"
|
- php: "5.3"
|
||||||
dist: precise
|
dist: precise
|
||||||
@@ -17,7 +17,12 @@ jobs:
|
|||||||
- php: "7.1"
|
- php: "7.1"
|
||||||
- php: "7.2"
|
- php: "7.2"
|
||||||
- php: "7.3"
|
- php: "7.3"
|
||||||
- php: "7.4snapshot"
|
- php: "7.4"
|
||||||
|
- php: "nightly"
|
||||||
|
- name: "Php CS Fixer"
|
||||||
|
php: "7.3"
|
||||||
|
env:
|
||||||
|
- PHP_CS_FIXER=1
|
||||||
|
|
||||||
env:
|
env:
|
||||||
- CLOSURE_VERSION: 20161024
|
- CLOSURE_VERSION: 20161024
|
||||||
@@ -37,7 +42,14 @@ before_script:
|
|||||||
- tests/dl-closure.sh
|
- tests/dl-closure.sh
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- PATH=vendor/bin:$PATH
|
||||||
- composer validate
|
- composer validate
|
||||||
|
- |
|
||||||
|
if [ "$PHP_CS_FIXER" ]; then
|
||||||
|
composer config --unset platform.php
|
||||||
|
composer require --dev friendsofphp/php-cs-fixer:2.16
|
||||||
|
php-cs-fixer fix --verbose --diff --dry-run --ansi
|
||||||
|
fi
|
||||||
- vendor/bin/phpunit --verbose
|
- vendor/bin/phpunit --verbose
|
||||||
|
|
||||||
# vim:ts=2:sw=2:et
|
# vim:ts=2:sw=2:et
|
||||||
|
64
CHANGELOG.md
64
CHANGELOG.md
@@ -5,6 +5,70 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
## [4.0.0] - 2024-01-04
|
||||||
|
|
||||||
|
- Support PHP 8.1+
|
||||||
|
- Update PHPUnit to 8.x
|
||||||
|
- Replace `leafo/scssphp` with `scssphp/scssphp`
|
||||||
|
|
||||||
|
## [3.0.14] - 2023-05-05
|
||||||
|
|
||||||
|
- Support monolog v3, [#705]
|
||||||
|
- Allow invalidation from manual invocation, [#700]
|
||||||
|
- Add property declaration, [#699]
|
||||||
|
|
||||||
|
[3.0.14]: https://github.com/mrclay/minify/compare/3.0.13...3.0.14
|
||||||
|
[#705]: https://github.com/mrclay/minify/pull/705
|
||||||
|
[#700]: https://github.com/mrclay/minify/pull/700
|
||||||
|
[#699]: https://github.com/mrclay/minify/pull/699
|
||||||
|
|
||||||
|
## [3.0.13] - 2022-10-03
|
||||||
|
|
||||||
|
- Add `Minify_Cache_APCu` to replace `Minify_Cache_APC`, [#697]
|
||||||
|
- Require `marcusschwarz/lesserphp:^0.5.5` to fix php 7.4 compatibility, [#688]
|
||||||
|
|
||||||
|
[3.0.13]: https://github.com/mrclay/minify/compare/3.0.12...3.0.13
|
||||||
|
[#697]: https://github.com/mrclay/minify/pull/697
|
||||||
|
[#688]: https://github.com/mrclay/minify/pull/688
|
||||||
|
|
||||||
|
## [3.0.12] - 2022-05-14
|
||||||
|
|
||||||
|
- Update jquery to 1.12.4 to avoid xss attacks, [#692]
|
||||||
|
- Fix null argument to preg_split, [#696], [#695]
|
||||||
|
|
||||||
|
[3.0.12]: https://github.com/mrclay/minify/compare/3.0.11...3.0.12
|
||||||
|
[#692]: https://github.com/mrclay/minify/pull/692
|
||||||
|
[#696]: https://github.com/mrclay/minify/pull/696
|
||||||
|
[#695]: https://github.com/mrclay/minify/issues/695
|
||||||
|
|
||||||
|
## [3.0.11] - 2021-03-11
|
||||||
|
|
||||||
|
- PHP 8.0 support, [#685], [#682], [#677]
|
||||||
|
|
||||||
|
[3.0.11]: https://github.com/mrclay/minify/compare/3.0.10...3.0.11
|
||||||
|
[#685]: https://github.com/mrclay/minify/pull/685
|
||||||
|
[#682]: https://github.com/mrclay/minify/pull/682
|
||||||
|
[#677]: https://github.com/mrclay/minify/pull/677
|
||||||
|
|
||||||
|
## [3.0.10] - 2020-04-02
|
||||||
|
|
||||||
|
- Exclude SSI Comments from HTML minify, [#670], [#671]
|
||||||
|
|
||||||
|
[3.0.10]: https://github.com/mrclay/minify/compare/3.0.9...3.0.10
|
||||||
|
[#671]: https://github.com/mrclay/minify/issues/671
|
||||||
|
[#670]: https://github.com/mrclay/minify/pull/670
|
||||||
|
|
||||||
|
## [3.0.9] - 2020-03-24
|
||||||
|
|
||||||
|
- Allow `intervention/httpauth` 3.x, [#667], [#666], [#664]
|
||||||
|
|
||||||
|
[3.0.9]: https://github.com/mrclay/minify/compare/3.0.8...3.0.9
|
||||||
|
[#664]: https://github.com/mrclay/minify/issues/664
|
||||||
|
[#666]: https://github.com/mrclay/minify/pull/666
|
||||||
|
[#667]: https://github.com/mrclay/minify/pull/667
|
||||||
|
|
||||||
## [3.0.8] - 2020-03-19
|
## [3.0.8] - 2020-03-19
|
||||||
|
|
||||||
- Removed deprecated get_magic_quotes_gpc() function that since PHP 5.4.0 returns FALSE always, and since PHP 7.4 is deprecated, [#661]
|
- Removed deprecated get_magic_quotes_gpc() function that since PHP 5.4.0 returns FALSE always, and since PHP 7.4 is deprecated, [#661]
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$app = (require __DIR__ . '/../bootstrap.php');
|
$app = (require __DIR__ . '/../bootstrap.php');
|
||||||
/* @var \Minify\App $app */
|
/* @var \Minify\App $app */
|
||||||
@@ -153,8 +153,8 @@ by Minify. E.g. <code>@import "<span class=minRoot>/min/?</span>g=css2";</code><
|
|||||||
list</a>.</p>
|
list</a>.</p>
|
||||||
<p><small>Powered by Minify <?php echo Minify::VERSION; ?></small></p>
|
<p><small>Powered by Minify <?php echo Minify::VERSION; ?></small></p>
|
||||||
|
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||||
<script>window.jQuery || document.write('<script src="jquery-1.6.3.min.js"><\/script>')</script>
|
<script>window.jQuery || document.write('<script src="jquery-1.12.4.min.js"><\/script>')</script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
// workaround required to test when /min isn't child of web root
|
// workaround required to test when /min isn't child of web root
|
||||||
|
5
builder/jquery-1.12.4.min.js
vendored
Normal file
5
builder/jquery-1.12.4.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
builder/jquery-1.6.3.min.js
vendored
4
builder/jquery-1.6.3.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* AJAX checks for zlib.output_compression
|
* AJAX checks for zlib.output_compression
|
||||||
*
|
*
|
||||||
* @package Minify
|
* @package Minify
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -29,7 +29,6 @@ if ($app->env->get('hello')) {
|
|||||||
));
|
));
|
||||||
$he->encode();
|
$he->encode();
|
||||||
$he->sendAll();
|
$he->sendAll();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// echo status "0" or "1"
|
// echo status "0" or "1"
|
||||||
header('Content-Type: text/plain');
|
header('Content-Type: text/plain');
|
||||||
|
@@ -37,7 +37,7 @@ if (isset($_GET['oc'])) {
|
|||||||
echo "<p class=topNote><strong>\$_SERVER['SUBDOMAIN_DOCUMENT_ROOT'] is set.</strong> "
|
echo "<p class=topNote><strong>\$_SERVER['SUBDOMAIN_DOCUMENT_ROOT'] is set.</strong> "
|
||||||
. "You may need to set \$min_documentRoot to this in config.php</p>";
|
. "You may need to set \$min_documentRoot to this in config.php</p>";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//*/
|
//*/
|
||||||
|
@@ -17,32 +17,36 @@
|
|||||||
"wiki": "https://github.com/mrclay/minify/blob/master/docs"
|
"wiki": "https://github.com/mrclay/minify/blob/master/docs"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"classmap": ["lib/"]
|
"classmap": [
|
||||||
|
"lib/"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {"Minify\\Test\\": "tests/"}
|
"psr-4": {
|
||||||
|
"Minify\\Test\\": "tests/"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"platform": {
|
"platform": {
|
||||||
"php": "5.3.29"
|
"php": "8.1.0"
|
||||||
},
|
},
|
||||||
"sort-packages": true
|
"sort-packages": true
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^5.3.0 || ^7.0",
|
"php": "^8.1",
|
||||||
"ext-pcre": "*",
|
"ext-pcre": "*",
|
||||||
"intervention/httpauth": "~2.0",
|
"intervention/httpauth": "^2.0|^3.0",
|
||||||
"marcusschwarz/lesserphp": "^0.5.1",
|
"marcusschwarz/lesserphp": "^0.5.5",
|
||||||
"monolog/monolog": "~1.1|~2.0",
|
"monolog/monolog": "~1.1|~2.0|~3.0",
|
||||||
"mrclay/jsmin-php": "~2",
|
"mrclay/jsmin-php": "~2",
|
||||||
"mrclay/props-dic": "^2.2|^3.0",
|
"mrclay/props-dic": "^4",
|
||||||
"tubalmartin/cssmin": "~4"
|
"tubalmartin/cssmin": "~4"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"firephp/firephp-core": "~0.4.0",
|
"firephp/firephp-core": "~0.4.0",
|
||||||
"leafo/scssphp": "^0.3 || ^0.6 || ^0.7",
|
|
||||||
"meenie/javascript-packer": "~1.1",
|
"meenie/javascript-packer": "~1.1",
|
||||||
"phpunit/phpunit": "^4.8.36",
|
"phpunit/phpunit": "^8",
|
||||||
|
"scssphp/scssphp": "^1.12",
|
||||||
"tedivm/jshrink": "~1.1.0"
|
"tedivm/jshrink": "~1.1.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
|
@@ -4,7 +4,6 @@
|
|||||||
*
|
*
|
||||||
* To test config options, place them in this file and add "&test" to your Minify URL.
|
* To test config options, place them in this file and add "&test" to your Minify URL.
|
||||||
* Note that if this is on a public server, anyone can execute your test.
|
* Note that if this is on a public server, anyone can execute your test.
|
||||||
*
|
*
|
||||||
* @package Minify
|
* @package Minify
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
39
config.php
39
config.php
@@ -2,7 +2,7 @@
|
|||||||
/**
|
/**
|
||||||
* Configuration for "min", the default application built with the Minify
|
* Configuration for "min", the default application built with the Minify
|
||||||
* library
|
* library
|
||||||
*
|
*
|
||||||
* @package Minify
|
* @package Minify
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ $min_errorLogger = false;
|
|||||||
* /min/f=file1.js send the cookie minDebug=file1.js
|
* /min/f=file1.js send the cookie minDebug=file1.js
|
||||||
* You can manually enable debugging by appending "&debug" to a URI.
|
* You can manually enable debugging by appending "&debug" to a URI.
|
||||||
* E.g. /min/?f=script1.js,script2.js&debug
|
* E.g. /min/?f=script1.js,script2.js&debug
|
||||||
*
|
*
|
||||||
* In 'debug' mode, Minify combines files with no minification and adds comments
|
* In 'debug' mode, Minify combines files with no minification and adds comments
|
||||||
* to indicate line #s of the original files.
|
* to indicate line #s of the original files.
|
||||||
*/
|
*/
|
||||||
@@ -73,11 +73,11 @@ $min_allowDebugFlag = false;
|
|||||||
/**
|
/**
|
||||||
* Leave an empty string to use PHP's $_SERVER['DOCUMENT_ROOT'].
|
* Leave an empty string to use PHP's $_SERVER['DOCUMENT_ROOT'].
|
||||||
*
|
*
|
||||||
* On some servers, this value may be misconfigured or missing. If so, set this
|
* On some servers, this value may be misconfigured or missing. If so, set this
|
||||||
* to your full document root path with no trailing slash.
|
* to your full document root path with no trailing slash.
|
||||||
* E.g. '/home/accountname/public_html' or 'c:\\xampp\\htdocs'
|
* E.g. '/home/accountname/public_html' or 'c:\\xampp\\htdocs'
|
||||||
*
|
*
|
||||||
* If /min/ is directly inside your document root, just uncomment the
|
* If /min/ is directly inside your document root, just uncomment the
|
||||||
* second line. The third line might work on some Apache servers.
|
* second line. The third line might work on some Apache servers.
|
||||||
*/
|
*/
|
||||||
$min_documentRoot = '';
|
$min_documentRoot = '';
|
||||||
@@ -87,7 +87,7 @@ $min_documentRoot = '';
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cache file locking. Set to false if filesystem is NFS. On at least one
|
* Cache file locking. Set to false if filesystem is NFS. On at least one
|
||||||
* NFS system flock-ing attempts stalled PHP for 30 seconds!
|
* NFS system flock-ing attempts stalled PHP for 30 seconds!
|
||||||
*/
|
*/
|
||||||
$min_cacheFileLocking = true;
|
$min_cacheFileLocking = true;
|
||||||
@@ -96,9 +96,9 @@ $min_cacheFileLocking = true;
|
|||||||
/**
|
/**
|
||||||
* Combining multiple CSS files can place @import declarations after rules, which
|
* Combining multiple CSS files can place @import declarations after rules, which
|
||||||
* is invalid. Minify will attempt to detect when this happens and place a
|
* is invalid. Minify will attempt to detect when this happens and place a
|
||||||
* warning comment at the top of the CSS output. To resolve this you can either
|
* warning comment at the top of the CSS output. To resolve this you can either
|
||||||
* move the @imports within your CSS files, or enable this option, which will
|
* move the @imports within your CSS files, or enable this option, which will
|
||||||
* move all @imports to the top of the output. Note that moving @imports could
|
* move all @imports to the top of the output. Note that moving @imports could
|
||||||
* affect CSS values (which is why this option is disabled by default).
|
* affect CSS values (which is why this option is disabled by default).
|
||||||
*/
|
*/
|
||||||
$min_serveOptions['bubbleCssImports'] = false;
|
$min_serveOptions['bubbleCssImports'] = false;
|
||||||
@@ -134,8 +134,8 @@ $min_serveOptions['maxAge'] = 1800;
|
|||||||
* particular directories below DOCUMENT_ROOT, set this here.
|
* particular directories below DOCUMENT_ROOT, set this here.
|
||||||
* You will still need to include the directory in the
|
* You will still need to include the directory in the
|
||||||
* f or b GET parameters.
|
* f or b GET parameters.
|
||||||
*
|
*
|
||||||
* // = shortcut for DOCUMENT_ROOT
|
* // = shortcut for DOCUMENT_ROOT
|
||||||
*/
|
*/
|
||||||
//$min_serveOptions['minApp']['allowDirs'] = array('//js', '//css');
|
//$min_serveOptions['minApp']['allowDirs'] = array('//js', '//css');
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ $min_serveOptions['minApp']['groupsOnly'] = false;
|
|||||||
/**
|
/**
|
||||||
* By default, Minify will not minify files with names containing .min or -min
|
* By default, Minify will not minify files with names containing .min or -min
|
||||||
* before the extension. E.g. myFile.min.js will not be processed by JSMin
|
* before the extension. E.g. myFile.min.js will not be processed by JSMin
|
||||||
*
|
*
|
||||||
* To minify all files, set this option to null. You could also specify your
|
* To minify all files, set this option to null. You could also specify your
|
||||||
* own pattern that is matched against the filename.
|
* own pattern that is matched against the filename.
|
||||||
*/
|
*/
|
||||||
@@ -160,8 +160,8 @@ $min_serveOptions['minApp']['groupsOnly'] = false;
|
|||||||
* If you minify CSS files stored in symlink-ed directories, the URI rewriting
|
* If you minify CSS files stored in symlink-ed directories, the URI rewriting
|
||||||
* algorithm can fail. To prevent this, provide an array of link paths to
|
* algorithm can fail. To prevent this, provide an array of link paths to
|
||||||
* target paths, where the link paths are within the document root.
|
* target paths, where the link paths are within the document root.
|
||||||
*
|
*
|
||||||
* Because paths need to be normalized for this to work, use "//" to substitute
|
* 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.:
|
* the doc root in the link paths (the array keys). E.g.:
|
||||||
* <code>
|
* <code>
|
||||||
* array('//symlink' => '/real/target/path') // unix
|
* array('//symlink' => '/real/target/path') // unix
|
||||||
@@ -173,17 +173,17 @@ $min_symlinks = array();
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* If you upload files from Windows to a non-Windows server, Windows may report
|
* 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
|
* 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
|
* cache files when source file changes are made too frequently (e.g. more than
|
||||||
* once an hour).
|
* once an hour).
|
||||||
*
|
*
|
||||||
* Immediately after modifying and uploading a file, use the touch command to
|
* 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,
|
* 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
|
* set this variable to that number. If the mtime moves back, this should not be
|
||||||
* needed.
|
* needed.
|
||||||
*
|
*
|
||||||
* In the Windows SFTP client WinSCP, there's an option that may fix this
|
* In the Windows SFTP client WinSCP, there's an option that may fix this
|
||||||
* issue without changing the variable below. Under login > environment,
|
* issue without changing the variable below. Under login > environment,
|
||||||
* select the option "Adjust remote timestamp with DST".
|
* select the option "Adjust remote timestamp with DST".
|
||||||
* @link http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time
|
* @link http://winscp.net/eng/docs/ui_login_environment#daylight_saving_time
|
||||||
*/
|
*/
|
||||||
@@ -198,4 +198,3 @@ $min_uploaderHoursBehind = 0;
|
|||||||
*/
|
*/
|
||||||
//$min_factories['minify'] = ... a callable accepting a Minify\App object
|
//$min_factories['minify'] = ... a callable accepting a Minify\App object
|
||||||
//$min_factories['controller'] = ... a callable accepting a Minify\App object
|
//$min_factories['controller'] = ... a callable accepting a Minify\App object
|
||||||
|
|
||||||
|
8
docker-compose.yml
Normal file
8
docker-compose.yml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
version: "3.7"
|
||||||
|
services:
|
||||||
|
apache:
|
||||||
|
image: php:8.3-apache
|
||||||
|
ports:
|
||||||
|
- 8080:80
|
||||||
|
volumes:
|
||||||
|
- .:/var/www/html/min
|
@@ -1,9 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* Sets up MinApp controller and serves files
|
* Sets up MinApp controller and serves files
|
||||||
*
|
*
|
||||||
* DO NOT EDIT! Configure this utility via config.php and groupsConfig.php
|
* DO NOT EDIT! Configure this utility via config.php and groupsConfig.php
|
||||||
*
|
*
|
||||||
* @package Minify
|
* @package Minify
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@@ -317,7 +317,9 @@ class HTTP_ConditionalGet
|
|||||||
if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
|
if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$clientEtagList = $_SERVER['HTTP_IF_NONE_MATCH'];
|
$clientEtagList = PHP_VERSION_ID < 50400 && get_magic_quotes_gpc()
|
||||||
|
? stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])
|
||||||
|
: $_SERVER['HTTP_IF_NONE_MATCH'];
|
||||||
$clientEtags = explode(',', $clientEtagList);
|
$clientEtags = explode(',', $clientEtagList);
|
||||||
|
|
||||||
$compareTo = $this->normalizeEtag($this->_etag);
|
$compareTo = $this->normalizeEtag($this->_etag);
|
||||||
|
@@ -204,9 +204,10 @@ class HTTP_Encoder
|
|||||||
}
|
}
|
||||||
// gzip checks (slow)
|
// gzip checks (slow)
|
||||||
if (preg_match(
|
if (preg_match(
|
||||||
'@(?:^|,)\\s*((?:x-)?gzip)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@'
|
'@(?:^|,)\\s*((?:x-)?gzip)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@',
|
||||||
,$ae
|
$ae,
|
||||||
,$m)) {
|
$m
|
||||||
|
)) {
|
||||||
return array('gzip', $m[1]);
|
return array('gzip', $m[1]);
|
||||||
}
|
}
|
||||||
if ($allowDeflate) {
|
if ($allowDeflate) {
|
||||||
@@ -217,14 +218,17 @@ class HTTP_Encoder
|
|||||||
|| 0 === strpos($ae, 'deflate,') // opera
|
|| 0 === strpos($ae, 'deflate,') // opera
|
||||||
// slow parsing
|
// slow parsing
|
||||||
|| preg_match(
|
|| preg_match(
|
||||||
'@(?:^|,)\\s*deflate\\s*(?:$|,|;\\s*q=(?:0\\.|1))@', $ae)) {
|
'@(?:^|,)\\s*deflate\\s*(?:$|,|;\\s*q=(?:0\\.|1))@',
|
||||||
|
$ae
|
||||||
|
)) {
|
||||||
return array('deflate', 'deflate');
|
return array('deflate', 'deflate');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($allowCompress && preg_match(
|
if ($allowCompress && preg_match(
|
||||||
'@(?:^|,)\\s*((?:x-)?compress)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@'
|
'@(?:^|,)\\s*((?:x-)?compress)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@',
|
||||||
,$ae
|
$ae,
|
||||||
,$m)) {
|
$m
|
||||||
|
)) {
|
||||||
return array('compress', $m[1]);
|
return array('compress', $m[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -118,6 +118,7 @@ class Minify
|
|||||||
'quiet' => false, // serve() will send headers and output
|
'quiet' => false, // serve() will send headers and output
|
||||||
'debug' => false,
|
'debug' => false,
|
||||||
'concatOnly' => false,
|
'concatOnly' => false,
|
||||||
|
'invalidate' => false,
|
||||||
|
|
||||||
// if you override these, the response codes MUST be directly after
|
// if you override these, the response codes MUST be directly after
|
||||||
// the first space.
|
// the first space.
|
||||||
@@ -242,7 +243,7 @@ class Minify
|
|||||||
if (! $this->options['quiet']) {
|
if (! $this->options['quiet']) {
|
||||||
$this->errorExit($this->options['badRequestHeader'], self::URL_DEBUG);
|
$this->errorExit($this->options['badRequestHeader'], self::URL_DEBUG);
|
||||||
} else {
|
} else {
|
||||||
list(,$statusCode) = explode(' ', $this->options['badRequestHeader']);
|
list(, $statusCode) = explode(' ', $this->options['badRequestHeader']);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'success' => false,
|
'success' => false,
|
||||||
@@ -284,6 +285,7 @@ class Minify
|
|||||||
'lastModifiedTime' => $this->options['lastModifiedTime'],
|
'lastModifiedTime' => $this->options['lastModifiedTime'],
|
||||||
'isPublic' => $this->options['isPublic'],
|
'isPublic' => $this->options['isPublic'],
|
||||||
'encoding' => $this->options['encodeMethod'],
|
'encoding' => $this->options['encodeMethod'],
|
||||||
|
'invalidate' => $this->options['invalidate'],
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($this->options['maxAge'] > 0) {
|
if ($this->options['maxAge'] > 0) {
|
||||||
@@ -470,7 +472,7 @@ class Minify
|
|||||||
public function errorExit($header, $url = '', $msgHtml = '')
|
public function errorExit($header, $url = '', $msgHtml = '')
|
||||||
{
|
{
|
||||||
$url = htmlspecialchars($url, ENT_QUOTES);
|
$url = htmlspecialchars($url, ENT_QUOTES);
|
||||||
list(,$h1) = explode(' ', $header, 2);
|
list(, $h1) = explode(' ', $header, 2);
|
||||||
$h1 = htmlspecialchars($h1);
|
$h1 = htmlspecialchars($h1);
|
||||||
// FastCGI environments require 3rd arg to header() to be set
|
// FastCGI environments require 3rd arg to header() to be set
|
||||||
list(, $code) = explode(' ', $header, 3);
|
list(, $code) = explode(' ', $header, 3);
|
||||||
@@ -593,7 +595,8 @@ class Minify
|
|||||||
! $source // yes, we ran out of sources
|
! $source // yes, we ran out of sources
|
||||||
|| $type === self::TYPE_CSS // yes, to process CSS individually (avoiding PCRE bugs/limits)
|
|| $type === self::TYPE_CSS // yes, to process CSS individually (avoiding PCRE bugs/limits)
|
||||||
|| $minifier !== $lastMinifier // yes, minifier changed
|
|| $minifier !== $lastMinifier // yes, minifier changed
|
||||||
|| $options !== $lastOptions)) { // yes, options changed
|
|| $options !== $lastOptions // yes, options changed
|
||||||
|
)) {
|
||||||
// minify previous sources with last settings
|
// minify previous sources with last settings
|
||||||
$imploded = implode($implodeSeparator, $groupToProcessTogether);
|
$imploded = implode($implodeSeparator, $groupToProcessTogether);
|
||||||
$groupToProcessTogether = array();
|
$groupToProcessTogether = array();
|
||||||
|
@@ -82,8 +82,7 @@ class App extends Container
|
|||||||
|
|
||||||
$varDefined = get_defined_vars();
|
$varDefined = get_defined_vars();
|
||||||
|
|
||||||
$varNames = array_filter($varNames, function($name) use($varDefined)
|
$varNames = array_filter($varNames, function ($name) use ($varDefined) {
|
||||||
{
|
|
||||||
return array_key_exists($name, $varDefined);
|
return array_key_exists($name, $varDefined);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -123,7 +122,7 @@ class App extends Container
|
|||||||
|
|
||||||
$type = $that->typeOf($ctrl);
|
$type = $that->typeOf($ctrl);
|
||||||
throw new RuntimeException('$min_factories["controller"] callable must return an implementation'
|
throw new RuntimeException('$min_factories["controller"] callable must return an implementation'
|
||||||
." of Minify_CacheInterface. Returned $type");
|
. " of Minify_CacheInterface. Returned $type");
|
||||||
};
|
};
|
||||||
|
|
||||||
$this->docRoot = function (App $app) {
|
$this->docRoot = function (App $app) {
|
||||||
@@ -189,7 +188,7 @@ class App extends Container
|
|||||||
|
|
||||||
$type = $that->typeOf($value);
|
$type = $that->typeOf($value);
|
||||||
throw new RuntimeException('If set, $min_errorLogger must be a PSR-3 logger or a Monolog handler.'
|
throw new RuntimeException('If set, $min_errorLogger must be a PSR-3 logger or a Monolog handler.'
|
||||||
." Given $type");
|
. " Given $type");
|
||||||
};
|
};
|
||||||
|
|
||||||
$this->minify = function (App $app) use ($that) {
|
$this->minify = function (App $app) use ($that) {
|
||||||
@@ -206,7 +205,7 @@ class App extends Container
|
|||||||
|
|
||||||
$type = $that->typeOf($minify);
|
$type = $that->typeOf($minify);
|
||||||
throw new RuntimeException('$min_factories["minify"] callable must return a Minify object.'
|
throw new RuntimeException('$min_factories["minify"] callable must return a Minify object.'
|
||||||
." Returned $type");
|
. " Returned $type");
|
||||||
};
|
};
|
||||||
|
|
||||||
$this->serveOptions = function (App $app) {
|
$this->serveOptions = function (App $app) {
|
||||||
@@ -233,7 +232,7 @@ class App extends Container
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check for URI versioning
|
// check for URI versioning
|
||||||
if ($env->get('v') !== null || preg_match('/&\\d/', $app->env->server('QUERY_STRING'))) {
|
if ($env->get('v') !== null || preg_match('/&\\d/', $app->env->server('QUERY_STRING') ?? '')) {
|
||||||
$ret['maxAge'] = 31536000;
|
$ret['maxAge'] = 31536000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -259,7 +259,7 @@ class Minify_CSS_Compressor
|
|||||||
{
|
{
|
||||||
// Issue 210: must not eliminate WS between words in unquoted families
|
// Issue 210: must not eliminate WS between words in unquoted families
|
||||||
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
|
$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
|
||||||
$pieces = preg_split('/(\'[^\']+\'|"[^"]+")/', $m[1], null, $flags);
|
$pieces = preg_split('/(\'[^\']+\'|"[^"]+")/', $m[1], -1, $flags);
|
||||||
$out = 'font-family:';
|
$out = 'font-family:';
|
||||||
|
|
||||||
while (null !== ($piece = array_shift($pieces))) {
|
while (null !== ($piece = array_shift($pieces))) {
|
||||||
|
@@ -73,16 +73,16 @@ class Minify_CSSmin
|
|||||||
}
|
}
|
||||||
if ($options['currentDir']) {
|
if ($options['currentDir']) {
|
||||||
return Minify_CSS_UriRewriter::rewrite(
|
return Minify_CSS_UriRewriter::rewrite(
|
||||||
$css
|
$css,
|
||||||
,$options['currentDir']
|
$options['currentDir'],
|
||||||
,$options['docRoot']
|
$options['docRoot'],
|
||||||
,$options['symlinks']
|
$options['symlinks']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Minify_CSS_UriRewriter::prepend(
|
return Minify_CSS_UriRewriter::prepend(
|
||||||
$css
|
$css,
|
||||||
,$options['prependRelativePath']
|
$options['prependRelativePath']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,8 @@
|
|||||||
*
|
*
|
||||||
* @package Minify
|
* @package Minify
|
||||||
* @author Chris Edwards
|
* @author Chris Edwards
|
||||||
|
*
|
||||||
|
* @deprecated Use Minify_Cache_APCu
|
||||||
**/
|
**/
|
||||||
class Minify_Cache_APC implements Minify_CacheInterface
|
class Minify_Cache_APC implements Minify_CacheInterface
|
||||||
{
|
{
|
||||||
|
136
lib/Minify/Cache/APCu.php
Normal file
136
lib/Minify/Cache/APCu.php
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Class Minify_Cache_APCu
|
||||||
|
* @package Minify
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APCu-based cache class for Minify
|
||||||
|
*
|
||||||
|
* <code>
|
||||||
|
* Minify::setCache(new Minify_Cache_APCu());
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
|
* @package Minify
|
||||||
|
* @author Chris Edwards
|
||||||
|
**/
|
||||||
|
class Minify_Cache_APCu implements Minify_CacheInterface
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a Minify_Cache_APCu 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 apcu_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)
|
||||||
|
{
|
||||||
|
if (! $this->_fetch($id)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
|
||||||
|
return mb_strlen($this->_data, '8bit');
|
||||||
|
} else {
|
||||||
|
return strlen($this->_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 apcu, store in instance
|
||||||
|
*
|
||||||
|
* @param string $id
|
||||||
|
*
|
||||||
|
* @return bool success
|
||||||
|
*/
|
||||||
|
private function _fetch($id)
|
||||||
|
{
|
||||||
|
if ($this->_id === $id) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$ret = apcu_fetch($id);
|
||||||
|
if (false === $ret) {
|
||||||
|
$this->_id = null;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($this->_lm, $this->_data) = explode('|', $ret, 2);
|
||||||
|
$this->_id = $id;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -64,4 +64,4 @@ class Minify_Cache_Null implements Minify_CacheInterface
|
|||||||
public function fetch($id)
|
public function fetch($id)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -136,4 +136,4 @@ class Minify_Cache_WinCache implements Minify_CacheInterface
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -188,7 +188,7 @@ class Minify_ClosureCompiler
|
|||||||
*/
|
*/
|
||||||
protected function checkTempdir($tempDir)
|
protected function checkTempdir($tempDir)
|
||||||
{
|
{
|
||||||
if (!is_dir($tempDir)) {
|
if ($tempDir === null || !is_dir($tempDir)) {
|
||||||
throw new Minify_ClosureCompiler_Exception('$tempDir(' . $tempDir . ') is not a valid direcotry.');
|
throw new Minify_ClosureCompiler_Exception('$tempDir(' . $tempDir . ') is not a valid direcotry.');
|
||||||
}
|
}
|
||||||
if (!is_writable($tempDir)) {
|
if (!is_writable($tempDir)) {
|
||||||
|
@@ -68,4 +68,3 @@ class Minify_Controller_Files extends Minify_Controller_Base
|
|||||||
return new Minify_ServeConfiguration($options, $sources);
|
return new Minify_ServeConfiguration($options, $sources);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -73,4 +73,3 @@ class Minify_Controller_Groups extends Minify_Controller_Files
|
|||||||
return parent::createConfiguration($options);
|
return parent::createConfiguration($options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -66,4 +66,3 @@ class Minify_Controller_Page extends Minify_Controller_Base
|
|||||||
return new Minify_ServeConfiguration($options, $sources, $selectionId);
|
return new Minify_ServeConfiguration($options, $sources, $selectionId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,4 +19,4 @@ interface Minify_ControllerInterface
|
|||||||
* @return Minify_Env
|
* @return Minify_Env
|
||||||
*/
|
*/
|
||||||
public function getEnv();
|
public function getEnv();
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,11 @@ class Minify_HTML
|
|||||||
* @var boolean
|
* @var boolean
|
||||||
*/
|
*/
|
||||||
protected $_jsCleanComments = true;
|
protected $_jsCleanComments = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $_html;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "Minify" an HTML page
|
* "Minify" an HTML page
|
||||||
@@ -99,32 +104,34 @@ class Minify_HTML
|
|||||||
|
|
||||||
// replace SCRIPTs (and minify) with placeholders
|
// replace SCRIPTs (and minify) with placeholders
|
||||||
$this->_html = preg_replace_callback(
|
$this->_html = preg_replace_callback(
|
||||||
'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/iu'
|
'/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/iu',
|
||||||
,array($this, '_removeScriptCB')
|
array($this, '_removeScriptCB'),
|
||||||
,$this->_html);
|
$this->_html
|
||||||
|
);
|
||||||
|
|
||||||
// replace STYLEs (and minify) with placeholders
|
// replace STYLEs (and minify) with placeholders
|
||||||
$this->_html = preg_replace_callback(
|
$this->_html = preg_replace_callback(
|
||||||
'/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/iu'
|
'/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/iu',
|
||||||
,array($this, '_removeStyleCB')
|
array($this, '_removeStyleCB'),
|
||||||
,$this->_html);
|
$this->_html
|
||||||
|
);
|
||||||
|
|
||||||
// remove HTML comments (not containing IE conditional comments).
|
// remove HTML comments (not containing IE conditional comments).
|
||||||
$this->_html = preg_replace_callback(
|
$this->_html = preg_replace_callback(
|
||||||
'/<!--([\\s\\S]*?)-->/u'
|
'/<!--([\\s\\S]*?)-->/u',
|
||||||
,array($this, '_commentCB')
|
array($this, '_commentCB'),
|
||||||
,$this->_html);
|
$this->_html
|
||||||
|
);
|
||||||
|
|
||||||
// replace PREs with placeholders
|
// replace PREs with placeholders
|
||||||
$this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/iu'
|
$this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/iu', array($this, '_removePreCB'), $this->_html);
|
||||||
,array($this, '_removePreCB')
|
|
||||||
,$this->_html);
|
|
||||||
|
|
||||||
// replace TEXTAREAs with placeholders
|
// replace TEXTAREAs with placeholders
|
||||||
$this->_html = preg_replace_callback(
|
$this->_html = preg_replace_callback(
|
||||||
'/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/iu'
|
'/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/iu',
|
||||||
,array($this, '_removeTextareaCB')
|
array($this, '_removeTextareaCB'),
|
||||||
,$this->_html);
|
$this->_html
|
||||||
|
);
|
||||||
|
|
||||||
// trim each line.
|
// trim each line.
|
||||||
// @todo take into account attribute values that span multiple lines.
|
// @todo take into account attribute values that span multiple lines.
|
||||||
@@ -139,24 +146,25 @@ class Minify_HTML
|
|||||||
|
|
||||||
// remove ws outside of all elements
|
// remove ws outside of all elements
|
||||||
$this->_html = preg_replace(
|
$this->_html = preg_replace(
|
||||||
'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</u'
|
'/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</u',
|
||||||
,'>$1$2$3<'
|
'>$1$2$3<',
|
||||||
,$this->_html);
|
$this->_html
|
||||||
|
);
|
||||||
|
|
||||||
// use newlines before 1st attribute in open tags (to limit line lengths)
|
// use newlines before 1st attribute in open tags (to limit line lengths)
|
||||||
$this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/iu', "$1\n$2", $this->_html);
|
$this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/iu', "$1\n$2", $this->_html);
|
||||||
|
|
||||||
// fill placeholders
|
// fill placeholders
|
||||||
$this->_html = str_replace(
|
$this->_html = str_replace(
|
||||||
array_keys($this->_placeholders)
|
array_keys($this->_placeholders),
|
||||||
,array_values($this->_placeholders)
|
array_values($this->_placeholders),
|
||||||
,$this->_html
|
$this->_html
|
||||||
);
|
);
|
||||||
// issue 229: multi-pass to catch scripts that didn't get replaced in textareas
|
// issue 229: multi-pass to catch scripts that didn't get replaced in textareas
|
||||||
$this->_html = str_replace(
|
$this->_html = str_replace(
|
||||||
array_keys($this->_placeholders)
|
array_keys($this->_placeholders),
|
||||||
,array_values($this->_placeholders)
|
array_values($this->_placeholders),
|
||||||
,$this->_html
|
$this->_html
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->_html;
|
return $this->_html;
|
||||||
@@ -164,7 +172,7 @@ class Minify_HTML
|
|||||||
|
|
||||||
protected function _commentCB($m)
|
protected function _commentCB($m)
|
||||||
{
|
{
|
||||||
return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<!['))
|
return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<![') || 0 === strpos($m[1], '#'))
|
||||||
? $m[0]
|
? $m[0]
|
||||||
: '';
|
: '';
|
||||||
}
|
}
|
||||||
@@ -209,7 +217,8 @@ class Minify_HTML
|
|||||||
: 'trim';
|
: 'trim';
|
||||||
$css = call_user_func($minifier, $css);
|
$css = call_user_func($minifier, $css);
|
||||||
|
|
||||||
return $this->_reservePlace($this->_needsCdata($css)
|
return $this->_reservePlace(
|
||||||
|
$this->_needsCdata($css)
|
||||||
? "{$openStyle}/*<![CDATA[*/{$css}/*]]>*/</style>"
|
? "{$openStyle}/*<![CDATA[*/{$css}/*]]>*/</style>"
|
||||||
: "{$openStyle}{$css}</style>"
|
: "{$openStyle}{$css}</style>"
|
||||||
);
|
);
|
||||||
@@ -238,7 +247,8 @@ class Minify_HTML
|
|||||||
: 'trim';
|
: 'trim';
|
||||||
$js = call_user_func($minifier, $js);
|
$js = call_user_func($minifier, $js);
|
||||||
|
|
||||||
return $this->_reservePlace($this->_needsCdata($js)
|
return $this->_reservePlace(
|
||||||
|
$this->_needsCdata($js)
|
||||||
? "{$ws1}{$openScript}/*<![CDATA[*/{$js}/*]]>*/</script>{$ws2}"
|
? "{$ws1}{$openScript}/*<![CDATA[*/{$js}/*]]>*/</script>{$ws2}"
|
||||||
: "{$ws1}{$openScript}{$js}</script>{$ws2}"
|
: "{$ws1}{$openScript}{$js}</script>{$ws2}"
|
||||||
);
|
);
|
||||||
|
@@ -66,7 +66,7 @@ class Minify_ImportProcessor
|
|||||||
$this->_currentDir = dirname($file);
|
$this->_currentDir = dirname($file);
|
||||||
|
|
||||||
// remove UTF-8 BOM if present
|
// remove UTF-8 BOM if present
|
||||||
if (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3)) {
|
if (pack("CCC", 0xef, 0xbb, 0xbf) === substr($content, 0, 3)) {
|
||||||
$content = substr($content, 3);
|
$content = substr($content, 3);
|
||||||
}
|
}
|
||||||
// ensure uniform EOLs
|
// ensure uniform EOLs
|
||||||
@@ -182,7 +182,7 @@ class Minify_ImportProcessor
|
|||||||
private function truepath($path)
|
private function truepath($path)
|
||||||
{
|
{
|
||||||
// whether $path is unix or not
|
// whether $path is unix or not
|
||||||
$unipath = ('' === $path) || ($path{0} !== '/');
|
$unipath = ('' === $path) || ($path[0] !== '/');
|
||||||
|
|
||||||
// attempts to detect if path is relative in which case, add cwd
|
// attempts to detect if path is relative in which case, add cwd
|
||||||
if (strpos($path, ':') === false && $unipath) {
|
if (strpos($path, ':') === false && $unipath) {
|
||||||
|
@@ -195,13 +195,13 @@ class Minify_JS_ClosureCompiler
|
|||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
} else {
|
} else {
|
||||||
throw new Minify_JS_ClosureCompiler_Exception(
|
throw new Minify_JS_ClosureCompiler_Exception(
|
||||||
"Could not make HTTP request: allow_url_open is false and cURL not available"
|
"Could not make HTTP request: allow_url_open is false and cURL not available"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (false === $contents) {
|
if (false === $contents) {
|
||||||
throw new Minify_JS_ClosureCompiler_Exception(
|
throw new Minify_JS_ClosureCompiler_Exception(
|
||||||
"No HTTP response from server"
|
"No HTTP response from server"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -110,4 +110,4 @@ class Minify_NailgunClosureCompiler extends Minify_ClosureCompiler
|
|||||||
|
|
||||||
$this->shell("$serverCommand </dev/null >/dev/null 2>/dev/null & sleep 10");
|
$this->shell("$serverCommand </dev/null >/dev/null 2>/dev/null & sleep 10");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
use Leafo\ScssPhp\Compiler;
|
use ScssPhp\ScssPhp\Compiler;
|
||||||
use Leafo\ScssPhp\Server;
|
use ScssPhp\ScssPhp\Version;
|
||||||
use Leafo\ScssPhp\Version;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for using SCSS files
|
* Class for using SCSS files
|
||||||
@@ -152,12 +151,12 @@ class Minify_ScssCssSource extends Minify_Source
|
|||||||
// and will treat the @import line as css import
|
// and will treat the @import line as css import
|
||||||
$scss->setImportPaths(dirname($filename));
|
$scss->setImportPaths(dirname($filename));
|
||||||
|
|
||||||
$css = $scss->compile(file_get_contents($filename), $filename);
|
$css = $scss->compileString(file_get_contents($filename), $filename)->getCss();
|
||||||
$elapsed = round((microtime(true) - $start), 4);
|
$elapsed = round((microtime(true) - $start), 4);
|
||||||
|
|
||||||
$v = Version::VERSION;
|
$v = Version::VERSION;
|
||||||
$ts = date('r', $start);
|
$ts = date('r', (int) $start);
|
||||||
$css = "/* compiled by scssphp $v on $ts (${elapsed}s) */\n\n" . $css;
|
$css = "/* compiled by scssphp $v on $ts ({$elapsed}s) */\n\n" . $css;
|
||||||
|
|
||||||
$imports = $scss->getParsedFiles();
|
$imports = $scss->getParsedFiles();
|
||||||
|
|
||||||
|
@@ -170,7 +170,7 @@ class Minify_Source_Factory
|
|||||||
if ($this->options['noMinPattern'] && preg_match($this->options['noMinPattern'], $basename)) {
|
if ($this->options['noMinPattern'] && preg_match($this->options['noMinPattern'], $basename)) {
|
||||||
if (preg_match('~\.(css|less)$~i', $basename)) {
|
if (preg_match('~\.(css|less)$~i', $basename)) {
|
||||||
$spec['minifyOptions']['compress'] = false;
|
$spec['minifyOptions']['compress'] = false;
|
||||||
// we still want URI rewriting to work for CSS
|
// we still want URI rewriting to work for CSS
|
||||||
} else {
|
} else {
|
||||||
$spec['minifier'] = 'Minify::nullMinifier';
|
$spec['minifier'] = 'Minify::nullMinifier';
|
||||||
}
|
}
|
||||||
|
@@ -154,4 +154,3 @@ class Minify_YUICompressor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -390,4 +390,3 @@ class Cli
|
|||||||
$this->errors[$letter][] = sprintf($msg, $value);
|
$this->errors[$letter][] = sprintf($msg, $value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -27,7 +27,7 @@ $outfile = $cli->values['o'];
|
|||||||
$testRun = $cli->values['t'];
|
$testRun = $cli->values['t'];
|
||||||
$docRoot = $cli->values['d'];
|
$docRoot = $cli->values['d'];
|
||||||
|
|
||||||
$pathRewriter = function($css, $options) {
|
$pathRewriter = function ($css, $options) {
|
||||||
return Minify_CSS_UriRewriter::rewrite($css, $options['currentDir'], $options['docRoot']);
|
return Minify_CSS_UriRewriter::rewrite($css, $options['currentDir'], $options['docRoot']);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -54,9 +54,8 @@ $combined = Minify::combine($sources) . "\n";
|
|||||||
if ($testRun) {
|
if ($testRun) {
|
||||||
echo $combined;
|
echo $combined;
|
||||||
echo Minify_CSS_UriRewriter::$debugText . "\n";
|
echo Minify_CSS_UriRewriter::$debugText . "\n";
|
||||||
} else {
|
} else {
|
||||||
$fp = $cli->openOutput();
|
$fp = $cli->openOutput();
|
||||||
fwrite($fp, $combined);
|
fwrite($fp, $combined);
|
||||||
$cli->closeOutput();
|
$cli->closeOutput();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4,6 +4,6 @@
|
|||||||
|
|
||||||
require __DIR__ . '/../config.php';
|
require __DIR__ . '/../config.php';
|
||||||
|
|
||||||
$minifyCachePath = isset($min_cachePath)
|
$minifyCachePath = isset($min_cachePath)
|
||||||
? $min_cachePath
|
? $min_cachePath
|
||||||
: '';
|
: '';
|
||||||
|
@@ -13,7 +13,8 @@ $app->cache = new Minify_Cache_Null();
|
|||||||
|
|
||||||
$env = $app->env;
|
$env = $app->env;
|
||||||
|
|
||||||
function h($txt) {
|
function h($txt)
|
||||||
|
{
|
||||||
return htmlspecialchars($txt, ENT_QUOTES, 'UTF-8');
|
return htmlspecialchars($txt, ENT_QUOTES, 'UTF-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,13 +23,12 @@ if ($env->post('textIn')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($env->post('method') === 'Minify and serve') {
|
if ($env->post('method') === 'Minify and serve') {
|
||||||
|
|
||||||
$base = trim($env->post('base'));
|
$base = trim($env->post('base'));
|
||||||
if ($base) {
|
if ($base) {
|
||||||
$textIn = preg_replace(
|
$textIn = preg_replace(
|
||||||
'@(<head\\b[^>]*>)@i'
|
'@(<head\\b[^>]*>)@i',
|
||||||
,'$1<base href="' . h($base) . '" />'
|
'$1<base href="' . h($base) . '" />',
|
||||||
,$textIn
|
$textIn
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +58,6 @@ $tpl = array();
|
|||||||
$tpl['classes'] = array('Minify_HTML', 'JSMin\\JSMin', 'Minify_CSS', 'Minify_Lines');
|
$tpl['classes'] = array('Minify_HTML', 'JSMin\\JSMin', 'Minify_CSS', 'Minify_Lines');
|
||||||
|
|
||||||
if (in_array($env->post('method'), $tpl['classes'])) {
|
if (in_array($env->post('method'), $tpl['classes'])) {
|
||||||
|
|
||||||
$args = array($textIn);
|
$args = array($textIn);
|
||||||
if ($env->post('method') === 'Minify_HTML') {
|
if ($env->post('method') === 'Minify_HTML') {
|
||||||
$args[] = array(
|
$args[] = array(
|
||||||
@@ -88,7 +87,8 @@ sendPage($tpl);
|
|||||||
* @param string $input
|
* @param string $input
|
||||||
* @return string HTML
|
* @return string HTML
|
||||||
*/
|
*/
|
||||||
function getExceptionMsg(Exception $e, $input) {
|
function getExceptionMsg(Exception $e, $input)
|
||||||
|
{
|
||||||
$msg = "<p>" . h($e->getMessage()) . "</p>";
|
$msg = "<p>" . h($e->getMessage()) . "</p>";
|
||||||
if (0 === strpos(get_class($e), 'JSMin_Unterminated')
|
if (0 === strpos(get_class($e), 'JSMin_Unterminated')
|
||||||
&& preg_match('~byte (\d+)~', $e->getMessage(), $m)) {
|
&& preg_match('~byte (\d+)~', $e->getMessage(), $m)) {
|
||||||
@@ -113,37 +113,35 @@ function getExceptionMsg(Exception $e, $input) {
|
|||||||
*
|
*
|
||||||
* @param array $vars
|
* @param array $vars
|
||||||
*/
|
*/
|
||||||
function sendPage($vars) {
|
function sendPage($vars)
|
||||||
header('Content-Type: text/html; charset=utf-8');
|
{
|
||||||
?>
|
header('Content-Type: text/html; charset=utf-8'); ?>
|
||||||
<!DOCTYPE html><head><title>minifyTextarea</title></head>
|
<!DOCTYPE html><head><title>minifyTextarea</title></head>
|
||||||
|
|
||||||
<p><strong>Warning! Please do not place this application on a public site.</strong> This should be used only for testing.</p>
|
<p><strong>Warning! Please do not place this application on a public site.</strong> This should be used only for testing.</p>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
if (isset($vars['exceptionMsg'])) {
|
if (isset($vars['exceptionMsg'])) {
|
||||||
echo $vars['exceptionMsg'];
|
echo $vars['exceptionMsg'];
|
||||||
}
|
}
|
||||||
if (isset($vars['time'])) {
|
if (isset($vars['time'])) {
|
||||||
echo "
|
echo "
|
||||||
<table>
|
<table>
|
||||||
<tr><th>Bytes in</th><td>{$vars['inBytes']} (after line endings normalized to <code>\\n</code>)</td></tr>
|
<tr><th>Bytes in</th><td>{$vars['inBytes']} (after line endings normalized to <code>\\n</code>)</td></tr>
|
||||||
<tr><th>Bytes out</th><td>{$vars['outBytes']} (reduced " . round(100 - (100 * $vars['outBytes'] / $vars['inBytes'])) . "%)</td></tr>
|
<tr><th>Bytes out</th><td>{$vars['outBytes']} (reduced " . round(100 - (100 * $vars['outBytes'] / $vars['inBytes'])) . "%)</td></tr>
|
||||||
<tr><th>Time (s)</th><td>" . round($vars['time'], 5) . "</td></tr>
|
<tr><th>Time (s)</th><td>" . round($vars['time'], 5) . "</td></tr>
|
||||||
</table>
|
</table>
|
||||||
";
|
";
|
||||||
}
|
} ?>
|
||||||
?>
|
|
||||||
<form action="?2" method="post">
|
<form action="?2" method="post">
|
||||||
<p><label>Content<br><textarea name="textIn" cols="80" rows="35" style="width:99%"><?php
|
<p><label>Content<br><textarea name="textIn" cols="80" rows="35" style="width:99%"><?php
|
||||||
if (isset($vars['output'])) {
|
if (isset($vars['output'])) {
|
||||||
echo h($vars['output']);
|
echo h($vars['output']);
|
||||||
}
|
} ?></textarea></label></p>
|
||||||
?></textarea></label></p>
|
|
||||||
<p>Minify with:
|
<p>Minify with:
|
||||||
<?php foreach ($vars['classes'] as $minClass): ?>
|
<?php foreach ($vars['classes'] as $minClass): ?>
|
||||||
<input type="submit" name="method" value="<?php echo $minClass; ?>">
|
<input type="submit" name="method" value="<?php echo $minClass; ?>">
|
||||||
<?php endForEach; ?>
|
<?php endforeach; ?>
|
||||||
</p>
|
</p>
|
||||||
<p>...or <input type="submit" name="method" value="Minify and serve"> this HTML to the browser. Also minify:
|
<p>...or <input type="submit" name="method" value="Minify and serve"> this HTML to the browser. Also minify:
|
||||||
<label>CSS <input type="checkbox" name="minCss" checked></label> :
|
<label>CSS <input type="checkbox" name="minCss" checked></label> :
|
||||||
|
@@ -12,23 +12,26 @@ $app->cache = new Minify_Cache_Null();
|
|||||||
|
|
||||||
$env = $app->env;
|
$env = $app->env;
|
||||||
|
|
||||||
function getPost($key) {
|
function getPost($key)
|
||||||
|
{
|
||||||
if (! isset($_POST[$key])) {
|
if (! isset($_POST[$key])) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return get_magic_quotes_gpc()
|
return (PHP_VERSION_ID < 50400 && get_magic_quotes_gpc())
|
||||||
? stripslashes($_POST[$key])
|
? stripslashes($_POST[$key])
|
||||||
: $_POST[$key];
|
: $_POST[$key];
|
||||||
}
|
}
|
||||||
|
|
||||||
function sniffType($headers) {
|
function sniffType($headers)
|
||||||
|
{
|
||||||
$charset = 'utf-8';
|
$charset = 'utf-8';
|
||||||
$type = null;
|
$type = null;
|
||||||
$headers = "\n\n" . implode("\n\n", $headers) . "\n\n";
|
$headers = "\n\n" . implode("\n\n", $headers) . "\n\n";
|
||||||
if (preg_match(
|
if (preg_match(
|
||||||
'@\\n\\nContent-Type: *([\\w/\\+-]+)( *; *charset *= *([\\w-]+))? *\\n\\n@i'
|
'@\\n\\nContent-Type: *([\\w/\\+-]+)( *; *charset *= *([\\w-]+))? *\\n\\n@i',
|
||||||
,$headers
|
$headers,
|
||||||
,$m)) {
|
$m
|
||||||
|
)) {
|
||||||
$sentType = $m[1];
|
$sentType = $m[1];
|
||||||
if (isset($m[3])) {
|
if (isset($m[3])) {
|
||||||
$charset = $m[3];
|
$charset = $m[3];
|
||||||
@@ -49,7 +52,6 @@ function sniffType($headers) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_POST['url'])) {
|
if (isset($_POST['url'])) {
|
||||||
|
|
||||||
require '../config.php';
|
require '../config.php';
|
||||||
|
|
||||||
$url = trim($env->post('url'));
|
$url = trim($env->post('url'));
|
||||||
@@ -88,13 +90,13 @@ if (isset($_POST['url'])) {
|
|||||||
die('Unrecognized Content-Type: ' . $type['sent']);
|
die('Unrecognized Content-Type: ' . $type['sent']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($type['minify'] === 'text/html'
|
if ($type['minify'] === 'text/html'
|
||||||
&& isset($_POST['addBase'])
|
&& isset($_POST['addBase'])
|
||||||
&& ! preg_match('@<base\\b@i', $content)) {
|
&& ! preg_match('@<base\\b@i', $content)) {
|
||||||
$content = preg_replace(
|
$content = preg_replace(
|
||||||
'@(<head\\b[^>]*>)@i'
|
'@(<head\\b[^>]*>)@i',
|
||||||
,'$1<base href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" />'
|
'$1<base href="' . htmlspecialchars($url, ENT_QUOTES, 'UTF-8') . '" />',
|
||||||
,$content
|
$content
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,9 +8,13 @@ $env = $app->env;
|
|||||||
|
|
||||||
header('Content-Type: text/html;charset=utf-8');
|
header('Content-Type: text/html;charset=utf-8');
|
||||||
|
|
||||||
function h($str) { return htmlspecialchars($str, ENT_QUOTES); }
|
function h($str)
|
||||||
|
{
|
||||||
|
return htmlspecialchars($str, ENT_QUOTES);
|
||||||
|
}
|
||||||
|
|
||||||
function getInput($name, $default = '', $size = 50) {
|
function getInput($name, $default = '', $size = 50)
|
||||||
|
{
|
||||||
global $env;
|
global $env;
|
||||||
$val = $env->post($name, $default);
|
$val = $env->post($name, $default);
|
||||||
return "<input type='text' name='{$name}' value='" . h($val) . "' size='{$size}' />";
|
return "<input type='text' name='{$name}' value='" . h($val) . "' size='{$size}' />";
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
<!-- http://phpunit.de/manual/current/en/appendixes.configuration.html -->
|
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
|
||||||
<phpunit
|
<phpunit
|
||||||
backupGlobals="false"
|
backupGlobals="false"
|
||||||
backupStaticAttributes="false"
|
backupStaticAttributes="false"
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
convertWarningsToExceptions="true"
|
convertWarningsToExceptions="true"
|
||||||
processIsolation="false"
|
processIsolation="false"
|
||||||
stopOnFailure="false"
|
stopOnFailure="false"
|
||||||
syntaxCheck="false"
|
|
||||||
bootstrap="vendor/autoload.php">
|
bootstrap="vendor/autoload.php">
|
||||||
|
|
||||||
<testsuites>
|
<testsuites>
|
||||||
@@ -32,6 +31,7 @@
|
|||||||
<directory>.</directory>
|
<directory>.</directory>
|
||||||
<exclude>
|
<exclude>
|
||||||
<directory>tests</directory>
|
<directory>tests</directory>
|
||||||
|
<directory>vendor</directory>
|
||||||
</exclude>
|
</exclude>
|
||||||
</whitelist>
|
</whitelist>
|
||||||
</filter>
|
</filter>
|
||||||
|
@@ -13,7 +13,8 @@ if (!$enabled) {
|
|||||||
die('Set $enabled to true to see server info.');
|
die('Set $enabled to true to see server info.');
|
||||||
}
|
}
|
||||||
|
|
||||||
function assertTrue($test, $message) {
|
function assertTrue($test, $message)
|
||||||
|
{
|
||||||
if (!$test) {
|
if (!$test) {
|
||||||
echo "Warning: $message\n";
|
echo "Warning: $message\n";
|
||||||
}
|
}
|
||||||
|
@@ -7,12 +7,12 @@ if (is_file(__DIR__ . '/bootstrap.php')) {
|
|||||||
$bootstrap_file = __DIR__ . '/../bootstrap.php';
|
$bootstrap_file = __DIR__ . '/../bootstrap.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
$send_400 = function($content = 'Bad URL') {
|
$send_400 = function ($content = 'Bad URL') {
|
||||||
http_response_code(400);
|
http_response_code(400);
|
||||||
die($content);
|
die($content);
|
||||||
};
|
};
|
||||||
|
|
||||||
$send_301 = function($url) {
|
$send_301 = function ($url) {
|
||||||
http_response_code(301);
|
http_response_code(301);
|
||||||
header("Cache-Control: max-age=31536000");
|
header("Cache-Control: max-age=31536000");
|
||||||
header("Location: $url");
|
header("Location: $url");
|
||||||
|
@@ -10,7 +10,8 @@ namespace Minify\StaticService;
|
|||||||
* @param string $type "css" or "js"
|
* @param string $type "css" or "js"
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function build_uri($static_uri, $query, $type) {
|
function build_uri($static_uri, $query, $type)
|
||||||
|
{
|
||||||
$static_uri = rtrim($static_uri, '/');
|
$static_uri = rtrim($static_uri, '/');
|
||||||
$query = ltrim($query, '?');
|
$query = ltrim($query, '?');
|
||||||
|
|
||||||
@@ -30,7 +31,8 @@ function build_uri($static_uri, $query, $type) {
|
|||||||
* @param bool $auto_create Automatically create the directory if missing?
|
* @param bool $auto_create Automatically create the directory if missing?
|
||||||
* @return null|string null if missing or can't create
|
* @return null|string null if missing or can't create
|
||||||
*/
|
*/
|
||||||
function get_cache_time($auto_create = true) {
|
function get_cache_time($auto_create = true)
|
||||||
|
{
|
||||||
foreach (scandir(__DIR__) as $entry) {
|
foreach (scandir(__DIR__) as $entry) {
|
||||||
if (ctype_digit($entry)) {
|
if (ctype_digit($entry)) {
|
||||||
return $entry;
|
return $entry;
|
||||||
@@ -50,14 +52,16 @@ function get_cache_time($auto_create = true) {
|
|||||||
return $time;
|
return $time;
|
||||||
}
|
}
|
||||||
|
|
||||||
function flush_cache() {
|
function flush_cache()
|
||||||
|
{
|
||||||
$time = get_cache_time(false);
|
$time = get_cache_time(false);
|
||||||
if ($time) {
|
if ($time) {
|
||||||
remove_tree(__DIR__ . "/$time");
|
remove_tree(__DIR__ . "/$time");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove_tree($dir) {
|
function remove_tree($dir)
|
||||||
|
{
|
||||||
$files = array_diff(scandir($dir), array('.', '..'));
|
$files = array_diff(scandir($dir), array('.', '..'));
|
||||||
|
|
||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
|
@@ -127,7 +127,7 @@ class HTTPConditionalGetTest extends TestCase
|
|||||||
if (null === $inm) {
|
if (null === $inm) {
|
||||||
unset($_SERVER['HTTP_IF_NONE_MATCH']);
|
unset($_SERVER['HTTP_IF_NONE_MATCH']);
|
||||||
} else {
|
} else {
|
||||||
$_SERVER['HTTP_IF_NONE_MATCH'] = get_magic_quotes_gpc()
|
$_SERVER['HTTP_IF_NONE_MATCH'] = PHP_VERSION_ID < 50400 && get_magic_quotes_gpc()
|
||||||
? addslashes($inm) :
|
? addslashes($inm) :
|
||||||
$inm;
|
$inm;
|
||||||
}
|
}
|
||||||
|
@@ -113,10 +113,12 @@ class HTTPEncoderTest extends TestCase
|
|||||||
);
|
);
|
||||||
|
|
||||||
foreach ($encodingTests as $test) {
|
foreach ($encodingTests as $test) {
|
||||||
$e = new HTTP_Encoder(array(
|
$e = new HTTP_Encoder(
|
||||||
'content' => $variedContent,
|
array(
|
||||||
'method' => $test['method'],
|
'content' => $variedContent,
|
||||||
));
|
'method' => $test['method'],
|
||||||
|
)
|
||||||
|
);
|
||||||
$e->encode(9);
|
$e->encode(9);
|
||||||
$ret = $this->countBytes($e->getContent());
|
$ret = $this->countBytes($e->getContent());
|
||||||
|
|
||||||
@@ -153,12 +155,12 @@ function _gzdecode($data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// http://www.php.net/manual/en/function.gzdecode.php#82930
|
// http://www.php.net/manual/en/function.gzdecode.php#82930
|
||||||
function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
function _phpman_gzdecode($data, &$filename = '', &$error = '', $maxlength = 0)
|
||||||
{
|
{
|
||||||
$mbIntEnc = null;
|
$mbIntEnc = null;
|
||||||
$hasMbOverload = (function_exists('mb_strlen')
|
$hasMbOverload = (function_exists('mb_strlen')
|
||||||
&& (ini_get('mbstring.func_overload') !== '')
|
&& (ini_get('mbstring.func_overload') !== '')
|
||||||
&& ((int)ini_get('mbstring.func_overload') & 2));
|
&& ((int) ini_get('mbstring.func_overload') & 2));
|
||||||
if ($hasMbOverload) {
|
if ($hasMbOverload) {
|
||||||
$mbIntEnc = mb_internal_encoding();
|
$mbIntEnc = mb_internal_encoding();
|
||||||
mb_internal_encoding('8bit');
|
mb_internal_encoding('8bit');
|
||||||
@@ -166,15 +168,15 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
|
|
||||||
|
|
||||||
$len = strlen($data);
|
$len = strlen($data);
|
||||||
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
|
if ($len < 18 || strcmp(substr($data, 0, 2), "\x1f\x8b")) {
|
||||||
$error = "Not in GZIP format.";
|
$error = "Not in GZIP format.";
|
||||||
if ($mbIntEnc !== null) {
|
if ($mbIntEnc !== null) {
|
||||||
mb_internal_encoding($mbIntEnc);
|
mb_internal_encoding($mbIntEnc);
|
||||||
}
|
}
|
||||||
return null; // Not GZIP format (See RFC 1952)
|
return null; // Not GZIP format (See RFC 1952)
|
||||||
}
|
}
|
||||||
$method = ord(substr($data,2,1)); // Compression method
|
$method = ord(substr($data, 2, 1)); // Compression method
|
||||||
$flags = ord(substr($data,3,1)); // Flags
|
$flags = ord(substr($data, 3, 1)); // Flags
|
||||||
if ($flags & 31 != $flags) {
|
if ($flags & 31 != $flags) {
|
||||||
$error = "Reserved bits not allowed.";
|
$error = "Reserved bits not allowed.";
|
||||||
if ($mbIntEnc !== null) {
|
if ($mbIntEnc !== null) {
|
||||||
@@ -183,13 +185,13 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// NOTE: $mtime may be negative (PHP integer limitations)
|
// NOTE: $mtime may be negative (PHP integer limitations)
|
||||||
$mtime = unpack("V", substr($data,4,4));
|
$mtime = unpack("V", substr($data, 4, 4));
|
||||||
$mtime = $mtime[1];
|
$mtime = $mtime[1];
|
||||||
$xfl = substr($data,8,1);
|
$xfl = substr($data, 8, 1);
|
||||||
$os = substr($data,8,1);
|
$os = substr($data, 8, 1);
|
||||||
$headerlen = 10;
|
$headerlen = 10;
|
||||||
$extralen = 0;
|
$extralen = 0;
|
||||||
$extra = "";
|
$extra = "";
|
||||||
if ($flags & 4) {
|
if ($flags & 4) {
|
||||||
// 2-byte length prefixed EXTRA data in header
|
// 2-byte length prefixed EXTRA data in header
|
||||||
if ($len - $headerlen - 2 < 8) {
|
if ($len - $headerlen - 2 < 8) {
|
||||||
@@ -198,7 +200,7 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
}
|
}
|
||||||
return false; // invalid
|
return false; // invalid
|
||||||
}
|
}
|
||||||
$extralen = unpack("v",substr($data,8,2));
|
$extralen = unpack("v", substr($data, 8, 2));
|
||||||
$extralen = $extralen[1];
|
$extralen = $extralen[1];
|
||||||
if ($len - $headerlen - 2 - $extralen < 8) {
|
if ($len - $headerlen - 2 - $extralen < 8) {
|
||||||
if ($mbIntEnc !== null) {
|
if ($mbIntEnc !== null) {
|
||||||
@@ -206,7 +208,7 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
}
|
}
|
||||||
return false; // invalid
|
return false; // invalid
|
||||||
}
|
}
|
||||||
$extra = substr($data,10,$extralen);
|
$extra = substr($data, 10, $extralen);
|
||||||
$headerlen += 2 + $extralen;
|
$headerlen += 2 + $extralen;
|
||||||
}
|
}
|
||||||
$filenamelen = 0;
|
$filenamelen = 0;
|
||||||
@@ -219,14 +221,14 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
}
|
}
|
||||||
return false; // invalid
|
return false; // invalid
|
||||||
}
|
}
|
||||||
$filenamelen = strpos(substr($data,$headerlen),chr(0));
|
$filenamelen = strpos(substr($data, $headerlen), chr(0));
|
||||||
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
|
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
|
||||||
if ($mbIntEnc !== null) {
|
if ($mbIntEnc !== null) {
|
||||||
mb_internal_encoding($mbIntEnc);
|
mb_internal_encoding($mbIntEnc);
|
||||||
}
|
}
|
||||||
return false; // invalid
|
return false; // invalid
|
||||||
}
|
}
|
||||||
$filename = substr($data,$headerlen,$filenamelen);
|
$filename = substr($data, $headerlen, $filenamelen);
|
||||||
$headerlen += $filenamelen + 1;
|
$headerlen += $filenamelen + 1;
|
||||||
}
|
}
|
||||||
$commentlen = 0;
|
$commentlen = 0;
|
||||||
@@ -239,14 +241,14 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
}
|
}
|
||||||
return false; // invalid
|
return false; // invalid
|
||||||
}
|
}
|
||||||
$commentlen = strpos(substr($data,$headerlen),chr(0));
|
$commentlen = strpos(substr($data, $headerlen), chr(0));
|
||||||
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
|
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
|
||||||
if ($mbIntEnc !== null) {
|
if ($mbIntEnc !== null) {
|
||||||
mb_internal_encoding($mbIntEnc);
|
mb_internal_encoding($mbIntEnc);
|
||||||
}
|
}
|
||||||
return false; // Invalid header format
|
return false; // Invalid header format
|
||||||
}
|
}
|
||||||
$comment = substr($data,$headerlen,$commentlen);
|
$comment = substr($data, $headerlen, $commentlen);
|
||||||
$headerlen += $commentlen + 1;
|
$headerlen += $commentlen + 1;
|
||||||
}
|
}
|
||||||
$headercrc = "";
|
$headercrc = "";
|
||||||
@@ -258,8 +260,8 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
}
|
}
|
||||||
return false; // invalid
|
return false; // invalid
|
||||||
}
|
}
|
||||||
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
|
$calccrc = crc32(substr($data, 0, $headerlen)) & 0xffff;
|
||||||
$headercrc = unpack("v", substr($data,$headerlen,2));
|
$headercrc = unpack("v", substr($data, $headerlen, 2));
|
||||||
$headercrc = $headercrc[1];
|
$headercrc = $headercrc[1];
|
||||||
if ($headercrc != $calccrc) {
|
if ($headercrc != $calccrc) {
|
||||||
$error = "Header checksum failed.";
|
$error = "Header checksum failed.";
|
||||||
@@ -271,12 +273,12 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
$headerlen += 2;
|
$headerlen += 2;
|
||||||
}
|
}
|
||||||
// GZIP FOOTER
|
// GZIP FOOTER
|
||||||
$datacrc = unpack("V",substr($data,-8,4));
|
$datacrc = unpack("V", substr($data, -8, 4));
|
||||||
$datacrc = sprintf('%u',$datacrc[1] & 0xFFFFFFFF);
|
$datacrc = sprintf('%u', $datacrc[1] & 0xFFFFFFFF);
|
||||||
$isize = unpack("V",substr($data,-4));
|
$isize = unpack("V", substr($data, -4));
|
||||||
$isize = $isize[1];
|
$isize = $isize[1];
|
||||||
// decompression:
|
// decompression:
|
||||||
$bodylen = $len-$headerlen-8;
|
$bodylen = $len - $headerlen - 8;
|
||||||
if ($bodylen < 1) {
|
if ($bodylen < 1) {
|
||||||
// IMPLEMENTATION BUG!
|
// IMPLEMENTATION BUG!
|
||||||
if ($mbIntEnc !== null) {
|
if ($mbIntEnc !== null) {
|
||||||
@@ -284,28 +286,28 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$body = substr($data,$headerlen,$bodylen);
|
$body = substr($data, $headerlen, $bodylen);
|
||||||
$data = "";
|
$data = "";
|
||||||
if ($bodylen > 0) {
|
if ($bodylen > 0) {
|
||||||
switch ($method) {
|
switch ($method) {
|
||||||
case 8:
|
case 8:
|
||||||
// Currently the only supported compression method:
|
// Currently the only supported compression method:
|
||||||
$data = gzinflate($body,$maxlength);
|
$data = gzinflate($body, $maxlength);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$error = "Unknown compression method.";
|
$error = "Unknown compression method.";
|
||||||
if ($mbIntEnc !== null) {
|
if ($mbIntEnc !== null) {
|
||||||
mb_internal_encoding($mbIntEnc);
|
mb_internal_encoding($mbIntEnc);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} // zero-byte body content is allowed
|
} // zero-byte body content is allowed
|
||||||
// Verifiy CRC32
|
// Verifiy CRC32
|
||||||
$crc = sprintf("%u",crc32($data));
|
$crc = sprintf("%u", crc32($data));
|
||||||
$crcOK = $crc == $datacrc;
|
$crcOK = $crc == $datacrc;
|
||||||
$lenOK = $isize == strlen($data);
|
$lenOK = $isize == strlen($data);
|
||||||
if (!$lenOK || !$crcOK) {
|
if (!$lenOK || !$crcOK) {
|
||||||
$error = ( $lenOK ? '' : 'Length check FAILED. ') . ( $crcOK ? '' : 'Checksum FAILED.');
|
$error = ($lenOK ? '' : 'Length check FAILED. ') . ($crcOK ? '' : 'Checksum FAILED.');
|
||||||
$ret = false;
|
$ret = false;
|
||||||
}
|
}
|
||||||
$ret = $data;
|
$ret = $data;
|
||||||
@@ -313,4 +315,4 @@ function _phpman_gzdecode($data, &$filename='', &$error='', $maxlength=null)
|
|||||||
mb_internal_encoding($mbIntEnc);
|
mb_internal_encoding($mbIntEnc);
|
||||||
}
|
}
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
@@ -126,4 +126,4 @@ class JSMinTest extends TestCase
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -32,8 +32,11 @@ class JsClosureCompilerTest extends TestCase
|
|||||||
$this->compile($src);
|
$this->compile($src);
|
||||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||||
}
|
}
|
||||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
$this->assertInstanceOf(
|
||||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
'Minify_JS_ClosureCompiler_Exception',
|
||||||
|
$e,
|
||||||
|
'Throws Minify_JS_ClosureCompiler_Exception'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test maximum byte size check (default)
|
// Test maximum byte size check (default)
|
||||||
@@ -46,8 +49,11 @@ class JsClosureCompilerTest extends TestCase
|
|||||||
$this->compile($src);
|
$this->compile($src);
|
||||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||||
}
|
}
|
||||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
$this->assertInstanceOf(
|
||||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
'Minify_JS_ClosureCompiler_Exception',
|
||||||
|
$e,
|
||||||
|
'Throws Minify_JS_ClosureCompiler_Exception'
|
||||||
|
);
|
||||||
|
|
||||||
$expected = 'POST content larger than ' . Minify_JS_ClosureCompiler::DEFAULT_MAX_BYTES . ' bytes';
|
$expected = 'POST content larger than ' . Minify_JS_ClosureCompiler::DEFAULT_MAX_BYTES . ' bytes';
|
||||||
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
|
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
|
||||||
@@ -76,8 +82,11 @@ class JsClosureCompilerTest extends TestCase
|
|||||||
));
|
));
|
||||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||||
}
|
}
|
||||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
$this->assertInstanceOf(
|
||||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
'Minify_JS_ClosureCompiler_Exception',
|
||||||
|
$e,
|
||||||
|
'Throws Minify_JS_ClosureCompiler_Exception'
|
||||||
|
);
|
||||||
|
|
||||||
$expected = 'POST content larger than ' . $allowedBytes . ' bytes';
|
$expected = 'POST content larger than ' . $allowedBytes . ' bytes';
|
||||||
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
|
$this->assertEquals($expected, $e->getMessage(), 'Message must tell how big maximum byte size is');
|
||||||
@@ -96,8 +105,11 @@ class JsClosureCompilerTest extends TestCase
|
|||||||
));
|
));
|
||||||
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
} catch (Minify_JS_ClosureCompiler_Exception $e) {
|
||||||
}
|
}
|
||||||
$this->assertInstanceOf('Minify_JS_ClosureCompiler_Exception', $e,
|
$this->assertInstanceOf(
|
||||||
'Throws Minify_JS_ClosureCompiler_Exception');
|
'Minify_JS_ClosureCompiler_Exception',
|
||||||
|
$e,
|
||||||
|
'Throws Minify_JS_ClosureCompiler_Exception'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function test7()
|
public function test7()
|
||||||
|
@@ -6,7 +6,9 @@ use Minify_HTML_Helper;
|
|||||||
|
|
||||||
class LessSourceTest extends TestCase
|
class LessSourceTest extends TestCase
|
||||||
{
|
{
|
||||||
public function setUp()
|
public string $realDocRoot;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||||
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
||||||
@@ -39,4 +41,4 @@ class LessSourceTest extends TestCase
|
|||||||
|
|
||||||
$this->assertEquals("/min/g=less&{$max}", $res);
|
$this->assertEquals("/min/g=less&{$max}", $res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,4 +25,4 @@ class MinifyBuildTest extends TestCase
|
|||||||
$this->assertEquals($b->uri('/path'), "/path?{$maxTime}", 'uri() with no querystring');
|
$this->assertEquals($b->uri('/path'), "/path?{$maxTime}", 'uri() with no querystring');
|
||||||
$this->assertEquals($b->uri('/path?hello'), "/path?hello&{$maxTime}", 'uri() with existing querystring');
|
$this->assertEquals($b->uri('/path?hello'), "/path?hello&{$maxTime}", 'uri() with existing querystring');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@ use Minify_CSS_UriRewriter;
|
|||||||
|
|
||||||
class MinifyCSSUriRewriterTest extends TestCase
|
class MinifyCSSUriRewriterTest extends TestCase
|
||||||
{
|
{
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
Minify_CSS_UriRewriter::$debugText = '';
|
Minify_CSS_UriRewriter::$debugText = '';
|
||||||
}
|
}
|
||||||
@@ -16,9 +16,10 @@ class MinifyCSSUriRewriterTest extends TestCase
|
|||||||
$in = file_get_contents(self::$test_files . '/css_uriRewriter/in.css');
|
$in = file_get_contents(self::$test_files . '/css_uriRewriter/in.css');
|
||||||
$expected = file_get_contents(self::$test_files . '/css_uriRewriter/exp.css');
|
$expected = file_get_contents(self::$test_files . '/css_uriRewriter/exp.css');
|
||||||
$actual = Minify_CSS_UriRewriter::rewrite(
|
$actual = Minify_CSS_UriRewriter::rewrite(
|
||||||
$in
|
$in,
|
||||||
, self::$test_files . '/css_uriRewriter' // currentDir
|
self::$test_files . '/css_uriRewriter' // currentDir
|
||||||
, self::$document_root // use DOCUMENT_ROOT = '/full/path/to/min_unit_tests'
|
,
|
||||||
|
self::$document_root // use DOCUMENT_ROOT = '/full/path/to/min_unit_tests'
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals($expected, $actual, 'rewrite, debug: ' . Minify_CSS_UriRewriter::$debugText);
|
$this->assertEquals($expected, $actual, 'rewrite, debug: ' . Minify_CSS_UriRewriter::$debugText);
|
||||||
@@ -47,9 +48,9 @@ class MinifyCSSUriRewriterTest extends TestCase
|
|||||||
$in = '../../../../assets/skins/sam/sprite.png';
|
$in = '../../../../assets/skins/sam/sprite.png';
|
||||||
$exp = '/yui/assets/skins/sam/sprite.png';
|
$exp = '/yui/assets/skins/sam/sprite.png';
|
||||||
$actual = Minify_CSS_UriRewriter::rewriteRelative(
|
$actual = Minify_CSS_UriRewriter::rewriteRelative(
|
||||||
$in
|
$in,
|
||||||
, 'sf_root_dir\web\yui\menu\assets\skins\sam'
|
'sf_root_dir\web\yui\menu\assets\skins\sam',
|
||||||
, 'sf_root_dir\web'
|
'sf_root_dir\web'
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals($exp, $actual, 'Issue 99, debug: ' . Minify_CSS_UriRewriter::$debugText);
|
$this->assertEquals($exp, $actual, 'Issue 99, debug: ' . Minify_CSS_UriRewriter::$debugText);
|
||||||
|
@@ -6,10 +6,9 @@ use Minify_Cache_APC;
|
|||||||
|
|
||||||
class MinifyCacheAPCTest extends TestCase
|
class MinifyCacheAPCTest extends TestCase
|
||||||
{
|
{
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
if (!function_exists('apc_store')) {
|
if (!function_exists('apc_store')) {
|
||||||
// FIXME: is APCu extension ok too?
|
|
||||||
$this->markTestSkipped("To test this component, install APC extension");
|
$this->markTestSkipped("To test this component, install APC extension");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,4 +21,4 @@ class MinifyCacheAPCTest extends TestCase
|
|||||||
$cache = new Minify_Cache_APC();
|
$cache = new Minify_Cache_APC();
|
||||||
$this->assertTestCache($cache, $id, $data);
|
$this->assertTestCache($cache, $id, $data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
tests/MinifyCacheAPCuTest.php
Normal file
25
tests/MinifyCacheAPCuTest.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Minify\Test;
|
||||||
|
|
||||||
|
use Minify_Cache_APCu;
|
||||||
|
|
||||||
|
class MinifyCacheAPCuTest extends TestCase
|
||||||
|
{
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
if (!function_exists('apcu_store')) {
|
||||||
|
$this->markTestSkipped("To test this component, install APCu extension");
|
||||||
|
}
|
||||||
|
ini_set('apc.enable_cli', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test1()
|
||||||
|
{
|
||||||
|
$data = str_repeat(md5(time()) . 'í', 100); // 3400 bytes in UTF-8
|
||||||
|
$id = 'Minify_test_cache';
|
||||||
|
|
||||||
|
$cache = new Minify_Cache_APCu();
|
||||||
|
$this->assertTestCache($cache, $id, $data);
|
||||||
|
}
|
||||||
|
}
|
@@ -10,7 +10,7 @@ class MinifyCacheMemcacheTest extends TestCase
|
|||||||
/** @var Memcache */
|
/** @var Memcache */
|
||||||
private $mc;
|
private $mc;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
if (!function_exists('memcache_set')) {
|
if (!function_exists('memcache_set')) {
|
||||||
$this->markTestSkipped("To test this component, install memcache in PHP");
|
$this->markTestSkipped("To test this component, install memcache in PHP");
|
||||||
@@ -45,4 +45,3 @@ class MinifyCacheMemcacheTest extends TestCase
|
|||||||
$this->assertTestCache($cache, $id, $data);
|
$this->assertTestCache($cache, $id, $data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ use Minify_Cache_WinCache;
|
|||||||
|
|
||||||
class MinifyCacheWinCacheTest extends TestCase
|
class MinifyCacheWinCacheTest extends TestCase
|
||||||
{
|
{
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
if (!function_exists('wincache_ucache_info')) {
|
if (!function_exists('wincache_ucache_info')) {
|
||||||
$this->markTestSkipped("To test this component, install WinCache extension");
|
$this->markTestSkipped("To test this component, install WinCache extension");
|
||||||
@@ -21,4 +21,4 @@ class MinifyCacheWinCacheTest extends TestCase
|
|||||||
$cache = new Minify_Cache_WinCache();
|
$cache = new Minify_Cache_WinCache();
|
||||||
$this->assertTestCache($cache, $id, $data);
|
$this->assertTestCache($cache, $id, $data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@ use Minify_Cache_ZendPlatform;
|
|||||||
|
|
||||||
class MinifyCacheZendPlatformTest extends TestCase
|
class MinifyCacheZendPlatformTest extends TestCase
|
||||||
{
|
{
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
if (!function_exists('output_cache_put')) {
|
if (!function_exists('output_cache_put')) {
|
||||||
// FIXME: be specific what to actually install
|
// FIXME: be specific what to actually install
|
||||||
@@ -22,4 +22,4 @@ class MinifyCacheZendPlatformTest extends TestCase
|
|||||||
$cache = new Minify_Cache_ZendPlatform();
|
$cache = new Minify_Cache_ZendPlatform();
|
||||||
$this->assertTestCache($cache, $id, $data);
|
$this->assertTestCache($cache, $id, $data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,7 +7,7 @@ use Minify_ClosureCompiler;
|
|||||||
|
|
||||||
class MinifyClosureCompilerTest extends TestCase
|
class MinifyClosureCompilerTest extends TestCase
|
||||||
{
|
{
|
||||||
public static function setupBeforeClass()
|
public static function setupBeforeClass(): void
|
||||||
{
|
{
|
||||||
parent::setupBeforeClass();
|
parent::setupBeforeClass();
|
||||||
Minify_ClosureCompiler::$isDebug = true;
|
Minify_ClosureCompiler::$isDebug = true;
|
||||||
|
@@ -31,4 +31,4 @@ class MinifyCommentPreserverTest extends TestCase
|
|||||||
++$callCount;
|
++$callCount;
|
||||||
return $callCount . strtoupper($content);
|
return $callCount . strtoupper($content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,14 +9,14 @@ class MinifyHTMLHelperTest extends TestCase
|
|||||||
{
|
{
|
||||||
private $realDocRoot;
|
private $realDocRoot;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||||
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this is probably not needed if backupGlobals is enabled?
|
// TODO: this is probably not needed if backupGlobals is enabled?
|
||||||
public function tearDown()
|
public function tearDown(): void
|
||||||
{
|
{
|
||||||
$_SERVER['DOCUMENT_ROOT'] = $this->realDocRoot;
|
$_SERVER['DOCUMENT_ROOT'] = $this->realDocRoot;
|
||||||
}
|
}
|
||||||
@@ -43,13 +43,16 @@ class MinifyHTMLHelperTest extends TestCase
|
|||||||
$this->assertEquals($expected, $actual, 'non-existent group & debug');
|
$this->assertEquals($expected, $actual, 'non-existent group & debug');
|
||||||
|
|
||||||
$expected = "/myApp/min/?g=css&{$maxTime}";
|
$expected = "/myApp/min/?g=css&{$maxTime}";
|
||||||
$actual = Minify_HTML_Helper::getUri('css', array(
|
$actual = Minify_HTML_Helper::getUri(
|
||||||
'rewriteWorks' => false
|
'css',
|
||||||
,
|
array(
|
||||||
'minAppUri' => '/myApp/min/'
|
'rewriteWorks' => false
|
||||||
,
|
,
|
||||||
'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
|
'minAppUri' => '/myApp/min/'
|
||||||
));
|
,
|
||||||
|
'groupsConfigFile' => self::$test_files . '/htmlHelper_groupsConfig.php'
|
||||||
|
)
|
||||||
|
);
|
||||||
$this->assertEquals($expected, $actual, 'existing group');
|
$this->assertEquals($expected, $actual, 'existing group');
|
||||||
|
|
||||||
|
|
||||||
@@ -58,26 +61,33 @@ class MinifyHTMLHelperTest extends TestCase
|
|||||||
require_once $utilsFile;
|
require_once $utilsFile;
|
||||||
|
|
||||||
$fiveSecondsAgo = $_SERVER['REQUEST_TIME'] - 5;
|
$fiveSecondsAgo = $_SERVER['REQUEST_TIME'] - 5;
|
||||||
$obj = new Minify_Source(array(
|
$obj = new Minify_Source(
|
||||||
'id' => '1',
|
array(
|
||||||
'content' => '1',
|
'id' => '1',
|
||||||
'lastModified' => $fiveSecondsAgo,
|
'content' => '1',
|
||||||
));
|
'lastModified' => $fiveSecondsAgo,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
$output = Minify_mtime(array($uri1, $uri2, $obj));
|
$output = Minify_mtime(array($uri1, $uri2, $obj));
|
||||||
$this->assertEquals($fiveSecondsAgo, $output, 'utils.php : Minify_mtime w/ files & obj');
|
$this->assertEquals($fiveSecondsAgo, $output, 'utils.php : Minify_mtime w/ files & obj');
|
||||||
|
|
||||||
$obj = new Minify_Source(array(
|
$obj = new Minify_Source(
|
||||||
'id' => '2',
|
array(
|
||||||
'content' => '2',
|
'id' => '2',
|
||||||
'lastModified' => strtotime('2000-01-01'),
|
'content' => '2',
|
||||||
));
|
'lastModified' => strtotime('2000-01-01'),
|
||||||
$output = Minify_mtime(array(
|
)
|
||||||
$obj
|
);
|
||||||
,
|
$output = Minify_mtime(
|
||||||
'css'
|
array(
|
||||||
), self::$test_files . '/htmlHelper_groupsConfig.php');
|
$obj
|
||||||
|
,
|
||||||
|
'css'
|
||||||
|
),
|
||||||
|
self::$test_files . '/htmlHelper_groupsConfig.php'
|
||||||
|
);
|
||||||
$this->assertEquals($maxTime, $output, 'utils.php : Minify_mtime w/ obj & group');
|
$this->assertEquals($maxTime, $output, 'utils.php : Minify_mtime w/ obj & group');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,7 +23,10 @@ class MinifyImportProcessorTest extends TestCase
|
|||||||
realpath($linDir . '/lib/css/example.css'),
|
realpath($linDir . '/lib/css/example.css'),
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals($expectedIncludes, Minify_ImportProcessor::$filesIncluded,
|
$this->assertEquals(
|
||||||
'included right files in right order');
|
$expectedIncludes,
|
||||||
|
Minify_ImportProcessor::$filesIncluded,
|
||||||
|
'included right files in right order'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,7 @@ use Minify_NailgunClosureCompiler;
|
|||||||
|
|
||||||
class MinifyNailgunClosureCompilerTest extends TestCase
|
class MinifyNailgunClosureCompilerTest extends TestCase
|
||||||
{
|
{
|
||||||
public static function setupBeforeClass()
|
public static function setupBeforeClass(): void
|
||||||
{
|
{
|
||||||
parent::setupBeforeClass();
|
parent::setupBeforeClass();
|
||||||
Minify_ClosureCompiler::$isDebug = true;
|
Minify_ClosureCompiler::$isDebug = true;
|
||||||
@@ -54,4 +54,4 @@ class MinifyNailgunClosureCompilerTest extends TestCase
|
|||||||
$this->markTestSkipped($e->getMessage());
|
$this->markTestSkipped($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -62,8 +62,8 @@ class MinifyTest extends TestCase
|
|||||||
|
|
||||||
$content = preg_replace('/\\r\\n?/', "\n", file_get_contents($minifyTestPath . '/minified.js'));
|
$content = preg_replace('/\\r\\n?/', "\n", file_get_contents($minifyTestPath . '/minified.js'));
|
||||||
$lastModified = max(
|
$lastModified = max(
|
||||||
filemtime($minifyTestPath . '/email.js')
|
filemtime($minifyTestPath . '/email.js'),
|
||||||
, filemtime($minifyTestPath . '/QueryString.js')
|
filemtime($minifyTestPath . '/QueryString.js')
|
||||||
);
|
);
|
||||||
$expected = array(
|
$expected = array(
|
||||||
'success' => true,
|
'success' => true,
|
||||||
@@ -153,8 +153,10 @@ class MinifyTest extends TestCase
|
|||||||
));
|
));
|
||||||
$output = $output['content'];
|
$output = $output['content'];
|
||||||
|
|
||||||
$this->assertFalse(strpos($output, $defaultOptions['importWarning']),
|
$this->assertFalse(
|
||||||
'Issue 89 : don\'t warn about valid imports');
|
strpos($output, $defaultOptions['importWarning']),
|
||||||
|
'Issue 89 : don\'t warn about valid imports'
|
||||||
|
);
|
||||||
|
|
||||||
// Test Issue 132
|
// Test Issue 132
|
||||||
if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
|
if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
|
||||||
@@ -164,8 +166,11 @@ class MinifyTest extends TestCase
|
|||||||
'encodeOutput' => false,
|
'encodeOutput' => false,
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->assertEquals(77, $output['headers']['Content-Length'],
|
$this->assertEquals(
|
||||||
'Issue 132 : mbstring.func_overload shouldn\'t cause incorrect Content-Length');
|
77,
|
||||||
|
$output['headers']['Content-Length'],
|
||||||
|
'Issue 132 : mbstring.func_overload shouldn\'t cause incorrect Content-Length'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test minifying CSS and responding with Etag/Last-Modified
|
// Test minifying CSS and responding with Etag/Last-Modified
|
||||||
|
@@ -7,7 +7,7 @@ use Minify_YUICompressor;
|
|||||||
|
|
||||||
class MinifyYuiCSSTest extends TestCase
|
class MinifyYuiCSSTest extends TestCase
|
||||||
{
|
{
|
||||||
public static function setupBeforeClass()
|
public static function setupBeforeClass(): void
|
||||||
{
|
{
|
||||||
parent::setupBeforeClass();
|
parent::setupBeforeClass();
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ class MinifyYuiCSSTest extends TestCase
|
|||||||
Minify_YUICompressor::$tempDir = sys_get_temp_dir();
|
Minify_YUICompressor::$tempDir = sys_get_temp_dir();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setUp()
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
$this->assertHasJar();
|
$this->assertHasJar();
|
||||||
}
|
}
|
||||||
@@ -60,4 +60,4 @@ class MinifyYuiCSSTest extends TestCase
|
|||||||
$this->markTestSkipped($e->getMessage());
|
$this->markTestSkipped($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,9 @@ use Minify_HTML_Helper;
|
|||||||
|
|
||||||
class ScssSourceTest extends TestCase
|
class ScssSourceTest extends TestCase
|
||||||
{
|
{
|
||||||
public function setUp()
|
public string $realDocRoot;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
$this->realDocRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||||
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
$_SERVER['DOCUMENT_ROOT'] = self::$document_root;
|
||||||
@@ -39,4 +41,4 @@ class ScssSourceTest extends TestCase
|
|||||||
|
|
||||||
$this->assertEquals("/min/g=scss&{$max}", $res);
|
$this->assertEquals("/min/g=scss&{$max}", $res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,7 +11,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
|
|||||||
/** @var string */
|
/** @var string */
|
||||||
protected static $test_files;
|
protected static $test_files;
|
||||||
|
|
||||||
public static function setupBeforeClass()
|
public static function setupBeforeClass(): void
|
||||||
{
|
{
|
||||||
self::$document_root = __DIR__;
|
self::$document_root = __DIR__;
|
||||||
self::$test_files = __DIR__ . '/_test_files';
|
self::$test_files = __DIR__ . '/_test_files';
|
||||||
@@ -25,7 +25,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
|
|||||||
*/
|
*/
|
||||||
protected function countBytes($str)
|
protected function countBytes($str)
|
||||||
{
|
{
|
||||||
return (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2))
|
return (function_exists('mb_strlen') && ((int) ini_get('mbstring.func_overload') & 2))
|
||||||
? mb_strlen($str, '8bit')
|
? mb_strlen($str, '8bit')
|
||||||
: strlen($str);
|
: strlen($str);
|
||||||
}
|
}
|
||||||
@@ -70,4 +70,4 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase
|
|||||||
|
|
||||||
return $contents;
|
return $contents;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,6 +9,11 @@
|
|||||||
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design." />
|
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design." />
|
||||||
<meta name="robots" content="all" />
|
<meta name="robots" content="all" />
|
||||||
<title>css Zen Garden: The Beauty in CSS Design</title>
|
<title>css Zen Garden: The Beauty in CSS Design</title>
|
||||||
|
<!--# if expr="$HTTP_COOKIE=/minify\=1/" -->
|
||||||
|
<meta name="generator" content="minify-cookie" />
|
||||||
|
<!--# else -->
|
||||||
|
<meta name="generator" content="minify-no-cookie" />
|
||||||
|
<!--# endif -->
|
||||||
|
|
||||||
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
|
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
@@ -63,11 +68,11 @@ css hack {
|
|||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<link
|
<link
|
||||||
rel="Shortcut Icon"
|
rel="Shortcut Icon"
|
||||||
type="image/x-icon"
|
type="image/x-icon"
|
||||||
href="http://www.csszengarden.com/favicon.ico" />
|
href="http://www.csszengarden.com/favicon.ico" />
|
||||||
<link
|
<link
|
||||||
rel="alternate"
|
rel="alternate"
|
||||||
type="application/rss+xml"
|
type="application/rss+xml"
|
||||||
title="RSS"
|
title="RSS"
|
||||||
@@ -78,7 +83,7 @@ css hack {
|
|||||||
<div id="container">
|
<div id="container">
|
||||||
<div id="pageHeader">
|
<div id="pageHeader">
|
||||||
<h1><span>css Zen Garden</span></h1>
|
<h1><span>css Zen Garden</span></h1>
|
||||||
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
|
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
|
||||||
Design</span></h2>
|
Design</span></h2>
|
||||||
</div>
|
</div>
|
||||||
<pre>
|
<pre>
|
||||||
|
@@ -4,7 +4,12 @@ http-equiv="content-type" content="text/html; charset=iso-8859-1" /><meta
|
|||||||
name="author" content="Dave Shea" /><meta
|
name="author" content="Dave Shea" /><meta
|
||||||
name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display" /><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="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> <script type="text/javascript">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'}
|
name="robots" content="all" /><title>css Zen Garden: The Beauty in CSS Design</title>
|
||||||
|
<!--# if expr="$HTTP_COOKIE=/minify\=1/" --><meta
|
||||||
|
name="generator" content="minify-cookie" />
|
||||||
|
<!--# else --><meta
|
||||||
|
name="generator" content="minify-no-cookie" />
|
||||||
|
<!--# endif --> <script type="text/javascript">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;}
|
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)
|
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">i=1;</script> <script type="text/javascript">/*<![CDATA[*/(i<1);/*]]>*/</script> <!--[if IE 6]><style type="text/css">/*<![CDATA[*//*! copyright: you'll need CDATA for this < & */
|
{}/*]]>*/</script> <script type="text/javascript">i=1;</script> <script type="text/javascript">/*<![CDATA[*/(i<1);/*]]>*/</script> <!--[if IE 6]><style type="text/css">/*<![CDATA[*//*! copyright: you'll need CDATA for this < & */
|
||||||
|
@@ -9,6 +9,11 @@
|
|||||||
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design.">
|
<meta name="description" content="A demonstration of what can be accomplished visually through CSS-based design.">
|
||||||
<meta name="robots" content="all">
|
<meta name="robots" content="all">
|
||||||
<title>css Zen Garden: The Beauty in CSS Design</title>
|
<title>css Zen Garden: The Beauty in CSS Design</title>
|
||||||
|
<!--# if expr="$HTTP_COOKIE=/minify\=1/" -->
|
||||||
|
<meta name="generator" content="minify-cookie" />
|
||||||
|
<!--# else -->
|
||||||
|
<meta name="generator" content="minify-no-cookie" />
|
||||||
|
<!--# endif -->
|
||||||
|
|
||||||
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
|
<!-- to correct the unsightly Flash of Unstyled Content. http://www.bluerobot.com/web/css/fouc.asp -->
|
||||||
<script type="text/javascript"><!--
|
<script type="text/javascript"><!--
|
||||||
@@ -61,11 +66,11 @@ css hack {
|
|||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<link
|
<link
|
||||||
rel="Shortcut Icon"
|
rel="Shortcut Icon"
|
||||||
type="image/x-icon"
|
type="image/x-icon"
|
||||||
href="http://www.csszengarden.com/favicon.ico">
|
href="http://www.csszengarden.com/favicon.ico">
|
||||||
<link
|
<link
|
||||||
rel="alternate"
|
rel="alternate"
|
||||||
type="application/rss+xml"
|
type="application/rss+xml"
|
||||||
title="RSS"
|
title="RSS"
|
||||||
@@ -76,7 +81,7 @@ css hack {
|
|||||||
<div id="container">
|
<div id="container">
|
||||||
<div id="pageHeader">
|
<div id="pageHeader">
|
||||||
<h1><span>css Zen Garden</span></h1>
|
<h1><span>css Zen Garden</span></h1>
|
||||||
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
|
<h2><span>The Beauty of <acronym title="Cascading Style Sheets">CSS</acronym>
|
||||||
Design</span></h2>
|
Design</span></h2>
|
||||||
</div>
|
</div>
|
||||||
<pre>
|
<pre>
|
||||||
|
@@ -4,7 +4,12 @@ http-equiv="content-type" content="text/html; charset=iso-8859-1"><meta
|
|||||||
name="author" content="Dave Shea"><meta
|
name="author" content="Dave Shea"><meta
|
||||||
name="keywords" content="design, css, cascading, style, sheets, xhtml, graphic design, w3c, web standards, visual, display"><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="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> <script type="text/javascript">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'}
|
name="robots" content="all"><title>css Zen Garden: The Beauty in CSS Design</title>
|
||||||
|
<!--# if expr="$HTTP_COOKIE=/minify\=1/" --><meta
|
||||||
|
name="generator" content="minify-cookie" />
|
||||||
|
<!--# else --><meta
|
||||||
|
name="generator" content="minify-no-cookie" />
|
||||||
|
<!--# endif --> <script type="text/javascript">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;}
|
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">var i=0;while(++i<10)
|
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}</script> <script type="text/javascript">var i=0;while(++i<10)
|
||||||
{}</script> <script type="text/javascript">i=1;</script> <script type="text/javascript">(i<1);</script> <!--[if IE 6]><style type="text/css">/*! copyright: you'll need CDATA for this < & */
|
{}</script> <script type="text/javascript">i=1;</script> <script type="text/javascript">(i<1);</script> <!--[if IE 6]><style type="text/css">/*! copyright: you'll need CDATA for this < & */
|
||||||
|
@@ -48,7 +48,7 @@ function Minify_getUri($keyOrFiles, $opts = array())
|
|||||||
*
|
*
|
||||||
* Since this makes a bunch of stat() calls, you might not want to check this
|
* Since this makes a bunch of stat() calls, you might not want to check this
|
||||||
* on every request.
|
* on every request.
|
||||||
*
|
*
|
||||||
* @param array $keysAndFiles group keys and/or file paths/URIs.
|
* @param array $keysAndFiles group keys and/or file paths/URIs.
|
||||||
* @return int latest modification time of all given keys/files
|
* @return int latest modification time of all given keys/files
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user